case study · personal project
Citibike Data Platform
A batch and streaming platform over NYC's Citibike system — combining historical trip data with the public real-time station feed to power rider segmentation, rebalancing signals, and live station monitoring.
The Problem
Citibike publishes historical trip records for batch analysis and a live GBFS feed for real-time station status — two very different shapes of data with two very different freshness requirements. Rebalancing decisions need both: slow-moving demand patterns from history, and up-to-the-minute station state from the feed.
Architecture
GBFS Feed
Realtime Station Status
Kafka
Streaming Ingestion
Airflow
Orchestration
Snowflake + dbt
Batch Transform
Marts
Segmentation & Demand
The GBFS feed streams through Kafka for near-real-time station status, while Airflow orchestrates scheduled batch loads of historical trip data into Snowflake. dbt models both paths into the same warehouse — segmentation and demand marts from the batch side, live station state from the streaming side.
What It Does
Rider Segmentation
Batch models over historical trip data group riders by usage pattern to inform product and rebalancing decisions.
Hourly Demand Patterns
Aggregated demand-by-hour marts surface when and where bikes run out, feeding rebalancing operations.
Real-Time Station Monitoring
A streaming path over the public GBFS feed tracks station status as it changes, independent of the nightly batch loads.