Pandas滚动适用于更新系列以进行下一次迭代?

时间:2016-08-03 01:22:41

标签: python pandas apply

我有以下系列s,我想滚动应用自定义函数" test",并立即将结果更新为s,以便下一次迭代" test"基于更新的s。让我带你走过我的例子:

s = pd.Series(range(5), index=pd.date_range('1/1/2000', periods=5))
s 
2000-01-01    0
2000-01-02    1
2000-01-03    2
2000-01-04    3
2000-01-05    4
Freq: D, dtype: int32

我的自定义功能如下。这只是我真实案例的简化示例。我们可以在第一次迭代中看到返回的变量' update'设置为100,我希望s更新为[0,1,100,3,4,....]。对于下一次迭代,arr.sum()将基于(1 + 100 + 3)而不是(1 + 2 + 3)计算。

def test(arr):
    print(arr)
    print(arr.sum())
    if arr.sum()%3==0:
        print('True')
        update=100
    else:
        update=arr[-1]
    return update
s=s.rolling(window=3).apply(test)

[ 0.  1.  2.]
3.0
True
[ 1.  2.  3.]
6.0
True
[ 2.  3.  4.]
9.0
True

理想输出:

[ 0.  1.  2.]
3.0
True

'Update s with 100'
[ 1.  100.  3.]
104

[ 100.  3.  4.]
107

1 个答案:

答案 0 :(得分:0)

我认为dataframe.rolling仅在原始数据框架上运行,它实际上提供了滚动转换。如果在数据框的滚动窗口中修改了任何数据,则不会在相应的滚动窗口中更新。

其实我在这里遇到同样的问题。到目前为止,我使用的替代方法是手动遍历每个滚动窗口,并将逻辑放在循环中。我知道它很慢,但我不知道是否有更好的方法来做到这一点。

顺便说一下,其他人也提出同样的问题: Sliding window iterator using rolling in pandas

Why doesn't my pandas rolling().apply() work when the series contains collections?