Pandas Rolling Window: Rolling, Expanding und EWM
Updated on
Gleitende Durchschnitte und geglättete Signale sind zentral für die Zeitreihenanalyse, dennoch kämpfen viele Teams mit Fenster-Ausrichtung, fehlenden Werten und langsamen Python-Schleifen.
- Problem: Rolling-Statistiken von Hand zu berechnen ist fehleranfällig und oft nicht korrekt mit Zeitstempeln ausgerichtet.
- Agitate: Schleifen und ad-hoc
shifts führen zu Off-by-one-Fehlern, Lücken in frühen Perioden und trägen Notebooks. - Solution: Nutze
rolling,expandingundewmmit den richtigen Fensterdefinitionen (min_periods, zeitbasierte Fenster,center,adjust), um korrekte, schnelle, vektorisierte Ergebnisse zu erhalten.
Want an AI agent that understands your pandas notebooks and rolling-window features?
RunCell is a JupyterLab AI agent that can read your code, analyze DataFrames, understand notebook context, debug errors, and even generate & execute code for you. It works directly inside JupyterLab—no switching windows or copy-pasting.
👉 Try RunCell: runcell.dev (opens in a new tab)
Schnellreferenz
| Fenstertyp | Am besten geeignet für | Wichtige Parameter |
|---|---|---|
rolling | Gleitende Durchschnitte, Volatilität, benutzerdefinierte Fensterfunktionen | window=3 (oder "7D"), min_periods, center, win_type, on |
expanding | Kumulative Statistiken ab Start | min_periods |
ewm | Exponentielle Glättung oder gewichtete Metriken | span, alpha, halflife, adjust, times |
Beispieldaten
import pandas as pd
dates = pd.date_range("2024-01-01", periods=8, freq="D")
sales = pd.DataFrame({"date": dates, "revenue": [10, 12, 9, 14, 15, 13, 11, 16]})
sales = sales.set_index("date")Rolling Windows (fix und zeitbasiert)
Fenster mit fester Größe
sales["rev_ma3"] = (
sales["revenue"]
.rolling(window=3, min_periods=2)
.mean()
)min_periodssteuert, wann Ergebnisse beginnen; frühe Zeilen bleibenNaN, bis die Mindestanzahl erreicht ist.center=Truerichtet die Statistik auf die Mitte des Fensters aus (praktisch für Plots).
Zeitbasierte Fenster auf Datetime-Index oder on=-Spalte
sales_reset = sales.reset_index()
sales_reset["rev_7d_mean"] = (
sales_reset.rolling("7D", on="date")["revenue"].mean()
)- Verwende Dauer-Strings (
"7D","48H") für unregelmäßige Abtastung; pandas wählt Zeilen innerhalb des Rückblick-Horizonts statt einer festen Anzahl. - Für das Zuschneiden an den Rändern passe
closed="left"oder"right"an.
Benutzerdefinierte Fensterfunktionen
sales["rev_range"] = (
sales["revenue"].rolling(4).apply(lambda x: x.max() - x.min(), raw=True)
)Setze raw=True, um innerhalb von apply mit NumPy-Arrays zu arbeiten und so schneller zu sein.
Expanding Windows (kumulativ)
sales["rev_cum_mean"] = sales["revenue"].expanding(min_periods=2).mean()- Verwende expanding, wenn jede Beobachtung alles bis zu diesem Zeitpunkt sehen soll (laufender Durchschnitt, kumulative Verhältnisse).
- Kombiniere mit
shift(), um den neuesten Wert mit dem historischen Durchschnitt zu vergleichen.
Exponentiell gewichtete Fenster
sales["rev_ewm_span4"] = sales["revenue"].ewm(span=4, adjust=False).mean()adjust=Falsenutzt eine rekursive Formel, die der typischen Glättung in Analytics-Dashboards entspricht.halflifebietet eine intuitive Abnahme:ewm(halflife=3)halbiert das Gewicht alle 3 Perioden.- Für unregelmäßige Zeitstempel übergib
times="date"(oder setze den Index), um nach tatsächlichen Zeitabständen statt nach Zeilenzählung zu gewichten.
Das richtige Fenster wählen (Cheat Sheet)
| Ziel | Empfohlene Methode | Hinweise |
|---|---|---|
| Kurzfristiges Rauschen glätten | rolling mit kleinem window und center=True | Funktioniert auf numerischen Spalten; halte min_periods ≥ 1 für frühe Sichtbarkeit |
| Laufende Summen oder Durchschnitte ab Start | expanding | Kein fixes Fenster; ideal für KPIs, die sich aufsummieren |
| Ältere Beobachtungen abgewichtet einbeziehen | ewm(span=...) | Besser als große rolling-Fenster für Momentum-ähnliche Signale |
| Unregelmäßige Zeitstempel | Zeitbasiertes rolling("7D", on="date") oder ewm(..., times="date") | Vermeidet Verzerrungen durch Tage mit dichterer Stichprobe |
| Feature-Generierung | rolling().agg(["mean","std","min","max"]) | Multi-Aggregation erzeugt schnell saubere Feature-Sets |
Performance- und Korrektheits-Tipps
- Halte Datetime-Spalten im Typ
datetime64[ns]und setze einen Index, wenn du stark mit zeitbasierten Fenstern arbeitest. - Bevorzuge eingebaute Aggregationen (
mean,std,sum,count) gegenüber Python-applyfür bessere Performance. - Vermeide Look-ahead-Bias:
shift()vorrollingeinsetzen, wenn du Features für Supervised Learning baust. - Kombiniere mit
resample, um die Frequenz vor dem Rolling zu normalisieren, falls die Quelldaten unregelmäßig sind.
Rolling-, expanding- und exponentielle Fenster decken den Großteil der Glättungs- und Feature-Engineering-Anforderungen ohne Schleifen ab. Kombiniere sie mit pandas-to-datetime und pandas-resample für saubere Zeitachsen, und du erhältst schnelle, zuverlässige Metriken, die direkt für Charts oder Modelle bereitstehen.