Comment calculer une moyenne mobile chez les pandas
Une moyenne mobile est simplement la moyenne d’un certain nombre de périodes précédentes dans une série chronologique.
Pour calculer la moyenne glissante d’une ou plusieurs colonnes dans un DataFrame pandas, nous pouvons utiliser la syntaxe suivante :
df['column_name'].rolling(rolling_window).mean()
Ce tutoriel fournit plusieurs exemples d’utilisation pratique de cette fonction.
Exemple : calculer la moyenne mobile chez les pandas
Supposons que nous ayons le DataFrame pandas suivant :
import numpy as np import pandas as pd #make this example reproducible np.random.seed(0) #create dataset period = np.arange(1, 101, 1) leads = np.random.uniform(1, 20, 100) sales = 60 + 2*period + np.random.normal(loc=0, scale=.5*period, size=100) df = pd.DataFrame({'period': period, 'leads': leads, 'sales': sales}) #view first 10 rows df.head(10) period leads sales 0 1 11.427457 61.417425 1 2 14.588598 64.900826 2 3 12.452504 66.698494 3 4 11.352780 64.927513 4 5 9.049441 73.720630 5 6 13.271988 77.687668 6 7 9.314157 78.125728 7 8 17.943687 75.280301 8 9 19.309592 73.181613 9 10 8.285389 85.272259
Nous pouvons utiliser la syntaxe suivante pour créer une nouvelle colonne contenant la moyenne mobile des « ventes » pour les 5 périodes précédentes :
#find rolling mean of previous 5 sales periods df['rolling_sales_5'] = df['sales'].rolling(5).mean() #view first 10 rows df.head(10) period leads sales rolling_sales_5 0 1 11.427457 61.417425 NaN 1 2 14.588598 64.900826 NaN 2 3 12.452504 66.698494 NaN 3 4 11.352780 64.927513 NaN 4 5 9.049441 73.720630 66.332978 5 6 13.271988 77.687668 69.587026 6 7 9.314157 78.125728 72.232007 7 8 17.943687 75.280301 73.948368 8 9 19.309592 73.181613 75.599188 9 10 8.285389 85.272259 77.909514
Nous pouvons vérifier manuellement que la moyenne glissante des ventes affichée pour la période 5 est la moyenne des 5 périodes précédentes :
Moyenne mobile à la période 5 : (61,417+64,900+66,698+64,927+73,720)/5 = 66,33
Nous pouvons utiliser une syntaxe similaire pour calculer la moyenne mobile de plusieurs colonnes :
#find rolling mean of previous 5 leads periods df['rolling_leads_5'] = df['leads'].rolling(5).mean() #find rolling mean of previous 5 leads periods df['rolling_sales_5'] = df['sales'].rolling(5).mean() #view first 10 rows df.head(10) period leads sales rolling_sales_5 rolling_leads_5 0 1 11.427457 61.417425 NaN NaN 1 2 14.588598 64.900826 NaN NaN 2 3 12.452504 66.698494 NaN NaN 3 4 11.352780 64.927513 NaN NaN 4 5 9.049441 73.720630 66.332978 11.774156 5 6 13.271988 77.687668 69.587026 12.143062 6 7 9.314157 78.125728 72.232007 11.088174 7 8 17.943687 75.280301 73.948368 12.186411 8 9 19.309592 73.181613 75.599188 13.777773 9 10 8.285389 85.272259 77.909514 13.624963
Nous pouvons également créer un tracé linéaire rapide à l’aide de Matplotlib pour visualiser les ventes brutes par rapport à la moyenne mobile des ventes :
import matplotlib.pyplot as plt
plt.plot(df['rolling_sales_5'], label='Rolling Mean')
plt.plot(df['sales'], label='Raw Data')
plt.legend()
plt.ylabel('Sales')
plt.xlabel('Period')
plt.show()
La ligne bleue affiche la moyenne mobile des ventes sur 5 périodes et la ligne orange affiche les données brutes des ventes.
Ressources additionnelles
Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans les pandas :
Comment calculer la corrélation glissante chez les pandas
Comment calculer la moyenne des colonnes dans Pandas