2012-10-10 91 views
9

Escribo una función de promedio móvil que usa la función convolve en numpy, que debe ser equivalente a a (weighted moving average). Cuando mis pesos son todos iguales (como en una simple media aritmética), que funciona bien:media móvil ponderada con numpy.convolve

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

da

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

Sin embargo, cuando intento utilizar una media ponderada

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

en lugar de (para los mismos datos) 3.667,4.667,5.667,6.667, ... espero, obtengo

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

Si elimino el indicador "válido", ni siquiera veo los valores correctos. Realmente me gustaría usar convolve para WMA y MA, ya que hace que el código sea más limpio (mismo código, diferentes pesos) y, de lo contrario, creo que tendré que recorrer todos los datos y tomar secciones.

¿Tiene alguna opinión sobre este comportamiento?

Respuesta

14

Lo que quiere es np.correlate en una circunvolución el segundo argumento se invierte básicamente, por lo que su resultado esperado sería con np.convolve(data, w[::-1], 'valid').

+1

gracias, ya veo. Y tampoco sabía que [:: - 1] invertirá una matriz/lista. ¡Esa es información extremadamente útil! –

+1

Como un simple comentario, 'np.cumsum (np.ones (numdays, dtype = float), axis = 0)' es una forma muy compleja de obtener 'np.arange (numdays) + 1.' o' np.np .arange (1., numdays + 1.) '. –