One train keeps losing time between 42 St and 34 St.
Each row is a station and time runs left to right, so every diagonal is one downtown train. The bright one slows on a single stretch, but nothing in the train data says why.
Track maintenance keeps the subway running, but trains slow down as they pass a work zone. Work orders and train movements lived in separate systems, so no one could say which work locations and times cost the most service.
I joined the two datasets on track, time, and location, measured the extra running time against typical times for the same segment, direction, and hour, and automated the pipeline with Airflow and Spark SQL so teams can refresh it daily. The results describe observed additional train running time, not passenger hours or time saved after a schedule change.
- ≈64 sec
- additional running time per affected segment
- ≈58 h
- additional train running time on one corridor over three months
- 6M × 490K
- arrivals matched to work orders