如何用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
相关产品推荐
相关产品推荐

