Autobahn-Baustellen in Power BI & Python analysieren
Tagesaktuelle Baustellendaten direkt in Power BI, Excel Power Query oder Python laden – 29 bereinigte Spalten, kein Preprocessing, sofort dashboardfähig. Inklusive DWD-Wetter und historischem Archiv. Kostenloser API-Zugang.
Funktioniert in jedem BI- und Analyse-Stack
Von Power BI über Jupyter Notebooks bis Tableau – der XLSX-Endpoint und die REST-API lassen sich in jede gängige Analyse-Umgebung einbinden. Kein SDK, keine proprietäre Library.
So sieht ein fertiges Baustellen-Dashboard aus
Vier KPI-Cards, zwei Charts – aufgebaut in Power BI oder Python/Plotly. Alle Daten kommen direkt aus dem API-Endpoint, täglich automatisch aktualisiert.
Beispieldaten zur Illustration. Echte Tageswerte nach Registrierung abrufbar.
Von der API zum Dashboard – vollständige Beispiele
Kopieren, Token einfügen, ausführen. Jedes Beispiel läuft sofort – kein Preprocessing, kein Schema-Mapping.
// Power BI – Power Query M | Daten & Modell > Daten abrufen > Leere Abfrage let // ── Konfiguration ───────────────────────────────────────── Token = "IHR_TOKEN_HIER", BaseUrl = "https://www.autobahn-baustellen.de/wp-json/autobahn/v1", // ── Tagesstand laden (täglich automatisch via Scheduled Refresh) ── Quelle = Web.Contents(BaseUrl & "/download/baustellen", [ Headers = [Authorization = "Bearer " & Token] ]), Mappe = Excel.Workbook(Quelle, true, true), Tabelle = Mappe{[Item = "alle-baustellen"]}[Data], // ── Datentypen setzen ───────────────────────────────────── Typisiert = Table.TransformColumnTypes(Tabelle, { {"Länge (km)", type number}, {"Max Breite (m)", type number}, {"Max Höhe (m)", type number}, {"Max km/h", Int64.Type}, {"Lat", type number}, {"Lng", type number}, {"Beginn", type date}, {"Ende", type date}, {"Temp Min", type number}, {"Temp Max", type number}, {"Niederschlag (mm)", type number} }) in Typisiert // Tipp: Scheduled Refresh in Power BI Service auf 06:00 Uhr setzen // → Dashboard immer mit tagesaktuellem Stand nach dem 03:00-Uhr-Update
// Excel Power Query – Daten > Daten abrufen > Aus anderen Quellen > Leere Abfrage // Dann: Start > Erweiterter Editor → diesen Code einfügen let Token = "IHR_TOKEN_HIER", Url = "https://www.autobahn-baustellen.de/wp-json/autobahn/v1/download/baustellen", Daten = Excel.Workbook( Web.Contents(Url, [Headers = [Authorization = "Bearer " & Token]]), true, true ), Sheet = Daten{[Item = "alle-baustellen"]}[Data], // Nur Bayern – für regionale Auswertung Bayern = Table.SelectRows(Sheet, each [Bundesland] = "Bayern"), // Spalten für Pivot-Tabelle auswählen Auswahl = Table.SelectColumns(Bayern, { "Autobahn", "Gesperrt", "Länge (km)", "Max Breite (m)", "Max km/h", "Wetterwarnung", "Warnung Stufe" }) in Auswahl // Tipp: Verbindungseigenschaften > Aktualisierung > Beim Öffnen der Datei = ON // → Excel lädt täglich automatisch den neuesten Stand beim Öffnen
import pandas as pd TOKEN = "IHR_TOKEN_HIER" BASE = "https://www.autobahn-baustellen.de/wp-json/autobahn/v1" HDR = {"Authorization": f"Bearer {TOKEN}"} # ── Datensatz laden – eine Zeile ─────────────────────────── df = pd.read_excel(f"{BASE}/download/baustellen", storage_options={"headers": HDR}) # ── KPI 1: Vollsperrungsquote nach Bundesland ───────────── kpi_sperrung = ( df.groupby("Bundesland") .agg( gesamt = ("Autobahn", "count"), vollsperrung = ("Gesperrt", lambda x: (x=="Ja").sum()), km_gesamt = ("Länge (km)", "sum"), mit_warnung = ("Wetterwarnung", lambda x: x.notna().sum()) ) .sort_values("gesamt", ascending=False) ) # ── KPI 2: Top-Autobahnen nach Vollsperrung ─────────────── kpi_autobahn = ( df[df["Gesperrt"]=="Ja"] .groupby("Autobahn")["Gesperrt"] .count() .sort_values(ascending=False) .head(10) ) # ── KPI 3: Hochrisiko-Baustellen (Sperrung + Unwetter) ──── hochrisiko = df[ (df["Gesperrt"] == "Ja") & (df["Warnung Stufe"].isin(["Unwetterwarnung", "Extremes Unwetter"])) ] print(f"Gesamt: {len(df)} | Sperrungen: {(df.Gesperrt=='Ja').sum()} | Hochrisiko: {len(hochrisiko)}")
import pandas as pd import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots TOKEN = "IHR_TOKEN_HIER" HDR = {"Authorization": f"Bearer {TOKEN}"} df = pd.read_excel( "https://www.autobahn-baustellen.de/wp-json/autobahn/v1/download/baustellen", storage_options={"headers": HDR}) # ── Chart 1: Baustellen-Choropleth nach Bundesland ──────── bl_counts = df.groupby("Bundesland").size().reset_index(name="Anzahl") fig_map = px.bar(bl_counts, x="Bundesland", y="Anzahl", color="Anzahl", color_continuous_scale="Oranges", title="Baustellen nach Bundesland") # ── Chart 2: Scatter – Länge vs. Tempolimit ─────────────── fig_scatter = px.scatter( df.dropna(subset=["Max km/h", "Länge (km)"]), x="Max km/h", y="Länge (km)", color="Gesperrt", color_discrete_map={"Ja":"#FA6605", "Nein":"#1b8c6e"}, title="Streckenlänge vs. Tempolimit", hover_data=["Autobahn", "Bundesland", "Wetterwarnung"] ) # ── Chart 3: Geo-Scatter aller Baustellen ──────────────── fig_geo = px.scatter_mapbox( df.dropna(subset=["Lat", "Lng"]), lat="Lat", lon="Lng", color="Gesperrt", color_discrete_map={"Ja":"#FA6605", "Nein":"#1b8c6e"}, hover_name="Autobahn", mapbox_style="carto-darkmatter", zoom=5, center={"lat":51.2, "lon":10.5}, title="Alle Baustellen – Karte" ) fig_geo.show()
// Power BI DAX – Measures für das Baustellen-Dashboard // In der Modellansicht: Neue Measure → Code einfügen // ── Basis-KPIs ──────────────────────────────────────────── Baustellen gesamt = COUNTROWS(Baustellen) Vollsperrungen = CALCULATE( COUNTROWS(Baustellen), Baustellen[Gesperrt] = "Ja" ) Sperrquote % = DIVIDE([Vollsperrungen], [Baustellen gesamt], 0) * 100 Mit Wetterwarnung = CALCULATE( COUNTROWS(Baustellen), NOT ISBLANK(Baustellen[Wetterwarnung]) ) // ── Risiko-Score (Vollsperrung + Unwetter kombiniert) ───── Hochrisiko Baustellen = CALCULATE( COUNTROWS(Baustellen), Baustellen[Gesperrt] = "Ja", Baustellen[Warnung Stufe] IN {"Unwetterwarnung", "Extremes Unwetter"} ) // ── Gesamtstreckenlänge in km ────────────────────────────── Gesamt km = SUMX(Baustellen, Baustellen[Länge (km)]) // ── Durchschnittliche Baustellen-Länge ──────────────────── Ø Länge km = AVERAGEX( FILTER(Baustellen, Baustellen[Länge (km)] > 0), Baustellen[Länge (km)] ) // ── Engstellen LKW-kritisch (< 3,5 m Breite) ───────────── LKW Engstellen = CALCULATE( COUNTROWS(Baustellen), Baustellen[Max Breite (m)] > 0, Baustellen[Max Breite (m)] < 3.5 )
Dashboardfertig – ohne eine Zeile Datenpflege
Kein manuelles Excel-Update, kein Python-Preprocessing, kein Scraping-Risiko. Der Datensatz ist strukturell stabil, täglich aktuell und direkt in jeden BI-Stack ladbar.
Scheduled Refresh ready
Power BI Scheduled Refresh auf 06:00 Uhr setzen – Dashboard aktualisiert sich täglich automatisch nach dem 03:00-Uhr-Daten-Update. Kein manueller Eingriff nötig.
VollautomatischStabiles Schema
Spaltenbezeichnungen, Datentypen und Normierung bleiben konstant – kein Schema-Drift, keine gebrochenen Reports. Änderungen werden 30 Tage im Voraus angekündigt.
Schema-stabilWetter als eingebaute Dimension
DWD-Wetterwarnungen und Tageswetter bereits als Spalten integriert – kein zweiter API-Call, keine separate Wetter-Datenquelle. Direkt als Filter oder Measure nutzbar.
Zeitreihe per Archiv
365+ Tage historische Daten per ?date= – für Trendlinien, Moving Averages und Wochenvergleiche im Dashboard. Gleiche Struktur, konsistente Zeitreihe.
Geo-Visualisierung
Lat/Lng für alle Baustellen – direkt für Power BI Map-Visuals, Azure Maps, Plotly Mapbox oder QGIS nutzbar. Bundesland-Zuordnung als Drill-down-Ebene bereits vorhanden.
Einfache Auth – ein Token
Bearer-Token im Authorization-Header – Power Query, Python-requests und cURL unterstützen das nativ. Kein OAuth, keine Session-Verwaltung, kein Token-Refresh nötig.
HTTP BearerWelche Spalte für welches Tool – auf einen Blick
Die wichtigsten Felder des Datensatzes – mit Datentyp und empfohlenem Einsatz in Power BI (Measures, Filter, Visualisierungen) und Python (pandas, plotly, geopandas).
| Feldname | Typ | Beschreibung | Power BI | Python |
|---|---|---|---|---|
| Gesperrt | string | „Ja“ / „Nein“ – für Slicer & Filter | CALCULATE-Filter | df[df.Gesperrt==“Ja“] |
| Bundesland | string | Drill-through-Dimension, Map-Layer | Slicer · Drill | groupby(„Bundesland“) |
| Autobahn | string | Ranglisten, Balkendiagramme | Achse · Slicer | value_counts() |
| Länge (km) | float | SUM / AVG Measure, Scatter-Y | SUMX · AVERAGEX | df[„Länge (km)“].describe() |
| Max Breite (m) | float | LKW-Engstellen-Filter, Scatter-X | CALCULATE < 3.5 | df[df[„Max Breite“]<3.5] |
| Max km/h | int | ETA-Korrektur, Scatter-Achse | Scatter-X · Filter | px.scatter(x=“Max km/h“) |
| Wetterwarnung | string | Risiko-Dimension, bedingte Formatierung | Bed. Format. | df.Wetterwarnung.notna() |
| Warnung Stufe | string | Hoch/Mittel/Niedrig-Kategorisierung | SWITCH-Measure | isin([„Unwetter…“]) |
| Lat / Lng | float | Map-Visual, Geo-Scatter, GIS-Export | Map · Azure Maps | px.scatter_mapbox() |
| Niederschlag (mm) | float | Korrelationsanalyse, Heatmap | Scatter · Korr. | df.corr()[„Niederschlag“] |
| Beginn / Ende | date | Zeitachse, Gantt, Kalender-Filter | Datum-Hierarchie | pd.to_datetime() |
| Temp Min / Max | float | Frost-Filter, Wetter-Heatmap | AVERAGEX · Filter | df[df[„Temp Min“]<0] |
Was BI-Analysten damit bauen
Von der einfachen KPI-Card bis zum vollautomatisierten Alert-System – konkrete Dashboards und Pipelines aus der Praxis.
Tägliches Baustellen-KPI-Dashboard
Power BI Scheduled Refresh täglich um 06:00 Uhr – vier KPI-Cards (Gesamt, Sperrungen, Wetterwarnungen, Ø Länge), Balkendiagramm nach Bundesland, Map-Visual. Fertig in unter 2 Stunden Aufbauzeit.
Wochentrend-Report für Management
Wochenstatistik-Endpoint kombiniert mit täglichem Archiv – Trendlinie der Vollsperrungen über 12 Wochen, Wochenvergleich nach Autobahn, exportierbar als PDF-Report per Power BI Subscriptions.
Python-Alert-Pipeline
Cronjob täglich 04:00 Uhr: Datensatz laden, Hochrisiko-Filter (Sperrung + Unwetter), bei Treffern E-Mail oder Teams-Webhook auslösen. Fertige Pipeline in unter 30 Zeilen Python-Code.
Interaktive Karte mit Plotly
Scatter-Mapbox mit allen 3.480+ Baustellen – Farbe nach Gesperrt-Status, Hover mit Autobahn, Bundesland und Wetterwarnung. In Dash oder Streamlit als Web-App deploybar.
Excel-Pivot für Disponenten
Power Query lädt täglich beim Öffnen – Pivot-Tabelle nach Bundesland × Sperrungsstatus. Bedingte Formatierung: Vollsperrungen rot, Wetterwarnungen orange. Keine Makros, kein VBA.
Azure Data Factory Pipeline
ADF Copy Activity: API-Endpoint als HTTP-Linked-Service, Bearer-Token in Key Vault, täglich ins Azure Data Lake als Bronze-Layer laden – dann per Databricks oder Synapse transformieren.
Antworten für BI-Analysten & Data Engineers
Wie binde ich den Datensatz in Power BI mit automatischer Aktualisierung ein?
Nutzen Sie den Power Query M-Code aus dem Code-Tab oben: Web.Contents() mit Bearer-Token im Header lädt das XLSX direkt. Veröffentlichen Sie den Report im Power BI Service und konfigurieren Sie unter Dataset-Einstellungen > Geplante Aktualisierung einen täglichen Refresh um 06:00 Uhr – nach dem 03:00-Uhr-Daten-Update. Das Dashboard aktualisiert sich dann vollständig automatisch ohne manuellen Eingriff.
Kann ich den Bearer-Token sicher in Power BI hinterlegen?
Ja. Im Power BI Service können Sie den Token als Datenquellen-Anmeldeinformation hinterlegen – nicht im M-Code selbst. Alternativ können Sie den Token als Power Query-Parameter definieren und im Service überschreiben. Für Enterprise-Szenarien empfehlen wir, den Token in Azure Key Vault zu speichern und per Dataflow oder ADF abzurufen. Im Code-Beispiel oben steht der Token im Klartext nur als Platzhalter für den Einstieg.
Ändert sich das Datenschema – können meine Reports brechen?
Nein – das Schema ist stabil und versioniert. Spaltenbezeichnungen, Datentypen und Normierung bleiben konstant. Falls eine Schema-Änderung unvermeidbar ist, kündigen wir sie mindestens 30 Tage im Voraus über das öffentliche Changelog an (/changelog/) und liefern einen Migrationspfad. Breaking Changes werden nie ohne Vorankündigung ausgerollt.
Wie baue ich eine automatische Trend-Zeitreihe mit dem Archiv auf?
Rufen Sie für jeden gewünschten Tag den Endpoint mit ?date=YYYY-MM-DD auf, fügen Sie eine Datumsspalte hinzu und verbinden Sie die täglichen Tabellen per pd.concat() (Python) oder als mehrere Abfragen mit Table.Combine() in Power Query. Das Paneldaten-Beispiel im Forschungsseiten-Code zeigt diesen Workflow für 30 Tage. Die Wochenstatistik (/download/wochenuebersicht) liefert wöchentlich aggregierte Werte – ideal für Moving-Average-Charts in Power BI ohne eigene Aggregation.
Wie verwende ich die Geo-Koordinaten in Power BI Map-Visuals?
Die Spalten Lat und Lng sind numerisch und direkt für Power BI Map-Visuals verwendbar. Ziehen Sie Lat in das Feld Breitengrad und Lng in Längengrad – fertig. Für Azure Maps oder ArcGIS Maps for Power BI funktioniert dasselbe. In Python / Plotly nutzen Sie px.scatter_mapbox(lat="Lat", lon="Lng"). Das Bundesland-Feld ermöglicht zusätzlich einen Drill-down ohne separate Geodaten.
Gibt es einen JSON-Endpoint für direkte API-Abfragen ohne XLSX-Parsing?
Aktuell liefert die API strukturierte XLSX-Dateien, die sich mit einer Zeile pandas (pd.read_excel()) oder Power Query (Excel.Workbook()) direkt laden lassen – kein manuelles Parsing nötig. Ein nativer JSON-Endpoint ist auf der Roadmap. Sobald verfügbar, wird er im Changelog angekündigt – ohne Breaking Changes am bestehenden XLSX-Endpoint.
API-Token anfordern – Dashboard in 30 Minuten
Registrieren Sie sich in 2 Minuten, kopieren Sie den Power Query M-Code oder das Python-Snippet und laden Sie den ersten Datensatz. Kein Preprocessing, kein Schema-Mapping.
Keine Kosten · Keine Kreditkarte · Kein Ablaufdatum · Sofort einsatzbereit

