2012-10-10 13 views
9

Piszę funkcję średniej ruchomej, która używa funkcji convolve w numpy, która powinna być równoważna z (weighted moving average). Kiedy moje ciężary są równe (jak w prosty średniej arithmatic), to działa dobrze:ważona średnia ruchoma z numpy.convolve

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

daje

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

Jednak, gdy próbuję użyć średnią ważoną

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

zamiast (dla tych samych danych) 3.667,4.667,5.667,6.667, ... Oczekuję, otrzymam

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

Jeśli usuniemy flagę "prawidłową", nie widzę nawet prawidłowych wartości. Naprawdę chciałbym użyć convolve dla WMA, jak również dla MA, ponieważ sprawia, że ​​kod jest czystszy (ten sam kod, różne wagi) i inaczej myślę, że będę musiał przechodzić przez wszystkie dane i robić plasterki.

Wszelkie pomysły na temat tego zachowania?

Odpowiedz

14

To, czego potrzebujesz, to np.correlate w splotach. Drugi argument jest zasadniczo odwrócony, więc oczekiwany wynik będzie zgodny z np.convolve(data, w[::-1], 'valid').

+1

dzięki, rozumiem. Nie wiedziałem też, że [:: - 1] odwróci tablicę/listę. To bardzo przydatne informacje! –

+1

Jako zwykły komentarz, 'np.cumsum (np.ones (numdays, dtype = float), axis = 0)' jest bardzo skomplikowanym sposobem na uzyskanie 'np.arange (numdays) + 1.' lub' np.np .arange (1., numdays + 1.) '. –