我想实现一个像这样的计算方法--一个简单的场景:
值计算为前N天的每日数据之和(在下面的示例中设置为N=3)
Dataframe:(df.index是“日期”)
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的值很长/很大时,这些计算将非常slow....How,我可以使用函数或其他方法更快地实现这一点吗?另外,如果情况更复杂呢?怎么做?谢谢。
发布于 2014-07-30 12:27:13
因为您想要前三项之和(不包括当前值),所以可以在4的窗口上使用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)https://stackoverflow.com/questions/25029583
复制相似问题