2017-06-16 215 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)即可。