【问题标题】:pd.rolling_mean becoming deprecated - alternatives for ndarrayspd.rolling_mean 被弃用 - ndarrays 的替代品
【发布时间】:2016-07-16 10:14:48
【问题描述】:

编辑:这个问题是在 2016 年提出的,并且在功能最终被删除后的几年后类似的问题已经发布,例如module 'pandas' has no attribute 'rolling_mean'

但是,问题涉及新 pd.rolling.mean() 的性能,并且应该保持打开状态,直到相关的 pandas issue 得到修复。


看起来pd.rolling_mean 正在被ndarrays 弃用,

 pd.rolling_mean(x, window=2, center=False)

FutureWarning: pd.rolling_mean 已被 ndarrays 弃用,将在未来的版本中删除

但根据this SO answer,这似乎是最快的方法。

现在是否有新的方法可以直接使用 SciPy 或 NumPy 来实现与 pd.rolling_mean 一样快的速度?

【问题讨论】:

  • 我仍然没有看到“ndarrays 的替代 rolling_mean 函数是什么?”问题的答案。这应该包含在 scipy 或 numpy 中,而无需依赖用于 Dataframes 的 Pandas 函数

标签: python numpy pandas scipy mean


【解决方案1】:

试试这个

x.rolling(window=2, center=False).mean()

【讨论】:

    【解决方案2】:

    我建议scipy.ndimage.filters.uniform_filter1d 像我的answer 一样链接问题。对于大型数组,它也更快:

    import numpy as np
    from scipy.ndimage.filters import uniform_filter1d
    N = 1000
    x = np.random.random(100000)
    
    %timeit pd.rolling_mean(x, window=N)
    __main__:257: FutureWarning: pd.rolling_mean is deprecated for ndarrays and will be removed in a future version
    The slowest run took 84.55 times longer than the fastest. This could mean that an intermediate result is being cached.
    1 loop, best of 3: 7.37 ms per loop
    
    %timeit uniform_filter1d(x, size=N)
    10000 loops, best of 3: 190 µs per loop
    

    【讨论】:

    • 如何将 pd.series(x) 用于 3D 数组。这里 x 是 3D numpy 数组。
    【解决方案3】:

    编辑 -- 不幸的是,新方法似乎没有那么快:

    新版熊猫:

    In [1]: x = np.random.uniform(size=100)
    
    In [2]: %timeit pd.rolling_mean(x, window=2)
    1000 loops, best of 3: 240 µs per loop
    
    In [3]: %timeit pd.Series(x).rolling(window=2).mean()
    1000 loops, best of 3: 226 µs per loop
    
    In [4]: pd.__version__
    Out[4]: '0.18.0'
    

    旧版本:

    In [1]: x = np.random.uniform(size=100)
    
    In [2]: %timeit pd.rolling_mean(x,window=2)
    100000 loops, best of 3: 12.4 µs per loop
    
    In [3]: pd.__version__
    Out[3]: u'0.17.1'
    

    【讨论】:

    • 好点,看起来你是对的。请参阅我的编辑。我将再次打开这个问题,看看是否有其他人在这里有一个保留旧速度的解决方案。
    • 糟透了!
    • 看这里:这应该只增加一点点函数调用开销,但这有一个不必要的内部块副本,很容易修复:github.com/pydata/pandas/issues/12732
    • 这是可怕的语法......我们从简单而简洁,变成了冗长和非 Python 的东西。
    • 我几乎同意 - 但新语法意味着我们可以将 any 函数应用于该窗口,而不仅仅是预先设定的函数。
    【解决方案4】:

    看起来新方法是通过 DataFrame.rolling 类上的方法(我猜你应该认为它有点像 groupby): http://pandas.pydata.org/pandas-docs/version/0.18.0/whatsnew.html

    例如

    x.rolling(window=2).mean()
    

    【讨论】:

    • 是的,我意识到了。应该在问题中包含这个。无论如何,事实证明它同样快,即使它需要首先明确地将x 转换为pd.Series(详细信息请参阅我的答案)。
    • 如何将 pd.series(x) 用于 3D 数组。这里 x 是 3D numpy 数组。
    【解决方案5】:

    如果您的尺寸是同质的,您可以尝试实现用于二维图像的Summed Area Table 的 n 维形式:

    面积求和表是一种数据结构和算法,用于在网格的矩形子集中快速有效地生成值的总和。

    那么,按照这个顺序,你可以:

    1. 创建数组的总面积表(“积分”);
    2. 迭代以获得给定位置的 n 维内核的(相当便宜的)总和;
    3. 除以内核的 n 维体积的大小。

    不幸的是,我不知道这是否有效,但根据给定的前提,它应该是。

    【讨论】:

    • 如何将 pd.series(x) 用于 3D 数组。这里 x 是 3D numpy 数组。
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多