我想实现一种计算方法,例如一个简单的场景:
值计算为前N天的每日数据总和(在以下示例中设置N = 3)
Dataframe df :( df.index是'date')
date value
20140718 1
20140721 2
20140722 3
20140723 4
20140724 5
20140725 6
20140728 7
......
做计算如下:
date value new
20140718 1 0
20140721 2 0
20140722 3 0
20140723 4 6 (3+2+1)
20140724 5 9 (4+3+2)
20140725 6 12 (5+4+3)
20140728 7 15 (6+5+4)
......
现在我已经使用了循环,如:
df['value']=[0]*len(df)
for idx in df.index
loc=df.index.get_loc(idx)
if((loc-N)>=0):
tmp=df.ix[df.index[loc-3]:df.index[loc-1]]
sum=tmp['value'].sum()
else:
sum=0
df['new'].ix(idx)=sum
但是,当数据帧的长度或N的值非常长/大时,这些计算将非常慢......我如何使用函数或其他方式更快地实现它? 此外,如果情景更复杂?怎么样 ?感谢。
答案 0 :(得分:0)
由于你想要除前一个之前的三个之和,你可以在四个窗口上使用rolling_apply
并总结除最后一个值以外的所有值。
new = rolling_apply(df, 4, lambda x:sum(x[:-1]), min_periods=4)
这与之后用三个窗口移动相同:
new = rolling_apply(df, 3, sum, min_periods=3).shift()
然后
df["new"] = new["value"].fillna(0)