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 pandas as pd
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 pandas as pd
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 pandas as pd
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

import pandas as pd

# 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 pandas as pd
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 pandas as pd
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 pandas as pd
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

import pandas as pd

# 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 pandas as pd
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.

Die 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.

Andere Erweiterungen