我有一个熊猫的DataFrame
,我想为移动窗口沿其某一列的每个间隔计算该间隔内的数据是增加还是减少。对于增加/减少,我的意思是计算最后一个元素的符号减去第一个元素。
目前,我有以下解决方案:
sign = data['col'].rolling('5d').apply(lambda x: np.sign(x[-1] - x[0]))
此实现的问题是,对于长系列而言,它的运行速度极其慢。您是否有使用内置的优化功能的解决方案?
答案 0 :(得分:0)
如果对“ col”值进行统一采样,则可以应用类似于以下内容的值。
col = pandas.Series([1,-1,0,3,5,21,7,4,67,4,3,6,8,5,4])
sign = np.sign(col.values[0:-5] - col.values[5:])
基本上,您获取第一个N-window_len并减去最后一个N-window_len(这里我假设您每天都有一个数据点)。向量运算比使用滚动运算要快得多
答案 1 :(得分:0)
使用内存成本rolling
函数只会使第一个值和最后一个值有所不同,这会降低整个过程的速度,这里我使用的是merge_asof
s=df[['COL']].shift(4,freq='D')
s=pd.merge_asof(df,s,left_index=True,right_index=True,tolerance=pd.Timedelta('5d'),direction='forward')
np.sign(s['COL_x']-s['COL_y'])