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

如何用Python Pandas计算基于基准年的月度及年度增长率

问题描述

现有如下DataFrame:

import numpy as np
import pandas as pd
from scipy import stats

df =  pd.DataFrame()

df['A'] = np.linspace(1000, 2000, 120)
df['B'] = np.linspace(1000, 3000, 120)
df['C'] = np.linspace(1000, 4000, 120)
df.index = pd.date_range('1/1/2012', periods=120, freq='MS', name='Date')

需要计算两类增长率:

  • 月度增长率:以2012年对应月份的数值为基准,即每个月的数值与2012年同月份数值对比的增长率
  • 年度最大增长率:以2012年各列的最大值为基准,即每年各列的最大值与2012年该列最大值对比的增长率

尝试的代码及问题:

avg_month_yoy = df.groupby(['month','year',])['A'].apply(  lambda v: 
v.sub(v.shift(1)).div(v.shift(1)).multiply(100).mean()
).reset_index()

得到的输出全为NaN,不符合预期格式。

期望的月度增长率输出格式:

date                          A                    B                                      --- year   month        
01-01-2012    (Xa@Jan2012-Xa@Jan2012)/Xa@Jan2012 (Xb@Jan2012-Xb@Jan2012)/Xb@Jan2012   ---  2012    Jan   
01-02-2012    (Xa@Feb2012-Xa@Feb2012)/Xa@Feb2012   (Xb@Feb2012-Xb@Feb2012)/Xb@Feb2012   --- 2012    Feb                         
            ...      ....     ....       ....       ....     ....
01-12-2022    (Xa@Dec2022-Xa@Dec2012)/Xa@Dec2012   (Xb@Dec2022-Xb@Dec2012)/Xb@Dec2012   ---  2012    Dec 

期望的年度最大增长率输出格式:

year      A                                 B                                              C        
   
2012 (Max.Xa@2012-Max.Xa@2012)/Max.Xa@2012 (Max.Xb@2012-Max.Xb@2012)/Max.Xb@2012    (Max.Xc@2012-Max.Xc@2012)/Max.Xc@2012   
2013 (Max.Xa@2013-Max.Xa@2012)/Max.Xa@2012 (Max.Xb@2013-Max.Xb@2012)/Max.Xb@2012    (Max.Xc@2013-Max.Xc@2012)/Max.Xc@2012
 ...     ...                       ...                     ...
2022 (Max.Xa@2022-Max.Xa@2012)/Max.Xa@2012 (Max.Xb@2022-Max.Xb@2012)/Max.Xb@2012    (Max.Xc@2022-Max.Xc@2012)/Max.Xc@2012
解决方案

1. 计算月度增长率(以2012年对应月份为基准)

思路

提取每个日期的月份,将2012年各月份的数值作为基准,通过按月份分组匹配基准值,计算每个日期的增长率。

代码实现

# 添加月份和年份列
df['month'] = df.index.month
df['year'] = df.index.year

# 获取2012年各月份的基准值
base_2012 = df[df['year'] == 2012].set_index('month')[['A', 'B', 'C']]

# 合并基准值并计算增长率
monthly_growth = df.merge(base_2012, on='month', suffixes=('', '_2012'))
monthly_growth[['A_growth', 'B_growth', 'C_growth']] = (
    monthly_growth[['A', 'B', 'C']].sub(monthly_growth[['A_2012', 'B_2012', 'C_2012']])
    .div(monthly_growth[['A_2012', 'B_2012', 'C_2012']])
    .multiply(100)
)

# 整理为期望格式,保留原日期索引,将月份转为英文缩写
monthly_growth = monthly_growth.set_index(df.index)[['A_growth', 'B_growth', 'C_growth', 'year', 'month']]
monthly_growth['month'] = monthly_growth.index.strftime('%b')

2. 计算年度最大增长率(以2012年各列最大值为基准)

思路

先计算每年各列的最大值,再提取2012年各列的最大值作为基准,计算每年最大值与基准的增长率。

代码实现

# 计算每年各列的最大值
yearly_max = df.groupby('year')[['A', 'B', 'C']].max()

# 获取2012年各列的最大值作为基准
base_max_2012 = yearly_max.loc[2012]

# 计算年度最大增长率
yearly_max_growth = (yearly_max.sub(base_max_2012)
                     .div(base_max_2012)
                     .multiply(100))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:33:27