Zurich Tram Data

Vom Rohdaten-Archiv zum Master-Datensatz
Data-Engineering-Pipeline für das Zürcher Tramnetz (VBZ) | 2023–2025

Der ganze Weg

Von 38 GB Rohdaten zum Master: Genese, Motivation, Reduktion, Anreicherung, Vereinigung — vollständig erzählt. Portfolio-Vollansicht.

38 GB
IST-Rohdaten, schweizweit
94,4 M
Halt-Ereignisse im Master
26
Spalten aus 5 Quellen
9
reproduzierbare Notebooks
Agenda

Inhaltsübersicht

Von der Projektgenese bis zum Ausblick

1Genese & Motivation
2Ausgangssituation
3Daten Reduktion
4Daten Anreicherung
5Daten Zusammenführung
6Masterdatensatz als Resultat
7Limitierungen
8Ausblick
Genese & Motivation

Data Science Abschlussarbeit

Projektsuche zum Ende der Fortbildung

Dieses Projekt entstand als Abschlussarbeit einer Data-Science-Fortbildung — der Rahmen war bewusst offen: nicht welches Modell, sondern welches Thema war die große Herausforderung.
Gesucht war ein Thema, an dem sich Data Science nicht abstrakt anfühlt, sondern an einem Alltagsbeispiel mit echtem Impact nachvollziehbar wird.
Genese & Motivation

Persönliche Motivation

Ein datengetriebenes Thema mit gesellschaftlicher Relevanz

Daten sollen sinnstiftend eingesetzt werden — mit greifbarem Bezug zum Alltag, zur Lebensqualität, im besten Fall zur Nachhaltigkeit.
Öffentlicher Verkehr trifft das genau: täglich erlebbar, gesellschaftlich relevant, datenreich. Die Recherche führte über den ÖPNV nach Zürich.
Ausgangssituation

Warum ÖPNV in Zürich

Zürichs Open-Data-Ökosystem als Grundlage für reproduzierbare Analysen

Zürich betreibt eine außergewöhnlich gute Open-Data-Landschaft für sein Tramnetz (VBZ) — frei zugänglich, gut dokumentiert, granular genug für echte Analyse.
Auch die Recherche nach ergänzenden Zürcher Datenquellen (Wetter, Events, Geografie) war vielversprechend. Das war der Startpunkt des Projekts.
Ausgangssituation

Der Projektrahmen

Zielsetzung, Scope und Einordnung im Data-Lifecycle

Ziel
  • Ein einziger, sauberer Master-Datensatz der realen VBZ-Tram-Halte
  • Angereichert mit Fahrplan, Wetter, Events und Geografie
Fokus
  • Der Weg dorthin: Recherche · Filterung · Zusammenführung · Qualitätssicherung
  • Bewusst nicht Modellierung
Einordnung
  • Data-Engineering-Grundlage für zh-tram-flow (Analyse & Verspätungsvorhersage)
Ausgangssituation

Vom Ziel zur Aufgabe

Aufbau einer integrierten, analysefähigen Datengrundlage

Einen Datensatz bauen, mit dem eine sinnvolle, qualitativ belastbare Analyse des Zürcher Tramnetzes überhaupt erst möglich wird.
Der Leitgedanke dahinter: reduzieren was da ist, anreichern was fehlt.
Ausgangssituation

Die Datenstrategie

Zusammenführung der fünf Datenquellen zu einem reproduzierbaren Master-Datensatz

Gesamte Datenpipeline
Daten Reduktion

Schweiz ÖPNV IST-Daten

38 GB schweizweite Ist-Daten als Ausgangsvolumen

38 GB
komprimierte Archiv-ZIPs
~400
Transportunternehmen CH
5
Verkehrsmittel-Arten
Die IST-Rohdaten beschreiben den gesamten öffentlichen Verkehr der Schweiz — jeder Zug, Bus, jedes Tram, Schiff, jede Seilbahn. Relevant ist ein schmaler Ausschnitt: VBZ Tram Zürich.
Daten Reduktion

Polars statt Pandas

Werkzeugwahl per Benchmark auf dem realen Datenvolumen

