我想将每日股票数据转换为季度数据。但是,使用重新采样不起作用,因为我有一个多索引,所以我希望最终的季度数据仍然包含单个股票(重新采样只是总结所有股票):
import pandas as pd dict1 = [ {'ticker':'jpm','date': '2016-11-27','returns': 0.2}, {'ticker':'jpm','date': '2016-11-28','returns': 0.2}, {'ticker':'ge','date': '2016-11-27','returns': 0.2}, {'ticker':'ge','date': '2016-11-28','returns': 0.2}, {'ticker':'amzn','date': '2016-11-27','returns': 0.2}, {'ticker':'amzn','date': '2016-11-28','returns': 0.2}, ] df1= pd.DataFrame(dict1) df1['date'] = pd.to_datetime(df1['date']) df1=df1.set_index(['date','ticker'], drop=True)
我的最终结果应该是:
Q42016 JPM 0.2 Q42016 GE 0.2 Q42016 AMZ 0.2
当我使用重新采样时,我得到:
Q42016 0.2
另外,我被 Pandas 0.18 困住了(说来话长)。任何帮助我都感激不尽。
第一个想法是DatetimeIndex通过转换ticker为列来创建,然后groupby使用resample:
DatetimeIndex
ticker
groupby
resample
df1 = df1.reset_index('ticker').groupby('ticker').resample('Q').mean() print (df1) returns ticker date amzn 2016-12-31 0.2 ge 2016-12-31 0.2 jpm 2016-12-31 0.2
另一个解决方案是Grouper:
Grouper
df1 = df1.groupby([pd.Grouper(freq='Q', level='date'), 'ticker']).mean() print (df1) returns date ticker 2016-12-31 amzn 0.2 ge 0.2 jpm 0.2
对于季度期间,使用assign,to_period然后按以下方式聚合groupby:
assign
to_period
df1 = (df1.reset_index() .assign(date = lambda x: x['date'].dt.to_period('Q')) .groupby(['date','ticker']) .mean()) print (df1) returns date ticker 2016Q4 amzn 0.2 ge 0.2 jpm 0.2