【问题标题】:How does pandas rolling_mean() work?熊猫 rolling_mean() 是如何工作的?
【发布时间】:2016-07-14 19:57:33
【问题描述】:

我需要使用移动平均线来平滑我的数据,所以我编写了一个使用卷积的函数。但与我的原始数据相比,结果是左移。所以我使用了 pandas 内置的rolling_mean(),它工作得很好。问题是我不想使用 pandas 并且我正在尝试重写这个函数,但是源代码没有解释它是如何工作的(或者可能只是我)。

我原来的功能是

def moving_average(data, window):
    return np.convolve(data, np.ones(window)/window, mode='valid')

pandasrolling_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”,但不知道它是如何工作的。 蓝色是原始数据,绿色是我的尝试,红色(正确)版本来自 pandas。

【问题讨论】:

    标签: python pandas moving-average


    【解决方案1】:

    没有一种正确的方法可以平滑数据,即使您使用的是平均值,仍然存在很多变化。不过,换档是简单滚动方式的常见结果。

    您从pandas.rolling_mean 发布的那段代码没有显示操作;您可以看到它指定的位置,例如how=how,它正在传递一个未包含在您的 sn-p 中的参数以确定它使用的方法。它还引用了cython,所以我假设命令的核心是用 C 语言编写的,而不是用 Python 编写的(很常见,因为它要快得多)。

    我没有去寻找底层代码,因为rolling_mean 没有太多文档并且 不推荐启动。相反,请查看最新版 Pandas 中的rolling,它会告诉您它可以做什么类型的平滑器。您可以尝试将这些参数传递给rolling 函数并查看哪个参数符合您的要求;然后您可以从您选择的来源查找其背后的数学原理,以便在其他地方重现。

    我不知道原始发帖人的经验水平,但对于阅读本文的人来说,可能并不精通信号处理或数据平滑,从趋势中分离噪声是一个巨大的研究领域。但是,在执行此操作时要非常小心,因为结果对方法非常敏感。对于其他一些人,除了 Pandas 提供的所有滚动功能外,还可以查看 Holt-Winters、Baxter-King 或 Hodrick-Prescott。他们都以不同的方式解决问题,具有非常不同的结果、优势和劣势。

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2018-12-23
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多