2012-10-10 3 views
9

numpy에서 convolve 함수를 사용하는 이동 평균 함수를 작성했습니다. 이는 (weighted moving average)과 동일해야합니다. 나의 무게 (간단한 산수 평균으로) 모두 동일 할 때, 그것을 잘 작동합니다 :numpy.convolve를 사용하는 가중 이동 평균

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]) 

'유효한'플래그를 제거하면 올바른 값이 표시되지 않습니다. 나는 코드 클리너 (동일한 코드, 다른 가중치)를 만드는 것처럼 WMA와 MA에 대해 convolve를 사용하고 싶습니다. 그렇지 않으면 모든 데이터를 반복하여 조각을 가져와야 할 것입니다.

이 동작에 대한 아이디어가 있습니까?

답변

14

원하는 것은 convolution에서 np.correlate이고 두 번째 인수는 기본적으로 반전되어 예상 결과는 np.convolve(data, w[::-1], 'valid')이됩니다.

+1

감사합니다. 또한 [:: - 1]이 배열/목록을 뒤집을 것임을 알지 못했습니다. 그것은 매우 유용한 정보입니다! –

+1

단순한 논평으로'np.cumsum (np.ones (numdays, dtype = float), axis = 0)'은'np.arange (numdays) + 1.' 또는'np.np .arange (1., numdays + 1.)'. –