DoluMu
How crowded will my train be? Hour-by-hour crowding forecasts for Istanbul's metro, Marmaray, Metrobüs, buses and ferries, on the web and on iPhone.


The problem
Istanbul publishes hourly ridership for its lines as open data, but a data file does not answer the question you have on the platform: is my line busy right now, and is it worth waiting an hour?
What I built
A forecasting pipeline. A Polars pipeline joins hourly ridership with weather and calendar data into lag and rolling features, with validation and fallbacks. One LightGBM model covers hundreds of lines, and new forecasts are scored every night.
An API and two apps. FastAPI and PostgreSQL serve the forecasts. On top sit a web app and a native iPhone app with a network map, a page per line and a quieter hour to wait for. Each line's crowding is measured against its own busiest hour of the day.
What happened
The model reaches about 85% volume-weighted accuracy and about 75% lower error (MAE) than the lag baselines. DoluMu started as my graduation thesis; the iPhone app has been on the Turkish App Store since October 2026.
Stack
Python · Polars · LightGBM · FastAPI · PostgreSQL · Docker · Next.js · Expo