我以基本上随机的间隔采样数据。我想用numpy(或其他python包)计算加权移动平均数。我有一个移动平均线的粗略实现,但我无法找到一个加权移动平均线的好方法,因此朝向中心的值的权重大于边缘的值。python中的加权移动平均数
这里我生成一些样本数据,然后取一个移动平均值。我怎样才能最轻松地实现加权移动平均线?谢谢!
import numpy as np
import matplotlib.pyplot as plt
#first generate some datapoint for a randomly sampled noisy sinewave
x = np.random.random(1000)*10
noise = np.random.normal(scale=0.3,size=len(x))
y = np.sin(x) + noise
#plot the data
plt.plot(x,y,'ro',alpha=0.3,ms=4,label='data')
plt.xlabel('Time')
plt.ylabel('Intensity')
#define a moving average function
def moving_average(x,y,step_size=.1,bin_size=1):
bin_centers = np.arange(np.min(x),np.max(x)-0.5*step_size,step_size)+0.5*step_size
bin_avg = np.zeros(len(bin_centers))
for index in range(0,len(bin_centers)):
bin_center = bin_centers[index]
items_in_bin = y[(x>(bin_center-bin_size*0.5)) & (x<(bin_center+bin_size*0.5))]
bin_avg[index] = np.mean(items_in_bin)
return bin_centers,bin_avg
#plot the moving average
bins, average = moving_average(x,y)
plt.plot(bins, average,label='moving average')
plt.show()
输出:
使用从crs17建议在np.average功能用“权重=”,我想出了加权平均函数,它使用一个高斯函数对数据进行加权:
def weighted_moving_average(x,y,step_size=0.05,width=1):
bin_centers = np.arange(np.min(x),np.max(x)-0.5*step_size,step_size)+0.5*step_size
bin_avg = np.zeros(len(bin_centers))
#We're going to weight with a Gaussian function
def gaussian(x,amp=1,mean=0,sigma=1):
return amp*np.exp(-(x-mean)**2/(2*sigma**2))
for index in range(0,len(bin_centers)):
bin_center = bin_centers[index]
weights = gaussian(x,mean=bin_center,sigma=width)
bin_avg[index] = np.average(y,weights=weights)
return (bin_centers,bin_avg)
结果看起来不错:
尝试搜索与数字低通滤波器的权重有关的信息。 –
您已经在熊猫中实现了[指数加权矩函数](http://pandas.pydata.org/pandas-docs/dev/computation.html#exponentially-weighted-moment-functions)。 –