Pandas-Zeitreihenanalyse
Die Zeitreihenanalyse ist ein wichtiger Teil der Datenanalyse. Pandas bietet umfangreiche Funktionen zur Verarbeitung und Analyse von Zeitreihendaten, einschließlich Resampling, rollierender Berechnungen, gleitender Durchschnitte usw.
Grundlegende Zeitreihenoperationen
Zeitreihen erstellen
Beispiel
import numpy as np
# Zeitreihendaten erstellen
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=100, freq="D")
ts = pd.Series(
np.random.randn(100).cumsum() + 100,
index=dates
)
print("Zeitreihendaten (erste 10 Elemente):")
print(ts.head(10))
print()
# Informationen anzeigen
print(f"Indextyp: {type(ts.index)}")
print(f"Startzeit: {ts.index.min()}")
print(f"Endzeit: {ts.index.max()}")
print(f"Zeitspanne: {ts.index.max() - ts.index.min()}")
Datum als Index festlegen
Beispiel
import numpy as np
# DataFrame erstellen und Datumsindex festlegen
df = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Sales": np.random.randint(100, 500, 30),
"Visitors": np.random.randint(50, 200, 30)
})
print("Vor dem Festlegen:")
print(df.head())
print()
# Datum als Index festlegen
df = df.set_index("Date")
print("Nach dem Festlegen:")
print(df.head())
print()
# loc verwenden, um nach Datum abzufragen
print("Abfrage von 2024-01-05 bis 2024-01-10:")
print(df.loc["2024-01-05":"2024-01-10"])
Resampling
Resampling ist der Prozess, Zeitreihendaten von einer Frequenz in eine andere umzuwandeln, einschließlich Upsampling (Erhöhung der Datenpunkte) und Downsampling (Verringerung der Datenpunkte).
Downsampling
Beispiel
import numpy as np
# Daten auf Tagesebene erstellen
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=90, freq="D")
ts = pd.Series(np.random.randint(100, 500, 90), index=dates)
print("Daten auf Tagesebene (erste 10 Elemente):")
print(ts.head(10))
print()
# Nach Monat resampeln (Summe)
monthly = ts.resample("M").sum()
print("Monatliche Summe:")
print(monthly)
print()
# Nach Monat resampeln (Mittelwert)
monthly_mean = ts.resample("M").mean()
print("Monatlicher Mittelwert:")
print(monthly_mean)
Upsampling
Beispiel
# Niederfrequente Daten erstellen
dates = pd.date_range("2024-01-01", periods=3, freq="M")
ts = pd.Series([100, 200, 150], index=dates)
print("Daten auf Monatsebene:")
print(ts)
print()
# Upsampling auf Tagesebene (benötigt Füllmethode)
ts_daily = ts.resample("D").ffill()
print("Auf Tagesebene hochgesampelt (erste 10 Einträge):")
print(ts_daily.head(10))
Gängige Resampling-Methoden
| Methode | Beschreibung |
|---|---|
sum() |
Sum |
mean() |
Mittelwert |
max() / min() |
Max-/Min-Wert |
first() / last() |
Erster/Letzter Wert |
count() |
Anzahl der Nicht-Null-Werte |
ohlc() |
Open, High, Low, Close |
Rollierende Berechnungen
Eine rollierende Berechnung ist eine Berechnung mit gleitendem Fenster auf Zeitreihendaten und wird häufig zur Berechnung von gleitenden Durchschnitten, gleitenden Standardabweichungen usw. verwendet.
Gleitender Durchschnitt
Beispiel
import numpy as np
# Daten erstellen
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=30, freq="D")
ts = pd.Series(np.random.randint(100, 200, 30), index=dates)
# 7-Tage-gleitenden Durchschnitt berechnen
rolling_mean = ts.rolling(window=7).mean()
print("7-Tage-gleitender Durchschnitt (erste 10 Elemente):")
print(rolling_mean.head(10))
print()
# 7-Tage-gleitende Standardabweichung berechnen
rolling_std = ts.rolling(window=7).std()
print("7-Tage-gleitende Standardabweichung:")
print(rolling_std.head(10))
Gleitende Anwendung einer benutzerdefinierten Funktion
Beispiel
import numpy as np
ts = pd.Series(range(1, 11))
print("Originaldaten:")
print(ts)
print()
# Gleitende Summe
print("Gleitende 3er-Summe:")
print(ts.rolling(3).sum())
print()
# Rollierendes Maximum
print("Rollierendes 3er-Maximum:")
print(ts.rolling(3).max())
print()
# Verwende apply
print("Benutzerdefinierte Funktion für rollierendes 3er-Fenster (Bereich):")
print(ts.rolling(3).apply(lambda x: x.max() - x.min()))
Visualisierung von Zeitreihendaten
Beispiel
import numpy as np
# Beispieldaten erstellen
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=100, freq="D")
ts = pd.Series(
np.random.randn(100).cumsum() + 100,
index=dates
)
# Berechne gleitenden Durchschnitt
ma_7 = ts.rolling(7).mean()
ma_30 = ts.rolling(30).mean()
# Daten anzeigen
print("Zeitreihe + gleitender Durchschnitt:")
print(f"Originaldaten (erste 5 Elemente): {ts.head().tolist()}")
print(f"Gleitender 7-Tage-Durchschnitt (erste 10 Elemente): {ma_7.dropna().head().tolist()}")
print(f"Gleitender 30-Tage-Durchschnitt (letzte 5 Elemente): {ma_30.dropna().tail().tolist()}")
Merkmalsextraktion für Zeitreihen
Beispiel
# Zeitreihe erstellen
ts = pd.Series(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
index=pd.date_range("2024-01-01", periods=10, freq="D")
)
# Differenz
diff = ts.diff()
print("Differenz erster Ordnung:")
print(diff)
print()
# Prozentuale Veränderung
pct = ts.pct_change()
print("Prozentuale Änderung:")
print(pct)
print()
# Verschieben
shifted = ts.shift(1)
print("Um 1 zurückverschieben:")
print(shifted)
Praktische Übung: Aktien-Datenanalyse
Beispiel
import numpy as np
# Simuliere Aktiendaten
np.random.seed(42)
n_days = 60
df = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=n_days, freq="D"),
"Open price": 100 + np.random.randn(n_days).cumsum(),
"Close price": 100 + np.random.randn(n_days).cumsum(),
"Volume": np.random.randint(1000000, 10000000, n_days)
})
df = df.set_index("Date")
# Tägliche Rendite berechnen
df["Return"] = df["Close price"].pct_change()
# Volatilität berechnen (rollierende Standardabweichung über 7 Tage)
df["Volatility"] = df["Return"].rolling(7).std() * np.sqrt(252) # Annualisieren
# Gleitende Durchschnittslinie berechnen
df["MA5"] = df["Close price"].rolling(5).mean()
df["MA20"] = df["Close price"].rolling(20).mean()
# Handelssignale generieren (Golden Cross / Death Cross)
df["Signal"] = 0
df.loc[df["MA5"] > df["MA20"], "Signal"] = 1
df.loc[df["MA5"] < df["MA20"], "Signal"] = -1
print("Ergebnisse der Aktiendatenanalyse:")
print(df.tail(10))
Häufige Probleme
1. Datumsangaben sind nicht fortlaufend
Einige Zeitreihen haben nicht für jeden Tag Daten (Feiertage usw.), müssen verwendet werdenasfreqoderreindexum sie zu behandeln.
2. Zeitzonenprobleme
Beim Umgang mit zeitzonenübergreifenden Daten verwenden Sietz_localizeundtz_convertzur Zeitzoneneinstellung und -konvertierung.
3. Auswirkung fehlender Werte
Rollierende Berechnungen überspringen fehlende Werte standardmäßig, aber dies kann die Kontinuität der Ergebnisse beeinträchtigen.
Andere ErweiterungenDie Zeitreihenanalyse ist eine grundlegende Fähigkeit in den Bereichen Finanzen, Meteorologie, IoT und anderen Feldern. Pandas bietet eine vollständige Toolchain für den Umgang mit solchen Daten.