2017-05-11 46 views
0

我正在處理時間序列價格數據,我想知道每行的下一個K行可以達到多高的價格。在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 
+0

你有樣本數據幀? –

+0

@ScottBoston,當然,加了一個。 – d9ngle

回答

1

你可以做到這一點使用熊貓滾滾和換檔功能。

基本上你找到滾動最大超過先前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 
+0

我收到'AttributeError:'Series'對象在'res = ts.rolling(k).max()。shift(-k)'上沒有屬性'rolling''' – d9ngle

+0

需要升級熊貓。 – d9ngle

+0

很高興幫助。對於老版本的熊貓,您可以使用rolling_max:http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_max.html – FLab

相關問題