在Pandas的下一个K连续行中找到最高值?

时间:2017-05-11 16:45:03

标签: python pandas

我正在使用时间序列价格数据,我想知道每行的下一个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

1 个答案:

答案 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