pandas 与当前值偏差的滚动中值

nimxete2  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(121)

假设我有一个由时间戳索引的Pandas Dataframe ,对于每一个点,我需要计算未来5秒内的值与当前值之间的绝对差的中值。

df = pd.DataFrame({'A': [2, 1, 3, 4, -1, 2, -3, 5, 4, -10]},
    index=pd.date_range('2022-01-01', periods=10, freq='s'))

在输出中,第一个元素的索引为2022-01-01 00:00:00,值为11是如何计算的?在接下来的5秒内,我们得到的值为2,1,3,4,-1,2,因此与第一个元素的绝对差为0, 1, 1, 2, 3, 0,中值为1
如果这会更简单的话,我也很高兴知道在窗口是向后看的情况下的答案。看起来使用向前看的窗口有点麻烦。

kgsdhlau

kgsdhlau1#

使用rolling_apply

compute_function = lambda x: np.median(np.abs(x - x[0]))
out = df['A'].rolling('6S').apply(compute_function).shift(-5)
print(out)

# Output
2022-01-01 00:00:00    1.0
2022-01-01 00:00:01    2.0
2022-01-01 00:00:02    1.5
2022-01-01 00:00:03    1.5
2022-01-01 00:00:04    4.0
2022-01-01 00:00:05    NaN
2022-01-01 00:00:06    NaN
2022-01-01 00:00:07    NaN
2022-01-01 00:00:08    NaN
2022-01-01 00:00:09    NaN
Freq: S, Name: A, dtype: float64

这是因为你的时间序列中没有空洞(原因shift

更新来自@ilya(作者)的解决方案

compute_function = lambda x: (x - x[-1]).abs().median()
out = df[::-1].rolling('5S')['A'].apply(compute_function)[::-1]
print(out)

# Output
2022-01-01 00:00:00    1.0
2022-01-01 00:00:01    2.0
2022-01-01 00:00:02    1.0
2022-01-01 00:00:03    2.0
2022-01-01 00:00:04    3.0
2022-01-01 00:00:05    3.0
2022-01-01 00:00:06    7.0
2022-01-01 00:00:07    1.0
2022-01-01 00:00:08    7.0
2022-01-01 00:00:09    0.0
Freq: S, Name: A, dtype: float64

相关问题