PandasPolarsFaktor
Ladezeit (alle Parquets)25,7 s6,6 s~4×
RAM-Verbrauch6,1 GB~1,4 GB~4×
Entscheidung: Polars für alle großen Operationen (IST, Merge). Pandas bleibt für kleine Quellen (GTFS/Meteo/Events) und als Lernreferenz.
Daten Reduktion

Auf VBZ Tram

Regelbasierte Filterung von ~400 Betreibern auf das VBZ-Tramnetz

1
Betreiber & Produkt

~400 CH-Unternehmen → BETREIBER_ID 85:3849 (VBZ), PRODUKT_ID = Tram

2
Zeitraum & Format

2023–2025, nur Format v1 (v2 ab Mitte 2025 ausgeklammert)

3
Messqualität

nur REAL-GPS-Messungen; Durchfahrten & Zusatzfahrten raus

4
Ausfälle behalten

FAELLT_AUS_TF = true bewusst drin — extremster Verspätungsfall

5
Spalten

21 Rohfelder → 10 (KEEP_COLS); Delays & stop_sequence abgeleitet

~11 % der Zeilen entfernt — übrig bleiben echte, planmäßige Halte mit GPS-Zeitstempeln, plus alle Ausfälle.
Daten Anreicherung

Warum anreichern

Kontextdaten machen Verspätung erst erklärbar

Fahrplan (GTFS)
Wetter (Meteo)
Events
Stadtkreise (Geo)
Ein Tram-Halt mit einer Verspätungszahl erklärt für sich genommen wenig. Erst der Kontext — Fahrplan, Wetter, Events, Geografie — macht Verspätung nachvollziehbar.
Also: vier gezielt recherchierte Zusatzquellen identifizieren und in den Master integrieren.
Daten Anreicherung

Fahrplan (GTFS)

Soll-Fahrplan und Haltestellen-Stammdaten aus dem ZVV-Netz

Fahrplan (GTFS)
Wetter (Meteo)
Events
Stadtkreise (Geo)
Woher
  • data.stadt-zuerich.ch · ZIP/TXT · CC0
  • 3 Jahrgänge, gesamtes ZVV-Netz
Was zu tun
  • Auf VBZ-Tram-Linien filtern, 2024 als Primärreferenz
  • 10+ GTFS-Tabellen → 4 Parquets (routes, stops, shapes, trips)
Wie übernommen
  • Join über bpuic (Haltestellen-ID) → stop_name, stop_lat, stop_lon
  • +3 Spalten im Master
Daten Anreicherung

Wetter (Meteo)

Drei heterogene Quellen, konsolidiert auf Stundenbasis

Fahrplan (GTFS)
Wetter (Meteo)
Events
Stadtkreise (Geo)
Woher
  • data.stadt-zuerich.ch (UGZ, Wapo, ERZ) · CSV/Parquet · CC0
  • 3 Quellen, unterschiedliche Auflösung
Was zu tun
  • Auf ein stündliches Raster konsolidieren
  • 2 Referenzstationen: Stampfenbachstrasse (Stadtlage) + Mythenquai (Seelage)
Wie übernommen
  • floor(1h) als Join-Schlüssel zu den Tram-Zeitstempeln
  • +7 Spalten (u.a. temperature, precipitation, wind_speed, flood_intensity)
Daten Anreicherung

Events nach Größe

Fehlende Open-Data-Quelle durch eigene Recherche geschlossen

Fahrplan (GTFS)
Wetter (Meteo)
Events
Stadtkreise (Geo)
Woher
  • Keine strukturierte Open-Data-Quelle verfügbar
  • Manueller Crawl: Gemini, Perplexity, Transfermarkt
Was zu tun
  • Schwellenwert > 1.000 Besucher, Stadt Zürich, 2023–2025
  • FCZ/GC-Spiele, Street Parade, Züri Fäscht …
Wie übernommen
  • Als CSV aufgebaut, Join über das Datum
  • +4 Spalten (event_name, event_type, event_size, event_location)
Daten Anreicherung

Stadtkreise (Geo)

Räumliche Zuordnung der Haltestellen per Spatial Join

Fahrplan (GTFS)
Wetter (Meteo)
Events
Stadtkreise (Geo)
Woher
  • data.stadt-zuerich.ch · GeoJSON · CC0
  • Stadtkreis-Grenzen, sofort verwendbar
