2017-06-16 216 views
2

我有一組股票市場數據,在下面進行採樣。計算日期範圍內的Python Pandas數據框的最大值

我想在每5天的時間內計算MAX'close'的價格。

symbol date open high low close volume 
AAU 1-Jan-07 2.25 2.25 2.25 2.25 0 
AAU 2-Jan-07 2.25 2.25 2.25 2.25 0 
AAU 3-Jan-07 2.32 2.32 2.26 2.26 39800 
AAU 4-Jan-07 2.29 2.35 2.27 2.32 114200 
AAU 5-Jan-07 2.32 2.32 2.26 2.27 113600 
AAU 8-Jan-07 2.27 2.35 2.1 2.33 84500 
AAU 9-Jan-07 2.31 2.31 2.21 2.23 54200 
AAU 10-Jan-07 2.24 2.3 2.2 2.3 29000 
AAU 11-Jan-07 2.23 2.33 2.22 2.24 21400 
AAU 12-Jan-07 2.25 2.33 2.25 2.33 45200 

要做到這一點,我已經添加了一個新的列來計算的終止日期範圍(+5天):

df[‘1w_date'] = df[‘date'].shift(-6) 

然後DF看起來是這樣的:

symbol date open high low close volume 5d_date 
AAU 1-Jan-07 2.25 2.25 2.25 2.25 0 8-Jan-07 
AAU 2-Jan-07 2.25 2.25 2.25 2.25 0 9-Jan-07 
AAU 3-Jan-07 2.32 2.32 2.26 2.26 39800 10-Jan-07 
AAU 4-Jan-07 2.29 2.35 2.27 2.32 114200 11-Jan-07 
AAU 5-Jan-07 2.32 2.32 2.26 2.27 113600 12-Jan-07 
AAU 8-Jan-07 2.27 2.35 2.1 2.33 84500 15-Jan-07 
AAU 9-Jan-07 2.31 2.31 2.21 2.23 54200 16-Jan-07 
AAU 10-Jan-07 2.24 2.3 2.2 2.3 29000 17-Jan-07 
AAU 11-Jan-07 2.23 2.33 2.22 2.24 21400 18-Jan-07 
AAU 12-Jan-07 2.25 2.33 2.25 2.33 45200 19-Jan-07 

下一頁我將日期列設置爲df索引:

df = df.set_index(['date']) 

然後我試圖循環使用'date'作爲開始日期和'5d_date'作爲結束日期的每一行。

for i in df: 
    date_filter = df.loc[df[‘date’]:df[‘5d_date']] 
    df[‘min_value'] = min(date_filter['low']) 
    df[‘max_value'] = max(date_filter['high']) 

不幸的是我得到一個KeyError:'date'。

我嘗試了很多不同的方法,但無法弄清楚如何做到這一點。有誰知道如何解決這個問題,或者更好的方法嗎?

謝謝。

回答

1

在設置索引date,您可以使用pd.DataFrame.rolling

df.rolling('7d')['close'].mean() 
Out[93]: 
    date 
2007-01-01 2.250000 
2007-01-02 2.250000 
2007-01-03 2.253333 
2007-01-04 2.270000 
2007-01-05 2.270000 
2007-01-08 2.286000 
2007-01-09 2.282000 
2007-01-10 2.290000 
2007-01-11 2.274000 
2007-01-12 2.286000 
Name: close, dtype: float64 

,或者即使沒有這樣做,這取決於

df.rolling(5)['close'].mean() 
Out[94]: 
date 
2007-01-01  NaN 
2007-01-02  NaN 
2007-01-03  NaN 
2007-01-04  NaN 
2007-01-05 2.270 
2007-01-08 2.286 
2007-01-09 2.282 
2007-01-10 2.290 
2007-01-11 2.274 
2007-01-12 2.286 
Name: close, dtype: float64 

是否要一個星期(1),或五行數據(2)。

要在範圍的開始而不是結束時添加.shift(-4),如果您確實每星期每週確實有五天,則只需添加.shift(-4)即可。