我正在处理一个时间序列价格数据,我想知道在接下来的K行中,每行的价格能达到多高。
我可以考虑在基于时间过滤数据帧时使用.argmax()
以某种方式实现它,但是必须有一个更简单的内置解决方案。
例如:
Price
1 $10
2 $11
3 $15
4 $18
5 $13
6 $4
7 $25
对于K=2,这里是我想要的:
Price Highest_In_Next_2_Rows
1 $10 $15
2 $11 $18
3 $15 $18
4 $18 $13
5 $13 $25
6 $4 $25
7 $25 NaN
最佳答案
您可以使用pandas滚动和移位功能来实现这一点。
从本质上讲,你可以找到前k个观测值上的滚动最大值,然后把序列移动k,这样t的最大值就是(t+1,…,t+k)上计算的最大值。
import pandas as pd
import numpy as np
ts = pd.Series([10, 11, 15, 18, 13, 4, 25])
k = 2
res = ts.rolling(k).max().shift(-k)
pd.concat([ts, res], axis = 1)
输出:
# 0 1
# 0 10 15.0
# 1 11 18.0
# 2 15 18.0
# 3 18 13.0
# 4 13 25.0
# 5 4 NaN
# 6 25 NaN
这个解的问题是它没有给出最后k个观测值的结果。
解决方法如下:
以相反的顺序考虑序列,并计算过去k个观测值的滚动最大值(当至少有一个观测值时给出结果)。
然后,由于您不希望包含今天的价格,所以您延迟了一天,然后您再次反转以返回到原始订单。
res = ts[::-1].rolling(k,1).max().shift(1)[::-1]
完全复制所需的输出:
# 0 1
#0 10 15.0
#1 11 18.0
#2 15 18.0
#3 18 13.0
#4 13 25.0
#5 4 25.0
#6 25 NaN