我有一个大小为(80219 * 5)的Pandas数据帧,其结构与我上传的图像相同。每个公司的数据范围可以从2002年到2016年,但如果出现缺失值,则数据要么在较晚的日期开始,要么在较早的日期结束,如图所示。
我想做的是计算每家公司从6月到6月的年度复合回报。如果特定公司在6月至6月的整个12个月内没有数据,则结果应为nan
。以下是我目前的代码,但我不知道如何计算从6月到6月的回报。
加载文件并清理后我:
df[['Returns']] = df[['Returns']].apply(pd.to_numeric)
df['Names Date'] = pd.to_datetime(df['Names Date'])
df['Returns'] = df['Returns']+ 1
df = df[['Company Name','Returns','Names Date']]
df['year']=df['Names Date'].dt.year
df['cum_return'] = df.groupby(['Company Name','year']).cumprod()
df = df.groupby(['Company Name','year']).nth(11)
print(tabulate(df, headers='firstrow', tablefmt='psql'))
计算从1月1日到12月31日的年度回报。
答案 0 :(得分:0)
我终于找到了办法。我能找到的最简单的方法是计算每个月的滚动12个月复合回报,然后对数据帧进行切片,以便给出我想要的月份的12个月回报:
def myfunc(arr):
return np.cumprod(arr)[-1]
cum_ret = pd.Series()
grouped = df.groupby('Company Name')
for name, group in grouped:
cum_ret = cum_ret.append(pd.rolling_apply(group['Returns'],12,myfunc))
df['Cum returns'] = cum_ret
df = df.loc[df['Names Date'].dt.month==6]
df['Names Date'] = df['Names Date'].dt.year