python中的加权移动平均线

Dan*_*ein 16 python numpy scipy pandas

我有基本随机间隔采样的数据.我想用numpy(或其他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()
Run Code Online (Sandbox Code Playgroud)

输出: 数据和移动平均线

使用crs17的建议在np.average函数中使用"weights =",我得到了加权平均函数,它使用高斯函数来加权数据:

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)
Run Code Online (Sandbox Code Playgroud)

结果看起来不错: 使用numpy加权平均值

crs*_*s17 7

您可以使用numpy.average来指定权重:

>>> bin_avg[index] = np.average(items_in_bin, weights=my_weights)
Run Code Online (Sandbox Code Playgroud)

因此,要计算权重,您可以找到仓中每个数据点的x坐标,并计算它们到仓中心的距离.