Fonctions de fenêtre Pandas (rolling / expanding / ewm)
Les fonctions de fenêtre sont utilisées pour effectuer des calculs de fenêtre glissante sur des séries temporelles ou des données ordonnées, et sont des outils importants dans des domaines tels que l'analyse financière et le traitement du signal.
rolling Fenêtre glissante
Utilisation de base
Exemple
import pandas as pd
import numpy as np
# Créer des données de séries temporelles
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=20, freq="D")
ts = pd.Series(np.random.randint(100, 200, 20), index=dates)
print("Données originales (10 premières lignes) :")
print(ts.head(10))
print()
# Moyenne glissante sur 7 jours
ma7 = ts.rolling(window=7).mean()
print("Moyenne glissante sur 7 jours (10 premières lignes) :")
print(ma7.head(10))
print()
# Somme glissante
rolling_sum = ts.rolling(window=5).sum()
print("Somme glissante sur 5 jours :")
print(rolling_sum.head(10))
import numpy as np
# Créer des données de séries temporelles
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=20, freq="D")
ts = pd.Series(np.random.randint(100, 200, 20), index=dates)
print("Données originales (10 premières lignes) :")
print(ts.head(10))
print()
# Moyenne glissante sur 7 jours
ma7 = ts.rolling(window=7).mean()
print("Moyenne glissante sur 7 jours (10 premières lignes) :")
print(ma7.head(10))
print()
# Somme glissante
rolling_sum = ts.rolling(window=5).sum()
print("Somme glissante sur 5 jours :")
print(rolling_sum.head(10))
Types de fenêtres glissantes
Exemple
import pandas as pd
import numpy as np
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# Taille de fenêtre fixe
print("Fenêtre fixe (3) :")
print(s.rolling(3).mean())
print()
# Fenêtre mobile (fenêtre temporelle)
# Fenêtre après 1 minute
s2 = pd.Series([1, 2, 3, 4, 5], index=pd.date_range("2024-01-01", periods=5, freq="T"))
print("Fenêtre temporelle (1 minute) :")
print(s2.rolling("1min").sum())
import numpy as np
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# Taille de fenêtre fixe
print("Fenêtre fixe (3) :")
print(s.rolling(3).mean())
print()
# Fenêtre mobile (fenêtre temporelle)
# Fenêtre après 1 minute
s2 = pd.Series([1, 2, 3, 4, 5], index=pd.date_range("2024-01-01", periods=5, freq="T"))
print("Fenêtre temporelle (1 minute) :")
print(s2.rolling("1min").sum())
expanding Fenêtre expansive
La fenêtre expansive accumule depuis le début jusqu'à la position actuelle, avec la taille de la fenêtre qui augmente progressivement.
Exemple
import pandas as pd
import numpy as np
s = pd.Series([1, 2, 3, 4, 5])
# Fenêtre expansive pour calculer la moyenne cumulée
exp_mean = s.expanding().mean()
print("Moyenne cumulée :")
print(exp_mean)
print()
# Fenêtre expansive pour calculer le maximum cumulé
exp_max = s.expanding().max()
print("Maximum cumulé :")
print(exp_max)
print()
# Fenêtre expansive pour calculer l'écart-type
exp_std = s.expanding().std()
print("Écart-type cumulé :")
print(exp_std)
import numpy as np
s = pd.Series([1, 2, 3, 4, 5])
# Fenêtre expansive pour calculer la moyenne cumulée
exp_mean = s.expanding().mean()
print("Moyenne cumulée :")
print(exp_mean)
print()
# Fenêtre expansive pour calculer le maximum cumulé
exp_max = s.expanding().max()
print("Maximum cumulé :")
print(exp_max)
print()
# Fenêtre expansive pour calculer l'écart-type
exp_std = s.expanding().std()
print("Écart-type cumulé :")
print(exp_std)
ewm Moyenne mobile pondérée exponentiellement
La moyenne mobile pondérée exponentiellement (EWMA) accorde un poids plus important aux données récentes.
Exemple
import pandas as pd
import numpy as np
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# Plus alpha est petit, plus le poids des données récentes est grand.
ewm_05 = s.ewm(alpha=0.5).mean()
ewm_2 = s.ewm(alpha=0.2).mean()
print("Données d'origine :")
print(s.values)
print("\nalpha=0.5:")
print(ewm_05.values)
print("\nalpha=0.2:")
print(ewm_2.values)
print()
# Utilisation de span (relation avec alpha : alpha = 2/(span+1))
ewm_span = s.ewm(span=5).mean()
print("span=5:")
print(ewm_span.values)
import numpy as np
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# Plus alpha est petit, plus le poids des données récentes est grand.
ewm_05 = s.ewm(alpha=0.5).mean()
ewm_2 = s.ewm(alpha=0.2).mean()
print("Données d'origine :")
print(s.values)
print("\nalpha=0.5:")
print(ewm_05.values)
print("\nalpha=0.2:")
print(ewm_2.values)
print()
# Utilisation de span (relation avec alpha : alpha = 2/(span+1))
ewm_span = s.ewm(span=5).mean()
print("span=5:")
print(ewm_span.values)
EWM est plus sensible aux changements de tendance et convient aux scénarios qui nécessitent une réponse rapide.
Mise en pratique : indicateurs techniques boursiers
Exemple
import pandas as pd
import numpy as np
# Simuler des données de cours boursiers
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=30, freq="D")
df = pd.DataFrame({
"Date": dates,
"Close": 100 + np.random.randn(30).cumsum()
})
# Calculer les indicateurs techniques
# Moyenne mobile sur 5 jours
df["MA5"] = df["Close"].rolling(5).mean()
# Moyenne mobile sur 10 jours
df["MA10"] = df["Close"].rolling(10).mean()
# Moyenne mobile pondérée exponentiellement sur 5 jours
df["EMA5"] = df["Close"].ewm(span=5).mean()
# Volatilité (écart-type glissant sur 5 jours)
df["Volatility"] = df["Close"].rolling(5).std()
# Prix le plus haut cumulé
df["Highest"] = df["Close"].expanding().max()
print("Indicateurs techniques boursiers :")
print(df.round(2))
import numpy as np
# Simuler des données de cours boursiers
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=30, freq="D")
df = pd.DataFrame({
"Date": dates,
"Close": 100 + np.random.randn(30).cumsum()
})
# Calculer les indicateurs techniques
# Moyenne mobile sur 5 jours
df["MA5"] = df["Close"].rolling(5).mean()
# Moyenne mobile sur 10 jours
df["MA10"] = df["Close"].rolling(10).mean()
# Moyenne mobile pondérée exponentiellement sur 5 jours
df["EMA5"] = df["Close"].ewm(span=5).mean()
# Volatilité (écart-type glissant sur 5 jours)
df["Volatility"] = df["Close"].rolling(5).std()
# Prix le plus haut cumulé
df["Highest"] = df["Close"].expanding().max()
print("Indicateurs techniques boursiers :")
print(df.round(2))
Comparaison des fonctions de fenêtre
| Type | Description | Cas d'utilisation |
|---|---|---|
rolling |
Fenêtre à taille fixe | Moyenne mobile, volatilité |
expanding |
Fenêtre cumulative | Statistiques cumulatives, stop-loss/take-profit |
ewm |
Pondération exponentielle | Suivi de tendance, réponse rapide |