我有以下系列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
答案 0 :(得分:0)
我认为dataframe.rolling仅在原始数据框架上运行,它实际上提供了滚动转换。如果在数据框的滚动窗口中修改了任何数据,则不会在相应的滚动窗口中更新。
其实我在这里遇到同样的问题。到目前为止,我使用的替代方法是手动遍历每个滚动窗口,并将逻辑放在循环中。我知道它很慢,但我不知道是否有更好的方法来做到这一点。
顺便说一下,其他人也提出同样的问题: Sliding window iterator using rolling in pandasWhy doesn't my pandas rolling().apply() work when the series contains collections?