Взвешенная скользящая средняя с numpy.convolve

Я пишу функцию скользящего среднего, которая использует функцию свертки в numpy, которая должна быть эквивалентна ( взвешенное скользящее среднее). Когда все мои веса равны (как в простом среднем арифметическом), все работает нормально:

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

дает

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

Тем не менее, когда я пытаюсь использовать средневзвешенное

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

вместо (для тех же данных) 3,667,4,667,5,667,6,667,... Я ожидаю, я получаю

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

Если я уберу флаг 'valid', я даже не увижу правильные значения. Я действительно хотел бы использовать Convolve для WMA, а также MA, так как это делает код чище (один и тот же код, разные веса), а в противном случае я думаю, что мне придется пройтись по всем данным и взять кусочки.

Есть идеи об этом поведении?

1 ответ

Решение

Что вы хотите np.correlate в свертке второй аргумент в основном инвертируется, так что ожидаемый результат будет с np.convolve(data, w[::-1], 'valid'),

Другие вопросы по тегам