Skip to content

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, expanding und ewm mit 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

FenstertypAm besten geeignet fürWichtige Parameter
rollingGleitende Durchschnitte, Volatilität, benutzerdefinierte Fensterfunktionenwindow=3 (oder "7D"), min_periods, center, win_type, on
expandingKumulative Statistiken ab Startmin_periods
ewmExponentielle Glättung oder gewichtete Metrikenspan, 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_periods steuert, wann Ergebnisse beginnen; frühe Zeilen bleiben NaN, bis die Mindestanzahl erreicht ist.
  • center=True richtet 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=False nutzt eine rekursive Formel, die der typischen Glättung in Analytics-Dashboards entspricht.
  • halflife bietet 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)

ZielEmpfohlene MethodeHinweise
Kurzfristiges Rauschen glättenrolling mit kleinem window und center=TrueFunktioniert auf numerischen Spalten; halte min_periods ≥ 1 für frühe Sichtbarkeit
Laufende Summen oder Durchschnitte ab StartexpandingKein fixes Fenster; ideal für KPIs, die sich aufsummieren
Ältere Beobachtungen abgewichtet einbeziehenewm(span=...)Besser als große rolling-Fenster für Momentum-ähnliche Signale
Unregelmäßige ZeitstempelZeitbasiertes rolling("7D", on="date") oder ewm(..., times="date")Vermeidet Verzerrungen durch Tage mit dichterer Stichprobe
Feature-Generierungrolling().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-apply für bessere Performance.
  • Vermeide Look-ahead-Bias: shift() vor rolling einsetzen, 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.