Die Frequenz ändern
Daten kommen selten in der Frequenz, die man braucht. Ticks treffen im Millisekundentakt ein, ein Modell will Tagesbalken, ein Bericht Monate. Resampling gruppiert eine Zeitreihe in neue Perioden um. Von fein zu grob (Tage zu Monaten) heißt Downsampling: Jede neue Periode enthält mehrere alte Beobachtungen, daher muss man sagen, wie sie zusammengefasst werden. Von grob zu fein (Wochen zu Tagen) heißt Upsampling: Es gibt neue Perioden ohne Daten, daher muss man sagen, was dort steht.
import pandas as pd
daily = pd.Series(
[100.0, 101, 103, 102, 104, 105, 103, 106],
index=pd.bdate_range("2026-02-25", periods=8), # Wed 25 Feb ... Fri 6 Mar
name="close",
)
print(daily.resample("ME").last()) # the last price of each month ("ME" = month end)
# 2026-02-28 103.0
# 2026-03-31 106.0
# Freq: ME, Name: close, dtype: float64
print(daily.resample("W-FRI").last()) # the last price of each week, weeks ending on Friday
# 2026-02-27 103.0
# 2026-03-06 106.0
# Freq: W-FRI, Name: close, dtype: float64Die Aggregation wählen
series.resample("ME") allein tut nichts: Es beschreibt nur die Perioden. Die folgende Aggregation bestimmt den Wert und muss zur Bedeutung der Daten passen. Ein Preis ist eine Momentaufnahme, ein Monat wird also durch seinen last-Wert (oder first) vertreten. Ein Volumen ist eine gehandelte Menge, ein Monat ist also die sum. Eine Spanne nutzt max und min. Die Labels folgen der Regel: "ME" beschriftet einen Monat mit seinem letzten Kalendertag, auch wenn das ein Samstag ist, und "W-FRI" eine Woche mit ihrem Freitag.
volume = pd.Series([10, 20, 30, 40, 50, 60, 70, 80], index=daily.index)
print(volume.resample("ME").sum().to_dict())
# {Timestamp('2026-02-28 00:00:00'): 60, Timestamp('2026-03-31 00:00:00'): 300}
# Several summaries at once
print(daily.resample("ME").agg(["first", "last", "max"]))
# first last max
# 2026-02-28 100.0 103.0 103.0
# 2026-03-31 102.0 106.0 106.0Balken aus Ticks und Upsampling
Diagramme und Modelle verwenden OHLC-Balken: Eröffnung (erster Preis), Hoch, Tief und Schluss (letzter Preis) jeder Periode. resample("D").ohlc() baut sie in einem Aufruf aus Intraday-Preisen. Kalendertage ganz ohne Handel, etwa Wochenenden, erscheinen trotzdem als NaN-Zeilen; schließen Sie daher mit dropna() ab, wenn Sie nur Handelstage wollen. Upsampling geht in die andere Richtung: resample("D").ffill() wiederholt an Tagen ohne Daten den letzten bekannten Wert, was ein wöchentlich notierter Preis wirklich bedeutet. Verwenden Sie bei Preisen nie bfill: Es kopiert einen zukünftigen Wert rückwärts und lässt die Information von morgen in das Heute sickern.
times = ["2026-03-05 09:30", "2026-03-05 11:00", "2026-03-05 15:59",
"2026-03-09 09:30", "2026-03-09 12:00", "2026-03-09 15:59"]
ticks = pd.Series([100.0, 101.5, 99.8, 100.7, 102.0, 101.0], index=pd.to_datetime(times))
bars = ticks.resample("D").ohlc()
print(bars)
# open high low close
# 2026-03-05 100.0 101.5 99.8 99.8
# 2026-03-06 NaN NaN NaN NaN
# 2026-03-07 NaN NaN NaN NaN
# 2026-03-08 NaN NaN NaN NaN
# 2026-03-09 100.7 102.0 100.7 101.0
print(bars.dropna().index.strftime("%d %b").tolist()) # ['05 Mar', '09 Mar'] only the days that traded# Upsampling: observations on the 2nd, 6th and 10th, spread over every day with ffill
weekly = pd.Series([100.0, 103.0, 101.0], index=pd.to_datetime(["2026-03-02", "2026-03-06", "2026-03-10"]))
print(weekly.resample("D").ffill().tolist())
# [100.0, 100.0, 100.0, 100.0, 103.0, 103.0, 103.0, 103.0, 101.0]
print(int(weekly.resample("D").mean().isna().sum())) # 6 without a fill rule the new days are empty"ME" tut, nutzen Sie beim Upsampling ffill (nie bfill) und verschieben Sie ein Monatssignal nach vorn, bevor Sie es auf Tagesdaten anwenden.series.resample(regel)beschreibt die Perioden ("D","W-FRI","ME","h"); die folgende Aggregation berechnet die Werte.- Preise:
lastoderohlc(); Volumen:sum; leere Perioden erscheinen alsNaN, diedropna()entfernt. - Upsampling braucht eine Füllregel:
ffill()wiederholt den letzten bekannten Wert; bei Preisen niebfill(), es lässt die Zukunft durchsickern.
Als Nächstes: gleitende Fenster, Statistiken wie gleitende Durchschnitte über ein verschiebbares Fenster der jüngsten Perioden.
Lab: Was bewertet wird
- Mit
month_end_closeden letzten Preis jedes Monats nehmen25 Pkt. - Mit
weekly_volumedas Volumen jeder Woche summieren25 Pkt. - Mit
daily_ohlcaus Intraday-Preisen Tagesbalken bilden25 Pkt. - Mit
fill_to_dailyunregelmäßige Beobachtungen auf jeden Tag verteilen25 Pkt.