Je veux calculer la moyenne mobile de 3 éléments.
Par exemple, j’ai 25 éléments de données de vente. Je dois calculer la moyenne mobile de la moyenne de ces 25 éléments de données.
Lorsqu’un réel tableau est donné en tant que données, je veux écrire un programme qui va déterminer une moyenne mobile à 3 éléments et créer un tableau. Le nombre d’éléments dans le tableau devient 2 éléments plus courts que la séquence donnée. Par exemple, si on me donne:
[7.0, 9.0, 5.0, 1.0, 3.0]
Je veux obtenir:
[7.0, 5.0, 3.0]
Vous pouvez utiliser un deque
Python pour ceci:
from collections import deque prices = [7.0, 9.0, 5.0, 1.0, 3.0] moving_average = deque() total = 0.0 days = 3 averages = [] for price in prices: moving_average.append(price) total += price if len(moving_average) > days: # Length of moving average total -= moving_average.popleft() averages.append(total / float(len(moving_average))) print averages
Cela afficherait la sortie suivante:
[7.0, 8.0, 7.0, 5.0, 3.0]
Ou vous pouvez ignorer les entrées initiales comme suit:
print averages[days-1:]
Donnant:
[7.0, 5.0, 3.0]
Le meilleur moyen (et de loin, de loin) d’aborder ceci est la convolution . En utilisant numpy convolve :
import numpy as np x = np.asarray([7.0, 9.0, 5.0, 1.0, 3.0]) # create what's known as the convolution 'kernel' # note that this sums to 1, which results in an average kernel = np.ones(3) / 3 # do the convolution to compute the moving average moving_avg = np.convolve(x, kernel, mode='valid')
Vous pouvez voir l’opération de convolution comme le kernel “glissant” sur la séquence de données. Chaque point moving_avg[k]
dans la sortie de la convolution sera la zone située sous le produit entre vos données et le kernel, lorsque le kernel est centré à ce point k
.
Ceci est une animation (de l’article wikipedia lié ci-dessus) illustrant le principe du kernel carré utilisé dans le calcul de la moyenne mobile:
Une compréhension de liste est une manière pythonique de faire cela, qui ne nécessite aucune importation:
>>> a [7, 9, 5, 1, 3] >>> [(a[i]+a[i+1]+a[i+2])/3.0 for i in xrange(len(a)-2)] [7.0, 5.0, 3.0]