熊猫:你能访问滚动窗口的项目吗?



是否可以访问熊猫滚动窗口对象。

rs = pd.Series(range(10))
rs.rolling(window = 3)
#print's 
Rolling [window=3,center=False,axis=0]

我可以得到作为组吗?:

[0,1,2]
[1,2,3]
[2,3,4]

一开始我就说这涉及到内部隐含。但是如果你真的真的想用和pandas一样的方法来计算索引。

您将需要v0.19.0rc1(即将发布),您可以conda install -c pandas pandas=0.19.0rc1

In [41]: rs = pd.Series(range(10))
In [42]: rs
Out[42]: 
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64
# this reaches into an internal implementation
# the first 3 is the window, then second the minimum periods we
# need    
In [43]: start, end, _, _, _, _ = pandas._window.get_window_indexer(rs.values,3,3,None,use_mock=False)
# starting index
In [44]: start
Out[44]: array([0, 0, 0, 1, 2, 3, 4, 5, 6, 7])
# ending index
In [45]: end
Out[45]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
# windo size
In [3]: end-start
Out[3]: array([1, 2, 3, 3, 3, 3, 3, 3, 3, 3])
# the indexers
In [47]: [np.arange(s, e) for s, e in zip(start, end)]
Out[47]: 
[array([0]),
 array([0, 1]),
 array([0, 1, 2]),
 array([1, 2, 3]),
 array([2, 3, 4]),
 array([3, 4, 5]),
 array([4, 5, 6]),
 array([5, 6, 7]),
 array([6, 7, 8]),
 array([7, 8, 9])]

所以这在固定窗口的情况下是微不足道的,这在可变窗口的情况下变得非常有用,例如在0.19.0中,你可以指定像2S这样的东西,例如按时间聚合。

说了这么多,获得这些索引器并不是特别有用。您通常希望对结果执行操作。这就是聚合函数的意义所在,如果您想进行一般聚合,则使用.apply

这是一个解决方法,但等待是否有人有熊猫解决方案:

def rolling_window(a, step):
    shape   = a.shape[:-1] + (a.shape[-1] - step + 1, step)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
rolling_window(rs, 3)
array([[ 0,  1,  2],
       [ 1,  2,  3],
       [ 2,  3,  4],
       [ 3,  4,  5],
       [ 4,  5,  6],
       [ 5,  6,  7],
       [ 6,  7,  8],
       [ 7,  8,  9],
       [ 8,  9, 10]])

在pandas 1.1中解决了这个问题,因为滚动对象现在是一个可迭代对象:

[window.tolist() for window in rs.rolling(window=3) if len(window) == 3]

最新更新