获取具有相应索引值的每日数据帧的每月最大值
Posted
技术标签:
【中文标题】获取具有相应索引值的每日数据帧的每月最大值【英文标题】:Getting the monthly maximum of a daily dataframe with the corresponding index value 【发布时间】:2016-06-15 17:51:02 【问题描述】:我已经从雅虎财经下载了每日数据
Open High Low Close Volume \
Date
2016-01-04 10485.809570 10485.910156 10248.580078 10283.440430 116249000
2016-01-05 10373.269531 10384.259766 10173.519531 10310.099609 82348000
2016-01-06 10288.679688 10288.679688 10094.179688 10214.019531 87751700
2016-01-07 10144.169922 10145.469727 9810.469727 9979.849609 124188100
2016-01-08 10010.469727 10122.459961 9849.339844 9849.339844 95672200
...
2016-02-23 9503.120117 9535.120117 9405.219727 9416.769531 87240700
2016-02-24 9396.480469 9415.330078 9125.190430 9167.799805 99216000
2016-02-25 9277.019531 9391.309570 9199.089844 9331.480469 0
2016-02-26 9454.519531 9576.879883 9436.330078 9513.299805 95662100
2016-02-29 9424.929688 9498.570312 9332.419922 9495.400391 90978700
我想找出每个月的最高收盘价以及这个收盘价的日期。
使用 groupby dfM = df['Close'].groupby(df.index.month).max()
它会返回每月的最大值,但我会失去每日索引位置。
grouped by month
1 10310.099609
2 9757.879883
有没有保存索引的好方法?
我会寻找这样的结果:
grouped by month
2016-01-05 10310.099609
2016-02-01 9757.879883
【问题讨论】:
【参考方案1】:我的数据集是一个电力数据集,我只对我的 df 中的一列 kW
感兴趣。
这对我有用,可以在我的数据集中以 15 分钟的间隔找到每个月的 kW
的最大值。
max_kW_per_month = df.groupby(df.index.month)['kW'].agg(['idxmax', 'max'])
【讨论】:
【参考方案2】:您可以使用TimeGrouper
和groupby
一起获得每月的最大值:
from pandas.io.data import DataReader
aapl = DataReader('AAPL', data_source='yahoo', start='2015-6-1')
>>> aapl.groupby(pd.TimeGrouper('M')).Close.max()
Date
2015-06-30 130.539993
2015-07-31 132.070007
2015-08-31 119.720001
2015-09-30 116.410004
2015-10-31 120.529999
2015-11-30 122.570000
2015-12-31 119.029999
2016-01-31 105.349998
2016-02-29 98.120003
2016-03-31 100.529999
Freq: M, Name: Close, dtype: float64
使用idxmax
会得到最高价格的对应日期。
>>> aapl.groupby(pd.TimeGrouper('M')).Close.idxmax()
Date
2015-06-30 2015-06-01
2015-07-31 2015-07-20
2015-08-31 2015-08-10
2015-09-30 2015-09-16
2015-10-31 2015-10-29
2015-11-30 2015-11-03
2015-12-31 2015-12-04
2016-01-31 2016-01-04
2016-02-29 2016-02-17
2016-03-31 2016-03-01
Name: Close, dtype: datetime64[ns]
并排获取结果:
>>> aapl.groupby(pd.TimeGrouper('M')).Close.agg('max date': 'idxmax', 'max price': np.max)
max price max date
Date
2015-06-30 130.539993 2015-06-01
2015-07-31 132.070007 2015-07-20
2015-08-31 119.720001 2015-08-10
2015-09-30 116.410004 2015-09-16
2015-10-31 120.529999 2015-10-29
2015-11-30 122.570000 2015-11-03
2015-12-31 119.029999 2015-12-04
2016-01-31 105.349998 2016-01-04
2016-02-29 98.120003 2016-02-17
2016-03-31 100.529999 2016-03-01
【讨论】:
太棒了。非常感谢!然后我可以将索引更改为“最大日期”,我就在那里:-)pd.TimeGrouper('M')
不再有效。 AttributeError: module 'pandas' has no attribute 'TimeGrouper'
。你能用pd.Grouper
更新答案吗?以上是关于获取具有相应索引值的每日数据帧的每月最大值的主要内容,如果未能解决你的问题,请参考以下文章