Citibike Ridership Dashboard
Live app: Citibike Ridership Streamlit App
Github Repo: View on GitHub
**Project Goal**
Analyzes the relationship between daily NYC weather conditions and Citibike ridership trends (2013–2018) to build a predictive linear regression model and an interactive web application, using public Citibike and NOAA datasets hosted on Google BigQuery.
**Individual Contribution**
End-to-end ownership: data ingestion, modeling, frontend UI, and cloud deployment automation.
Data pipeline: Wrote SQL to extract and join public Citibike and NOAA weather datasets from BigQuery, cleaned/preprocessed the data in pandas, and engineered calendar and weather features
Modeling: Trained and evaluated a linear regression model in scikit-learn, handling missing-value edge cases (a 99.99 precipitation missing-value marker) and performing residual analysis
Application: Built the interactive Streamlit dashboard using DuckDB for in-process BigQuery querying, plus a GitHub Actions CI/CD workflow with headless Selenium to keep the app active
Results
Test R² = 0.6686 (training R² = 0.7394) — temperature, precipitation, wind speed, day of week, and year together explain ~67% of the variance in daily ridership
Temperature was the strongest positive predictor of ridership; Precipitation showed a strong inverse relationship
Identified a 4-month data gap in early 2017 in the primary dataset — a known limitation flagged for future investigation

Handling a real data quality issue
One data point had a 99.99 precipitation value — a common government-dataset convention for “missing,” not an actual measurement.
Out of 1,610 rows, I converted it to NaN and dropped that single row during preprocessing rather than let it distort the model.
Tech Stack
Python · Streamlit · DuckDB (community BigQuery extension) · google-cloud-bigquery · scikit-learn · pandas · GitHub Actions · Selenium
The app stays awake on Streamlit’s free tier via a GitHub Actions workflow that pings it every 7 hours using headless Selenium.