You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用agg实现DataFrame月度复合涨跌幅计算(基于日涨跌幅)

用agg方法计算DataFrame的月度复合涨跌幅

嘿,这个需求我之前实操过,用agg配合分组和自定义函数就能轻松搞定,咱们一步步来:

步骤1:确保日期列是datetime类型

首先得把你的日期列转换成pandas的datetime格式,不然没法正确按月份分组:

import pandas as pd
df['date'] = pd.to_datetime(df['date'])

步骤2:定义月度复合涨跌幅的计算函数

按照你提到的((1+x).cumprod()-1)逻辑,我们可以写一个自定义函数,接收某一个月的日涨跌幅序列,返回该月的复合涨跌幅:

def calculate_monthly_compound(pct_series):
    # 计算累积乘积后减1,取最后一个值就是当月的复合涨跌幅
    return (1 + pct_series).cumprod().iloc[-1] - 1

小贴士:如果你的日涨跌幅是百分比数值(比如5代表5%),记得先除以100,比如改成(1 + pct_series/100).cumprod().iloc[-1] - 1

步骤3:分组+agg调用自定义函数

接下来按月份分组,用agg指定要计算的列和对应的函数:

# 按月度周期分组,结果索引为YYYY-MM格式的周期类型
monthly_compound_returns = df.groupby(df['date'].dt.to_period('M')).agg(
    monthly_compound_return=('daily_pct_change', calculate_monthly_compound)
)

# 如果你想要字符串格式的月份索引(比如'2023-01'),可以用strftime:
# monthly_compound_returns = df.groupby(df['date'].dt.strftime('%Y-%m')).agg(
#     monthly_compound_return=('daily_pct_change', calculate_monthly_compound)
# )

示例验证

我们可以构造一个简单的测试数据来验证:

# 构造示例DataFrame
dates = pd.date_range('2023-01-01', periods=15, freq='D')
daily_pct = [0.01, 0.005, -0.003, 0.02] * 3 + [0.008]
df = pd.DataFrame({'date': dates, 'daily_pct_change': daily_pct})

# 运行计算
monthly_compound_returns = df.groupby(df['date'].dt.to_period('M')).agg(
    monthly_compound_return=('daily_pct_change', calculate_monthly_compound)
)

print(monthly_compound_returns)

运行后会输出1月份的复合涨跌幅结果,和手动计算的(1.01*1.005*0.997*1.02*...)-1完全一致。

内容的提问来源于stack exchange,提问作者Rami Ramich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:42:01