Python 按组别划分的年化回报率
我有月报,想分两组计算年化收益。下面是示例数据Python 按组别划分的年化回报率,python,pandas,dataframe,Python,Pandas,Dataframe,我有月报,想分两组计算年化收益。下面是示例数据 Return_M Rise 0.097425 1 0.188547 1 -0.1509 1 0.28011 1 -0.09596 1 0.041459 1 0.106838 1 0.046581 0 -0.16068 0 0.009242 0 0.006104 0 -0.00709 0 0.050352 0 -0.01023 0 -0.00731 0
Return_M Rise
0.097425 1
0.188547 1
-0.1509 1
0.28011 1
-0.09596 1
0.041459 1
0.106838 1
0.046581 0
-0.16068 0
0.009242 0
0.006104 0
-0.00709 0
0.050352 0
-0.01023 0
-0.00731 0
0.031946 0
0.048552 0
这是我尝试过的,但代码实际上不是按组计算df1的长度。我希望有一种方法可以广泛应用
df2=df1.groupby(['Rise'])[['Return\u M']]应用(lambda x:np.prod(1+x)**(12/len(x))
这是预期输出:
Rise Return_M
1 0.249862
0 -0.00443
您只需在
Rise
列中选择groupby
,然后在Return\M
列中进行聚合
以下代码段假设您想除以12(基于您的问题)
但是,如果您需要基于每组<代码>上升记录数量的平均值,您可以简单地执行以下操作:
df2 = df1.groupby('Rise').agg('Return_M': 'mean')
编辑:根据OP的评论编辑答案:
要根据您的公式获得几何年化回报率,以下公式将起作用:
df.groupby('Rise').Return_M.apply(lambda x: (1+x).product() ** (12/float(len(x))))
但是,输出与您在问题中发布的预期输出不同:
Rise
0 0.986765
1 1.952498
然而,根据您描述的公式,这正是正确的输出
对于Rise=1
,我也手动进行了此计算:
- 我取每个(1加上
)值的乘积Return\M
- 将乘积提高到(12除以组的长度,此组为7)
(1+0.097425)*(1+0.188547)*(1+-0.1509)*(1+0.28011)*(1+-0.09596)*(1+0.041459)*(1+0.106838)=1.4774446702
1.4774446702^(12/7)=1.9524983367
所以只要检查一下你的逻辑是否正确。如果这个答案解决了您的问题,请将其标记为已接受。您可以发布您的预期输出吗?我刚刚为答案添加了预期输出。我认为我必须使用apply方法来计算几何累积收益率,但这种方法不适用。你的方法是计算算术平均值。@罗杰,我认为你应该在问题中添加更多细节,以获得更完整、更准确的答案。你能提供几何累积回报率的计算细节吗?@Roger我已经更新了我的答案,以满足你的需要。您只需在
Rise
列中按分组,然后在Return\M
列中聚合值。
Rise
0 0.986765
1 1.952498