获取滚动 window 是否增加或减少

Get if a rolling window is increasing or decreasing

我有一只熊猫的 DataFrame,我想针对其中一列移动 window 的每个间隔计算该间隔内的数据是增加还是减少。对于增加/减少,我的意思是计算最后一个元素减去第一个元素的符号。

目前我有这个解决方案:

sign = data['col'].rolling('5d').apply(lambda x: np.sign(x[-1] - x[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(这里我假设您每天都有一个数据点)。矢量运算比使用滚动

要快得多

通过使用内存成本 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'])