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?
dzięki, rozumiem. Nie wiedziałem też, że [:: - 1] odwróci tablicę/listę. To bardzo przydatne informacje! –
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.) '. –