我想把我每天的股票数据转换成季度数据。然而,使用重采样不起作用,因为我有一个多个索引,所以我希望我的最后一个季度数据仍然包含单个股票(重采样只是对所有这些股票进行总结):
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困住了(说来话长)。任何帮助都是非常感谢的。
发布于 2019-11-18 06:18:32
第一种方法是通过将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的解决方案
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聚合
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.2https://stackoverflow.com/questions/58908902
复制相似问题