HOWTO · Python
Moyenne mobile pour NumPy Array en Python
Ce tutoriel montre comment calculer la moyenne mobile pour les tableaux numpy en python
Sur cette page
Une moyenne mobile simple est la moyenne d’une fenêtre de taille fixe contenant des valeurs consécutives. Pour un tableau NumPy, numpy.convolve ou numpy.cumsum permet de la calculer directement ; bottleneck.move_mean et pandas avec rolling().mean() sont d’autres possibilités offertes par des bibliothèques. Avec une fenêtre de quatre valeurs, chaque résultat résume quatre valeurs d’entrée adjacentes. Les moyennes mobiles atténuent les fluctuations à court terme et peuvent rendre les tendances plus visibles. Une moyenne mobile pondérée, quant à elle, accorde davantage d’importance aux données récentes.
Les données de l’exemple ci-dessous contiennent 12 valeurs. La première méthode renvoie un résultat pour chaque fenêtre complète de quatre valeurs, soit 9 résultats. Choisissez la taille de la fenêtre en fonction du nombre d’observations que chaque moyenne doit résumer : la modifier change à la fois le lissage et le nombre de résultats calculés sur des fenêtres complètes.
Utiliser numpy.convolve pour calculer une moyenne mobile sur des tableaux NumPy
numpy.convolve calcule une convolution linéaire. Ici, le second tableau contient quatre valeurs égales à un ; chaque résultat de la convolution correspond à la somme d’une fenêtre de quatre valeurs. Diviser cette somme par quatre donne sa moyenne. Le mode valid ne renvoie que les fenêtres entièrement comprises dans les données d’entrée : avec 12 valeurs et une fenêtre de 4, on obtient donc 9 résultats. Ceux-ci correspondent aux fenêtres successives, de gauche à droite : le premier calcule la moyenne des positions 0 à 3 et le dernier, celle des positions 8 à 11.
import numpy as np
def moving_average(values, window):
weights = np.ones(window) / window
return np.convolve(values, weights, mode="valid")
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Utiliser numpy.cumsum pour calculer une moyenne mobile sur des tableaux NumPy
Une somme cumulée permet de calculer le total de chaque fenêtre en soustrayant le total cumulé qui la précède de celui atteint à sa fin. Pour la première fenêtre, il n’existe aucun total antérieur à soustraire ; la fonction commence donc par la première fenêtre complète. On obtient ainsi les mêmes 9 moyennes qu’avec l’exemple utilisant numpy.convolve. Cette méthode montre comment calculer les sommes des fenêtres à partir de totaux successifs ; il suffit ensuite de diviser chaque somme par la taille de la fenêtre pour obtenir une moyenne.
import numpy as np
def moving_average(values, window):
cumulative = np.cumsum(values, dtype=float)
cumulative[window:] -= cumulative[:-window]
return cumulative[window - 1:] / window
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
Utiliser le module bottleneck pour calculer une moyenne mobile
Le paquet bottleneck fournit move_mean, qui calcule une moyenne mobile sur un tableau. Avec le réglage par défaut, qui exige une fenêtre complète, aucune moyenne sur quatre valeurs n’est disponible aux trois premières positions ; la première apparaît à l’indice 3. Le résultat conserve la longueur du tableau d’entrée et représente ces positions initiales par nan. L’exemple utilise Bottleneck lorsque le paquet est disponible et comprend un petit équivalent en Python pur pour les environnements où ce paquet facultatif ne l’est pas. Cette méthode est utile lorsqu’il faut conserver une position de résultat pour chaque valeur d’entrée ; les nan initiaux indiquent simplement qu’aucune fenêtre complète ne s’est encore formée.
from importlib.util import find_spec
data = [10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7]
window = 4
if find_spec("bottleneck") is not None:
import bottleneck as bn
result = bn.move_mean(data, window=window).tolist()
else:
result = [float("nan")] * (window - 1)
result.extend(
sum(data[start:start + window]) / window
for start in range(len(data) - window + 1)
)
print(result)
[nan, nan, nan, 8.0, 9.25, 13.5, 18.0, 18.5, 18.5, 17.0, 15.0, 14.0]
Utiliser le module pandas pour calculer une moyenne mobile
Pour des données de série temporelle stockées dans une Series pandas, appelez rolling(4).mean() afin de calculer la moyenne de chaque fenêtre complète de quatre valeurs. Par défaut, la Series conserve sa longueur et son index d’origine. Ses trois premières entrées valent NaN, car ces positions ne disposent pas encore de quatre valeurs ; la première moyenne calculée est alignée sur l’indice 3. Les valeurs obtenues sont les mêmes que dans les autres exemples, mais l’index de la Series permet de relier facilement chaque résultat à l’observation correspondante. Si la taille de la fenêtre provient d’une variable, vous pouvez la transmettre à rolling().
import pandas as pd
data = [10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7]
series = pd.Series(data)
print(series.rolling(4).mean())
0 NaN
1 NaN
2 NaN
3 8.00
4 9.25
5 13.50
6 18.00
7 18.50
8 18.50
9 17.00
10 15.00
11 14.00
dtype: float64