Zum Hauptinhalt springen
Power BI · Python · pandas · DAX

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.

29
Spalten, normiert & dashboardfähig
3.480+
Baustellen täglich aktuell
365+
Archiv-Tage für Trendanalysen
0 €
Zugang in der Aufbauphase
Power Query · pandas · Plotly
Sofort ladbar – kein Preprocessing, keine Transformation nötig
Power Query direkt einbindbar
pandas · plotly · geopandas
XLSX · REST-API · Bearer-Token
DWD-Wetter als Kovariate
Täglich 03:00 Uhr aktualisiert

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.

Power BI
Web.Contents() + Excel.Workbook() – täglich automatisch aktualisierbar
Power Query M
Python / pandas
pd.read_excel() direkt auf API-URL – eine Zeile Code
pandas · plotly
Excel Power Query
Daten abrufen → Web → Bearer-Token – fertig in 3 Klicks
Power Query
Tableau
XLSX als Web-Datenquelle oder via Python-Connector
Web Data Conn.
Jupyter Notebook
Explorative Analyse, Visualisierung und Modellierung direkt im Notebook
ipynb · plotly
QGIS / GeoPandas
Lat/Lng → GeoDataFrame → Spatial Joins mit eigenen Layern
GIS · GPKG
Looker Studio
Via Google Sheets Connector oder Python-Pipeline als Datenquelle
Google Data
Azure / Databricks
API-Abruf in ADF-Pipeline oder Spark-Job – Bronze-Layer als XLSX
Data Factory

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.

🚧 Autobahn-Baustellen Deutschland – Tagesübersicht
Stand: Täglich 03:00 Uhr · Quelle: autobahn-baustellen.de
3.482
Baustellen gesamt
214
Vollsperrungen heute
89
Mit Wetterwarnung
∅ 2,8 km
Ø Baustellenlänge
Top-Bundesländer nach Baustellen
NRW
487
BY
412
BW
338
NI
291
HE
244
Vollsperrungen nach Autobahn
38
31
25
20
16

Beispieldaten zur Illustration. Echte Tageswerte nach Registrierung abrufbar.

29
Spalten – normiert, dedupliziert, dashboardfertig
1
Zeile Python oder M zum Laden des Datensatzes
03:00
Uhr tägliche Aktualisierung – Scheduled Refresh ready
0 €
API-Zugang in der Aufbauphase

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 (M)
Excel Power Query
Python / pandas
Python / plotly
DAX Measures
// 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.

Vollautomatisch
📐

Stabiles Schema

Spaltenbezeichnungen, Datentypen und Normierung bleiben konstant – kein Schema-Drift, keine gebrochenen Reports. Änderungen werden 30 Tage im Voraus angekündigt.

Schema-stabil
🌩️

Wetter 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.

Trendanalysen
🗺️

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 Bearer

Welche 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.

01

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.

02

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.

03

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.

04

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.

05

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.

06

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