API · Pandas
Pandas DataFrame.rolling() Funktion
Die DataFrame-Funktion rolling() stellt ein rollendes Fenster für mathematische Operationen zur Verfügung.
Auf dieser Seite
Die Python-Pandas-Funktion DataFrame.rolling() stellt ein rollendes Fenster für mathematische Operationen zur Verfügung. Der Aufruf von rolling() allein berechnet noch nichts: Er gibt ein Rolling-Objekt zurück, das die gleitenden Fenster definiert, und erst eine Aggregationsmethode wie sum(), mean() oder std() reduziert jedes Fenster auf eine Ergebniszeile. Da ein Fenster normalerweise an der aktuellen Zeile endet, behält das Ergebnis denselben Index wie der ursprüngliche DataFrame — deshalb ist rolling() der übliche Weg, um laufende Summen, gleitende Mittelwerte und andere fortlaufende Statistiken zu berechnen.
Syntax von pandas.DataFrame.rolling()
DataFrame.rolling(
window, min_periods=None, center=False, win_type=None, on=None,
closed=None, step=None, method='single'
)
Parameter
window |
Es ist ein Parameter vom Typ Integer, Offset oder BaseIndexer-Unterklasse. Er gibt die Größe des gleitenden Fensters an: eine feste Anzahl von Beobachtungen oder — bei einem Offset — eine Zeitspanne wie '3D'. |
min_periods |
Es ist ein ganzzahliger Parameter. Er gibt die Mindestanzahl der Beobachtungen in einem Fenster an, die nicht NaN sind; Fenster mit weniger Beobachtungen liefern NaN. Wird er nicht gesetzt, entspricht er bei festen Fenstern der Fenstergröße und bei zeitbasierten Fenstern 1. |
center |
Es ist ein boolescher Parameter. Bei True wird jedes Ergebnis in der Mitte seines Fensters beschriftet statt am rechten Rand. |
win_type |
Es handelt sich um einen String-Parameter. Er gibt einen gewichteten Fenstertyp wie 'triang' an, sodass die Beobachtungen innerhalb des Fensters mit unterschiedlichen Gewichten beitragen. Die meisten gewichteten Fenstertypen erfordern SciPy. |
on |
Es handelt sich um einen String-Parameter. Er gibt den Spaltennamen an, auf dem das rollende Fenster anstelle des Indexes berechnet werden soll; er wird bei zeitbasierten Fenstern verwendet, wenn die Datumswerte in einer Spalte stehen. |
closed |
Es handelt sich um einen String-Parameter. Er gibt an, welche Seite des Fensterintervalls geschlossen ist. Es gibt vier Optionen: right, left, both oder neither. Der Standard ist right. |
step |
Es ist ein ganzzahliger Parameter. Das Fenster wird nur an jeder step-ten Zeile ausgewertet, sodass das Ergebnis nur diese Zeilen enthält. |
Rückgabewert
Es wird ein Rolling-Fensterobjekt zurückgegeben. Der Aufruf einer Aggregationsmethode darauf gibt einen DataFrame mit demselben Index wie die Eingabe zurück.
Die obige Signatur ist die aktuelle. Der Parameter axis, den ältere Anleitungen zeigen, existiert nicht mehr, weil ein rollendes Fenster immer entlang des Indexes läuft; seine Übergabe löst einen TypeError aus, wie der Fehlerabschnitt unten zeigt.
Beispiel: Rollende Summe mit einem festen Fenster der Größe 2
Die häufigste Form verwendet ein ganzzahliges Fenster, das Zeilen zählt. In diesem Beispiel addiert rolling(2).sum() jede Zeile zu der Zeile direkt darüber.
import pandas as pd
dataframe = pd.DataFrame({
'Attendance': {0: 60, 1: 100, 2: 80, 3: 78, 4: 95},
'Obtained Marks': {0: 90, 1: 75, 2: 82, 3: 64, 4: 45},
})
print("The Original DataFrame is:")
print(dataframe)
print("The Rolling Sum With a Window of 2 is:")
print(dataframe.rolling(2).sum())
Ausgabe:
The Original DataFrame is:
Attendance Obtained Marks
0 60 90
1 100 75
2 80 82
3 78 64
4 95 45
The Rolling Sum With a Window of 2 is:
Attendance Obtained Marks
0 NaN NaN
1 160.0 165.0
2 180.0 157.0
3 158.0 146.0
4 173.0 109.0
Zeile 0 hat keine Zeile über sich, ihr Fenster enthält also nur eine einzige Beobachtung — weniger als die zwei, die das standardmäßige min_periods verlangt — und das Ergebnis ist NaN. Ab Zeile 1 ist jeder Wert die Summe aus der aktuellen und der vorherigen Zeile: 60 + 100 = 160, 100 + 80 = 180 und so weiter. Die ganzzahligen Spalten werden wegen dieses ersten NaN zu Floats.
Beispiel: Rollender Mittelwert und min_periods
Dasselbe Fenster funktioniert mit jeder Aggregation. Hier mittelt rolling(3).mean() die aktuelle Zeile und die beiden Zeilen darüber. Mit dem standardmäßigen min_periods können die ersten beiden Zeilen kein Fenster aus drei Zeilen füllen und bleiben NaN. Mit min_periods=1 arbeitet pandas mit so vielen Beobachtungen, wie am Anfang verfügbar sind, sodass das Ergebnis ab der ersten Zeile definiert ist.
import pandas as pd
dataframe = pd.DataFrame({
'Attendance': {0: 60, 1: 100, 2: 80, 3: 78, 4: 95},
'Obtained Marks': {0: 90, 1: 75, 2: 82, 3: 64, 4: 45},
})
print("The Rolling Mean With a Window of 3 is:")
print(dataframe.rolling(3).mean())
print("The Rolling Mean With a Window of 3 and min_periods=1 is:")
print(dataframe.rolling(3, min_periods=1).mean())
Ausgabe:
The Rolling Mean With a Window of 3 is:
Attendance Obtained Marks
0 NaN NaN
1 NaN NaN
2 80.000000 82.333333
3 86.000000 73.666667
4 84.333333 63.666667
The Rolling Mean With a Window of 3 and min_periods=1 is:
Attendance Obtained Marks
0 60.000000 90.000000
1 80.000000 82.500000
2 80.000000 82.333333
3 86.000000 73.666667
4 84.333333 63.666667
Die beiden Ausgaben stimmen ab Index 2 überein. Der Unterschied liegt am Anfang: min_periods=1 meldet zusätzlich 60.00 für die erste Zeile (diesen Wert allein) und 80.00 für die zweite (den Mittelwert der ersten beiden Werte). Beachten Sie, dass min_periods die Beobachtungen zählt, die nicht NaN sind — damit ist es auch die wichtigste Stellschraube für Lücken in den Daten, wie das letzte Beispiel zeigt.
Beispiel: Rollende Summe über ein zeitbasiertes Fenster
window kann auch ein Zeit-Offset wie '3D' sein. Das Fenster deckt dann eine Zeitspanne ab statt einer festen Zeilenzahl, sodass Datensätze nur beitragen, wenn sie in die Spanne fallen — egal, wie unregelmäßig sie verteilt sind. Wenn die Datumswerte in einer Spalte statt im Index stehen, geben Sie diese Spalte mit on an. Für die Verkäufe unten gibt es keine Einträge für 2026-01-04 und 2026-01-07.
import pandas as pd
sales = pd.DataFrame({
'Date': pd.to_datetime(['2026-01-01', '2026-01-02', '2026-01-03',
'2026-01-05', '2026-01-06', '2026-01-08']),
'Sales': [120, 80, 150, 90, 200, 60],
})
print(sales)
print("The Rolling Sum Over the Previous 3 Days is:")
print(sales.rolling('3D', on='Date').sum())
Ausgabe:
Date Sales
0 2026-01-01 120
1 2026-01-02 80
2 2026-01-03 150
3 2026-01-05 90
4 2026-01-06 200
5 2026-01-08 60
The Rolling Sum Over the Previous 3 Days is:
Date Sales
0 2026-01-01 120.0
1 2026-01-02 200.0
2 2026-01-03 350.0
3 2026-01-05 240.0
4 2026-01-06 290.0
5 2026-01-08 260.0
Für 2026-01-05 reicht das Drei-Tage-Fenster bis vor 2026-01-02 zurück, es enthält also nur die Verkäufe vom 2026-01-03 und 2026-01-05: 150 + 90 = 240. Der fehlende 2026-01-04 trägt nichts bei und verschiebt die Spanne nicht so, wie eine zusätzliche Zeile ein festes Fenster verschieben würde. Beachten Sie, dass die erste Zeile bereits ein Ergebnis hat: Ein zeitbasiertes Fenster verwendet standardmäßig min_periods=1 — der umgekehrte Standard gegenüber festen Fenstern.
Beispiel: Beschriftungen mit center zentrieren und die aktuelle Zeile mit closed ausschließen
Zwei Parameter ändern, wohin ein Ergebnis gehört. Mit center=True wird der aggregierte Wert auf die mittlere Zeile seines Fensters gesetzt statt auf die letzte — das ist sinnvoll, wenn ein gleitender Mittelwert zu den Daten ausgerichtet sein soll, die er glättet; die erste und die letzte Zeile verlieren ihr Ergebnis, weil kein vollständiges Fenster auf ihnen zentriert ist. closed steuert, welches Ende des Intervalls enthalten ist: Bei closed='left' deckt das Fenster einer Zeile die Zeilen davor ab, und die Zeile selbst bleibt aus ihrer eigenen Statistik heraus.
import pandas as pd
temps = pd.DataFrame({'Temperature': [10, 12, 14, 16, 18, 20]})
print("The Centered Rolling Mean With a Window of 3 is:")
print(temps.rolling(3, center=True).mean())
print("The Rolling Sum With a Window of 3 and closed='left' is:")
print(temps.rolling(3, closed='left').sum())
Ausgabe:
The Centered Rolling Mean With a Window of 3 is:
Temperature
0 NaN
1 12.0
2 14.0
3 16.0
4 18.0
5 NaN
The Rolling Sum With a Window of 3 and closed='left' is:
Temperature
0 NaN
1 NaN
2 NaN
3 36.0
4 42.0
5 48.0
Der zentrierte Mittelwert an Index 1 ist 12.0 — der Mittelwert von 10, 12 und 14 — und er steht auf der mittleren Zeile dieses Fensters. Die Summen mit closed='left' zeigen das vertraute Muster 36, 42, 48 um eine Zeile nach unten verschoben: An Index 3 enthält das Fenster die Zeilen 0 bis 2 (10 + 12 + 14 = 36), weil Zeile 3 selbst ausgeschlossen ist.
Häufige Fehler und Grenzfälle
Drei Verhaltensweisen überraschen Benutzer am häufigsten, und jede ist an einem kleinen Beispiel sichtbar.
Fehlende Werte innerhalb des Fensters
Weil min_periods die Beobachtungen zählt, die nicht NaN sind, leert ein einzelner fehlender Wert jedes feste Fenster, das ihn enthält — und auch das Fenster danach. Ein niedrigeres min_periods lässt die Aggregation mit den vorhandenen Werten arbeiten.
import pandas as pd
scores = pd.DataFrame({'Score': [50.0, None, 70.0, 90.0]})
print(scores)
print("The Rolling Sum With a Window of 2 is:")
print(scores.rolling(2).sum())
print("The Rolling Sum With a Window of 2 and min_periods=1 is:")
print(scores.rolling(2, min_periods=1).sum())
Ausgabe:
Score
0 50.0
1 NaN
2 70.0
3 90.0
The Rolling Sum With a Window of 2 is:
Score
0 NaN
1 NaN
2 NaN
3 160.0
The Rolling Sum With a Window of 2 and min_periods=1 is:
Score
0 50.0
1 50.0
2 70.0
3 160.0
Mit den Standardeinstellungen überlebt nur die letzte Summe, 70 + 90. Mit min_periods=1 enthält das Fenster an Index 2 einen gültigen Wert, seine Summe ist also 70: Der fehlende Eintrag wird übersprungen statt weitergegeben. Keines der beiden Verhaltensweisen repariert die Daten — wählen Sie danach, ob ein teilweises Fenster für Ihre Statistik sinnvoll ist.
Ungültige Argumente lösen ValueError aus
rolling() prüft seine Argumente, bevor irgendetwas berechnet wird. Ein negatives Fenster schlägt sofort fehl:
import pandas as pd
temps = pd.DataFrame({'Temperature': [10, 12, 14, 16, 18, 20]})
print(temps.rolling(-1).sum())
Ausgabe:
ValueError: window must be an integer 0 or greater
Ein unbekannter closed-Wert schlägt auf dieselbe Weise fehl, mit ValueError: closed must be 'right', 'left', 'both' or 'neither', und ein gebrochenes Fenster wie 2.5 wird mit derselben Meldung wie das negative Fenster abgelehnt. Beachten Sie, dass window=0 akzeptiert wird, aber entartet ist: Jedes Fenster ist leer, sodass sum() für jede Zeile 0.0 zurückgibt.
Nicht-numerische Spalten lösen DataError aus
Aggregationen akzeptieren nur numerische Daten. Das Rollen eines DataFrame, der noch eine Textspalte enthält, löst einen Fehler aus:
import pandas as pd
mixed = pd.DataFrame({'Name': ['A', 'B', 'C'], 'Value': [1, 2, 3]})
print(mixed.rolling(2).sum())
Ausgabe:
pandas.errors.DataError: Cannot aggregate non-numeric type: str
Wählen Sie die numerischen Spalten vor dem Rollen aus — zum Beispiel mixed[['Value']].rolling(2).sum() — oder entfernen Sie die Beschriftungsspalten zuerst.
Wichtige Hinweise
rolling()allein gibt einRolling-Objekt zurück; berechnet wird erst, wenn eine Aggregationsmethode aufgerufen wird. Das Ergebnis trägt immer den Index der Eingabe, sodass es direkt als neue Spalte zugewiesen werden kann.- Ganzzahlige Spalten werden zu Floats, sobald ein
NaNin der Ausgabe erscheint, weilNaNkeine ganzzahlige Darstellung hat. - Für gruppierte Berechnungen rufen Sie
rolling()auf einemgroupby-Objekt auf, etwadf.groupby('key').rolling(2).sum(): Das Fenster beginnt dann an jeder Gruppe neu, statt Gruppengrenzen zu überschreiten. - Gewichtete Fenster über
win_typesind für signalartige Daten gedacht; für gewöhnliche Geschäftsdaten sind die ungewichteten Aggregationen aus den Beispielen oben die richtige Voreinstellung.