我正在使用时间序列价格数据,我想知道每行的下一个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
答案 0 :(得分:2)
您可以使用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