我正在做一些研究,并且正在基于以下数学表达式在Python中实现移动平均值:
我这样实现:
def movingAverage(signal, window):
sum = 0
mAver = []
k = int((window-1)/2)
for i in np.arange(k, len(signal)-k):
for ii in np.arange(i-k, i+k):
sum = sum + signal[ii]
#end-for
mAver.append(sum / window)
sum = 0
#end-for
zeros = [0]*k
mAver = zeros + mAver + zeros
return mAver
效果很好。但是我正在尝试发现一种实现k
变体的方法,以最大程度地减少开始和结束时丢失的信号(现在,我正在使用带有零的列表)。
有人可以帮我吗?
答案 0 :(得分:2)
您可以只使用Pandas并为移动平均线指定center=True
。
import numpy as np
import pandas as pd
np.random.seed(0)
s = pd.Series(np.random.randn(7)).round(1)
moving_avg = s.rolling(window=3).mean(center=True)
>>> pd.concat([s, moving_avg.round(2)], axis=1).rename(columns={0: 'signal', 1: 'MA'})
signal MA
0 1.8 NaN
1 0.4 1.07 # 1.07 = (1.8 + 0.4 + 1.0) / 3
2 1.0 1.20 # 1.20 = (0.4 + 1.0 + 2.2) / 3
3 2.2 1.70
4 1.9 1.03
5 -1.0 0.63
6 1.0 NaN
答案 1 :(得分:0)
当时我找到了以下代码:
def moving_average(samples, wind_len=1000):
wind_len = int(wind_len)
cumsum_samples = np.cumsum(samples)
cumsum_diff = cumsum_samples[wind_len:] - cumsum_samples[:-wind_len]
samples_average = cumsum_diff / float(wind_len)
return samples_average
def my_cumsum(samples):
for ind in range(1, len(samples)):
samples[ind] = samples[ind] + samples[ind - 1]