我需要使用移动平均线来平滑我的数据,所以我使用卷积编写了一个函数。但与原始数据相比,结果是左移。所以我使用了熊猫内置的rolling_mean()
,它运行得很好。问题是我不想使用熊猫,我试图重写这个功能,但源代码并没有解释它是如何工作的(或者可能只是我)。
我原来的功能是
def moving_average(data, window):
return np.convolve(data, np.ones(window)/window, mode='valid')
pandas rolling_mean()
的源代码是:
def f(arg, window, min_periods=None, freq=None, center=False, how=how,
**kwargs):
def call_cython(arg, window, minp, args=(), kwargs={}, **kwds):
minp = check_minp(minp, window)
return func(arg, window, minp, **kwds)
return _rolling_moment(arg, window, call_cython, min_periods, freq=freq,
center=center, how=how, **kwargs)
关键是论证" center",但我不知道它是如何运作的。 蓝色是原始数据,绿色是我的尝试,红色(正确)版本来自熊猫。
答案 0 :(得分:1)
没有一种正确的方法来平滑数据,即使你使用平均值,仍然会有很多变化。换挡是一种非常普遍的结果,虽然是简单的滚动方式。
您从pandas.rolling_mean
发布的代码位未显示操作;您可以看到它指定的位置,例如how=how
它传递的参数未包含在您的代码段中以确定它使用的方法。它还引用了cython
所以我假设命令的内容是用C语言编写的,而不是用Python编写的(通常因为它的速度要快得多)。
我没有去寻找底层代码,因为rolling_mean
没有太多文档而且不赞成启动。而是从最新版本的Pandas中查看rolling,它会告诉您它可以做什么类型的平滑器。您可以尝试将这些参数传递到rolling
函数中,并查看哪一个符合您的要求;那么你可以从你选择的来源中查找背后的数学,以便在其他地方重现。
我不知道原始海报的经验水平,但对于那些可能不太精通信号处理或数据平滑的人来说,将噪音与趋势分开是一个巨大的研究领域。当你这样做时要非常小心,因为结果对方法非常敏感。对于其他一些人,除了Pandas提供的所有滚动功能外,还可以看看Holt-Winters,Baxter-King或Hodrick-Prescott。他们都以不同的方式处理问题,结果,优点和缺点各不相同。