Was zu tun
  • Jeder Haltestelle ihren Stadtkreis zuordnen
Wie übernommen
  • Spatial Join (Punkt-in-Polygon) auf die GTFS-Stops → district_nr, district_name
  • +2 Spalten — bereits im Master, kein nachträglicher Join in der EDA nötig
Daten Zusammenführung

Die Join-Pipeline

Vier Quellen über drei Joins zum validierten Master

Vier Quellen → drei Joins → Qualitätsprüfung → vbz_master.parquet.

Master-Preparation Pipeline
Daten Zusammenführung

Left Join als Standard

Vollständigkeitserhalt: Fehlwerte als null statt Zeilenverlust

Left Join überall: jede Tram-Fahrt bleibt erhalten. Fehlende Werte (Sensor-Ausfall, Event-freier Tag) werden null — statt die Zeile zu löschen.
Datenverlust durch Join ist der häufigste stille Bug in Merge-Pipelines. Left Join macht ihn unmöglich.
Daten Zusammenführung

Zeitstempel als Herausforderung

Datentyp- und Zeitraster-Fallstricke beim Zusammenführen

Annahme
Zwei Parquets mit datetime-Spalten joinen einfach
Befund
Meteo via pl.from_pandas → datetime[ns], IST nativ datetime[us]. Polars wirft SchemaError beim Join auf den stundengerundeten Schlüssel. Fix: explizit auf pl.Datetime('us') casten.
Annahme
Stündliches Wetter passt direkt zu Tram-Zeitstempeln
Befund
Tram-Halte sind sekundengenau, Wetter stündlich. floor(1h) auf beiden Seiten erzeugt den gemeinsamen Join-Schlüssel.
Resultat

Der Master-Datensatz

Analysefertige, reproduzierbare Datengrundlage

94,4 M
Halt-Ereignisse
26
Spalten aus 5 Quellen
9
Notebooks, 00–08
100 %
reproduzierbar
vbz_master.parquet — eine Zeile pro Halt (~230 je Fahrt), angereichert mit Fahrplan, Wetter, Events und Stadtkreis. 1:1 reproduzierbar über die 9 Notebooks.
Limitierungen

Bewusste Limitierung

Dokumentierte Scope-Entscheidungen dieser Ausbaustufe

Grenze 1 · Backlog #1
trip_id ↔ GTFS nicht direkt matchbar
  • IST-FAHRT_BEZEICHNER (85:3849:…) und GTFS-trip_id (1.T0.1-10-…): 0 % Overlap
  • Richtungsspezifische Analysen & Kaskadeneffekt bräuchten eine Umlauf-basierte Brücke
Grenze 2 · Backlog #2
UMLAUF_ID beim Reduktions-Schritt verworfen
  • Wäre die direktere Brücke für Kaskadenanalyse als trip_id-Kontinuität
  • Nachträglich = volles Reprocessing ab den Roh-ZIPs
Bewusst dokumentierte Grenzen, nicht übersehene Fehler. Transparenz über Known Issues gehört zu sauberem Data Engineering.
Ausblick

Weitere Perspektiven

Erweiterungen für eine nächste Iteration

1

Format v2

Ab Ende 2025 wechselt opentransportdata.swiss auf Format v2 (großer VBZ-Fahrplanwechsel Dez 2025) — Integration in einer späteren Iteration.

2

trip_id / UMLAUF_ID-Brücke

Durchgängige Fahrt-Identität herstellen — Voraussetzung für richtungsspezifische und Kaskadenanalysen.

3

Feature-Anreicherung

Weitere abgeleitete Merkmale aus dem Master (z.B. Standzeit/Puffer je Halt) als Modellierungsgrundlage.

4

Reprocessing v2

Das Resultat: ein neu prozessierter Master v2 ab den Roh-ZIPs mit den erweiterten Feldern.

Zurich Tram Data

Vom Rohdaten-Archiv zum Master-Datensatz
Data-Engineering-Pipeline für das Zürcher Tramnetz (VBZ) | 2023–2025

Recherche · Reduktion · Anreicherung · Vereinigung
Master-Datensatz als Data-Engineering-Fundament für das Analyse-Projekt zh-tram-flow