Pandas分组计算:按年份分组求解每组的乘积转换值
Pandas按年份分组计算自定义复合指标
没问题,这个需求其实挺常见的,尤其是计算年度复合收益类指标的时候,我来一步步教你怎么实现:
第一步:准备数据并处理日期格式
首先得确保你的date列是datetime类型,不然没法正确提取年份。先构造你的DataFrame并转换日期:
import pandas as pd # 构造你提供的DataFrame df = pd.DataFrame({ 'value': [1.0, 0.3, 1.6, 2.5, -1.0, -0.3, 1.6], 'date': ['2010-01-31', '2010-02-28', '2011-03-31', '2011-04-30', '2012-05-31', '2012-06-30', '2013-07-31'] }) # 将date列转换为datetime类型 df['date'] = pd.to_datetime(df['date'])
第二步:按年份分组并计算目标指标
你的公式[(1 + v1) * (1 + v2) * ... * (1 + vn) - 1] * 100,可以简化为((1+value列).乘积 -1)*100,我们可以用两种方式实现:
方式一:自定义聚合函数
先写一个函数封装你的计算逻辑,再用groupby.apply()调用:
def calculate_compound_metric(group): # 对每组的value加1后求乘积,减1再乘100 return ((1 + group['value']).prod() - 1) * 100 # 按年份分组,应用自定义函数,最后重置索引得到清晰的结果 result = df.groupby(df['date'].dt.year).apply(calculate_compound_metric).reset_index(name='compound_result')
方式二:简洁的链式写法
如果不想写自定义函数,直接用agg()配合匿名函数更省事:
result = df.groupby(df['date'].dt.year)['value'].agg( lambda x: ((1 + x).prod() - 1) * 100 ).reset_index(name='compound_result')
最终结果
运行上面的代码后,result会输出:
year compound_result 0 2010 160.0 1 2011 810.0 2 2012 -100.0 3 2013 160.0
简单验证下:
- 2010年:
(1+1.0)*(1+0.3) = 2*1.3=2.6,(2.6-1)*100=160,正确 - 2012年:
(1-1.0)*(1-0.3)=0*0.7=0,(0-1)*100=-100,正确
内容的提问来源于stack exchange,提问作者Fizi
相关产品推荐
相关产品推荐

