2012-10-10 4 views
9

J'écris une fonction de moyenne mobile qui utilise la fonction convolve en numpy, ce qui devrait être équivalent à un (weighted moving average). Quand mes poids sont tous égaux (comme dans une simple moyenne arithmatic), il fonctionne très bien:moyenne mobile pondérée avec numpy.convolve

data = numpy.arange(1,11) 
numdays = 5 
w = [1.0/numdays]*numdays 
numpy.convolve(data,w,'valid') 

donne

array([ 3., 4., 5., 6., 7., 8.]) 

Cependant, lorsque je tente d'utiliser une moyenne pondérée

w = numpy.cumsum(numpy.ones(numdays,dtype=float),axis=0); w = w/numpy.sum(w) 

au lieu de (pour les mêmes données) 3.667,4.667,5.667,6.667, ... je m'attends, je reçois

array([ 2.33333333, 3.33333333, 4.33333333, 5.33333333, 6.33333333, 
     7.33333333]) 

Si je supprime le drapeau 'valide', je ne vois même pas les bonnes valeurs. Je voudrais vraiment utiliser convolve pour le WMA ainsi que MA car il rend le code plus propre (même code, poids différents) et sinon je pense que je vais devoir parcourir toutes les données et prendre des tranches.

Des idées à propos de ce problème?

Répondre

14

Ce que vous voulez est np.correlate dans une convolution le deuxième argument est essentiellement inversé, de sorte que votre résultat attendu serait avec np.convolve(data, w[::-1], 'valid').

+1

merci je vois. Et je ne savais pas non plus que [:: - 1] inverserait un tableau/une liste. C'est une information extrêmement utile! –

+1

Comme un simple commentaire, 'np.cumsum (np.ones (numdays, dtype = float), axe = 0)' est une façon très complexe d'obtenir 'np.arange (numdays) + 1. ou' np.np .arange (1., numdays + 1.) '. –

Questions connexes