Analyse de séries temporelles Pandas
L'analyse de séries temporelles est une partie importante de l'analyse de données. Pandas fournit de riches fonctionnalités pour traiter et analyser les données de séries temporelles, notamment le rééchantillonnage, les calculs glissants, les moyennes mobiles, etc.
Opérations de base sur les séries temporelles
Création de séries temporelles
Exemple
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=100, freq="D")
ts = pd.Series(
np.random.randn(100).cumsum() + 100,
index=dates
)
print("Données de séries temporelles (10 premiers éléments) :")
print(ts.head(10))
print()
# Afficher les informations
print(f"Type d'index : {type(ts.index)}")
print(f"Heure de début : {ts.index.min()}")
print(f"Heure de fin : {ts.index.max()}")
print(f"Intervalle de temps : {ts.index.max() - ts.index.min()}")
Définir la date comme index
Exemple
import numpy as np
# Créer un DataFrame et définir l'index de date
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("Avant la définition :")
print(df.head())
print()
# Définir la date comme index
df = df.set_index("Date")
print("Après la définition :")
print(df.head())
print()
# Utiliser loc pour interroger par date
print("Requête du 2024-01-05 au 2024-01-10 :")
print(df.loc["2024-01-05":"2024-01-10"])
Rééchantillonnage
Le rééchantillonnage est le processus de conversion de données de séries temporelles d'une fréquence à une autre, incluant le suréchantillonnage (augmentation du nombre de points de données) et le sous-échantillonnage (diminution du nombre de points de données).
Sous-échantillonnage
Exemple
import numpy as np
# Créer des données au niveau journalier
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("Données au niveau journalier (10 premiers éléments) :")
print(ts.head(10))
print()
# Rééchantillonner par mois (somme)
monthly = ts.resample("M").sum()
print("Somme mensuelle :")
print(monthly)
print()
# Rééchantillonner par mois (moyenne)
monthly_mean = ts.resample("M").mean()
print("Moyenne mensuelle :")
print(monthly_mean)
Suréchantillonnage
Exemple
# Créer des données à basse fréquence
dates = pd.date_range("2024-01-01", periods=3, freq="M")
ts = pd.Series([100, 200, 150], index=dates)
print("Données au niveau mensuel :")
print(ts)
print()
# Suréchantillonner au niveau quotidien (nécessite une méthode de remplissage)
ts_daily = ts.resample("D").ffill()
print("Suréchantillonné au niveau quotidien (10 premiers éléments) :")
print(ts_daily.head(10))
Méthodes de rééchantillonnage courantes
| Méthode | Description |
|---|---|
sum() |
Sum |
mean() |
Moyenne |
max() / min() |
Valeur max/min |
first() / last() |
Première/Dernière valeur |
count() |
Nombre de valeurs non nulles |
ohlc() |
Ouverture, Haut, Bas, Clôture |
Calculs glissants
Le calcul glissant est un calcul à fenêtre glissante sur des données de séries temporelles, couramment utilisé pour calculer des moyennes mobiles, des écarts-types mobiles, etc.
Moyenne mobile
Exemple
import numpy as np
# Créer des données
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)
# Calculer la moyenne mobile sur 7 jours
rolling_mean = ts.rolling(window=7).mean()
print("moyenne mobile sur 7 jours (10 premiers éléments) :")
print(rolling_mean.head(10))
print()
# Calculer l'écart-type mobile sur 7 jours
rolling_std = ts.rolling(window=7).std()
print("écart-type mobile sur 7 jours :")
print(rolling_std.head(10))
Application d'une fonction personnalisée glissante
Exemple
import numpy as np
ts = pd.Series(range(1, 11))
print("Données d'origine :")
print(ts)
print()
# Somme glissante
print("Somme glissante sur 3 :")
print(ts.rolling(3).sum())
print()
# Maximum glissant
print("Maximum glissant sur 3 :")
print(ts.rolling(3).max())
print()
# Utiliser apply
print("Fonction personnalisée glissante sur 3 (étendue) :")
print(ts.rolling(3).apply(lambda x: x.max() - x.min()))
Visualisation des données de séries temporelles
Exemple
import numpy as np
# Créer des données d'exemple
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
)
# Calculer la moyenne mobile
ma_7 = ts.rolling(7).mean()
ma_30 = ts.rolling(30).mean()
# Afficher les données
print("Série temporelle + moyenne mobile :")
print(f"Données d'origine (5 premiers éléments) : {ts.head().tolist()}")
print(f"Moyenne mobile sur 7 jours (10 premiers éléments) : {ma_7.dropna().head().tolist()}")
print(f"Moyenne mobile sur 30 jours (5 derniers éléments) : {ma_30.dropna().tail().tolist()}")
Extraction de caractéristiques de séries temporelles
Exemple
# Créer une série temporelle
ts = pd.Series(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
index=pd.date_range("2024-01-01", periods=10, freq="D")
)
# Différence
diff = ts.diff()
print("Différence de premier ordre :")
print(diff)
print()
# Variation en pourcentage
pct = ts.pct_change()
print("Variation en pourcentage :")
print(pct)
print()
# Décalage
shifted = ts.shift(1)
print("Décaler en arrière de 1 :")
print(shifted)
Exercice pratique : analyse des données boursières
Exemple
import numpy as np
# Simuler des données boursières
np.random.seed(42)
n_days = 60
df = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=n_days, freq="D"),
"Prix d'ouverture": 100 + np.random.randn(n_days).cumsum(),
"Prix de clôture": 100 + np.random.randn(n_days).cumsum(),
"Volume": np.random.randint(1000000, 10000000, n_days)
})
df = df.set_index("Date")
# Calculer le rendement quotidien
df["Return"] = df["Close price"].pct_change()
# Calculer la volatilité (écart-type glissant sur 7 jours)
df["Volatility"] = df["Return"].rolling(7).std() * np.sqrt(252) # Annualiser
# Calculer la ligne de moyenne mobile
df["MA5"] = df["Close price"].rolling(5).mean()
df["MA20"] = df["Close price"].rolling(20).mean()
# Générer des signaux de trading (croisement doré / croisement de la mort)
df["Signal"] = 0
df.loc[df["MA5"] > df["MA20"], "Signal"] = 1
df.loc[df["MA5"] < df["MA20"], "Signal"] = -1
print("Résultats de l'analyse des données boursières :")
print(df.tail(10))
Problèmes courants
1. Les dates ne sont pas continues
Certaines séries temporelles n'ont pas de données pour chaque jour (jours fériés, etc.), il faut utiliserasfreqoureindexpour gérer.
2. Problèmes de fuseau horaire
Lors du traitement de données inter-fuseaux horaires, utiliseztz_localizeettz_convertpour le réglage et la conversion des fuseaux horaires.
3. Impact des valeurs manquantes
Les calculs glissants ignorent les valeurs manquantes par défaut, mais cela peut affecter la continuité des résultats.
Autres extensionsL'analyse des séries temporelles est une compétence fondamentale en finance, en météorologie, dans l'IoT et dans d'autres domaines. Pandas fournit une chaîne d'outils complète pour traiter ces données.