Взвешенная скользящая средняя с 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')
,