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