pd.rolling_mean被弃用 - ndarrays的替代品

时间:2016-03-29 02:42:48

标签: python numpy pandas scipy mean

pd.rolling_mean

似乎已弃用ndarrays
 pd.rolling_mean(x, window=2, center=False)
     

FutureWarning:对于ndarrays,不推荐使用pd.rolling_mean,将来的版本将删除

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

现在有没有直接使用SciPy或NumPy执行此操作的新方法,其速度与pd.rolling_mean一样快?

5 个答案:

答案 0 :(得分:9)

编辑 - 不幸的是,看起来新的方式不是那么快:

新版熊猫:

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'

答案 1 :(得分:4)

看起来新的方法是通过DataFrame.rolling课程上的方法(我想你的意思是把它想象成groupby): http://pandas.pydata.org/pandas-docs/version/0.18.0/whatsnew.html

e.g。

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

答案 2 :(得分:1)

试试这个

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

答案 3 :(得分:0)

我建议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

答案 4 :(得分:-2)

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

  

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

然后,按此顺序,您可以:

  1. 创建数组的求和区域表(“整数”);
  2. 迭代获得给定位置的n维内核的(非常便宜)总和;
  3. 除以内核的n维体积的大小。
  4. 不幸的是,我不知道这是否有效,但在给定的前提下,它应该是。