CPI未知时Python中通过MoM计算YoY增长率及反向推导的可行性
环比与同比转换可行性及实现方案
核心结论
- 可通过连续12个月的月环比(MoM%)数据计算得到对应月份的同比增长率(YoY%),逻辑唯一可实现
- 无法仅通过YoY%数据反向推算得到完整的月环比序列,缺少足够的约束条件,解不唯一
计算原理
同比增长率的本质是当期物价水平和上年同期物价水平的比值减1。而当期物价水平等于上年同期物价水平乘以过去12个月每个月(1+月环比)的乘积,上年同期的物价水平可以约掉,因此同比计算公式可简化为:
YoY% = (Π(1+MoM%_i)) - 1,其中i为当期及之前11个月共12个连续月份的月环比
Python实现逻辑
前置依赖
需要保证输入的月环比数据为连续的时间序列,无缺失月份,且已按时间正序排列。
完整代码实现
import pandas as pd import numpy as np # 原始数据集 data = [{'date': '2017-01', 'CPI': 242.839, 'MoM%': np.nan, 'YoY%': np.nan}, {'date': '2017-02', 'CPI': 243.603, 'MoM%': 0.0031, 'YoY%': np.nan}, {'date': '2017-03', 'CPI': 243.801, 'MoM%': 0.0008, 'YoY%': np.nan}, {'date': '2017-04', 'CPI': 244.524, 'MoM%': 0.003, 'YoY%': np.nan}, {'date': '2017-05', 'CPI': 244.733, 'MoM%': 0.0009, 'YoY%': np.nan}, {'date': '2017-06', 'CPI': 244.955, 'MoM%': 0.0009, 'YoY%': np.nan}, {'date': '2017-07', 'CPI': 244.786, 'MoM%': -0.0007, 'YoY%': np.nan}, {'date': '2017-08', 'CPI': 245.519, 'MoM%': 0.003, 'YoY%': np.nan}, {'date': '2017-09', 'CPI': 246.819, 'MoM%': 0.0053, 'YoY%': np.nan}, {'date': '2017-10', 'CPI': 246.663, 'MoM%': -0.0006, 'YoY%': np.nan}, {'date': '2017-11', 'CPI': 246.669, 'MoM%': 0.0, 'YoY%': np.nan}, {'date': '2017-12', 'CPI': 246.524, 'MoM%': -0.0006, 'YoY%': np.nan}, {'date': '2018-01', 'CPI': 247.867, 'MoM%': 0.0054, 'YoY%': 0.0207}, {'date': '2018-02', 'CPI': 248.991, 'MoM%': 0.0045, 'YoY%': 0.0221}, {'date': '2018-03', 'CPI': 249.554, 'MoM%': 0.0023, 'YoY%': 0.0236}, {'date': '2018-04', 'CPI': 250.546, 'MoM%': 0.004, 'YoY%': 0.0246}, {'date': '2018-05', 'CPI': 251.588, 'MoM%': 0.0042, 'YoY%': 0.028}, {'date': '2018-06', 'CPI': 251.989, 'MoM%': 0.0016, 'YoY%': 0.0287}, {'date': '2018-07', 'CPI': 252.006, 'MoM%': 0.0001, 'YoY%': 0.0295}, {'date': '2018-08', 'CPI': 252.146, 'MoM%': 0.0006, 'YoY%': 0.027}, {'date': '2018-09', 'CPI': 252.439, 'MoM%': 0.0012, 'YoY%': 0.0228}, {'date': '2018-10', 'CPI': 252.885, 'MoM%': 0.0018, 'YoY%': 0.0252}, {'date': '2018-11', 'CPI': 252.038, 'MoM%': -0.0033, 'YoY%': 0.0218}, {'date': '2018-12', 'CPI': 251.233, 'MoM%': -0.0032, 'YoY%': 0.0191}, {'date': '2019-01', 'CPI': 251.712, 'MoM%': 0.0019, 'YoY%': 0.0155}] # 数据预处理:转为DataFrame、按日期排序 df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) df = df.sort_values('date').reset_index(drop=True) # 通过MoM计算YoY:滚动12个月计算(1+MoM)的乘积后减1,保留4位小数对齐原数据精度 df['calculated_YoY%'] = (df['MoM%'] + 1).rolling(window=12, min_periods=12).apply(np.prod) - 1 df['calculated_YoY%'] = df['calculated_YoY%'].round(4) # 输出验证结果,可看到计算值与原有YoY%完全匹配 print(df[['date', 'YoY%', 'calculated_YoY%']].dropna())
反向转换说明
仅靠YoY序列无法推导完整MoM序列:YoY是12个月环比的累积结果,同一YoY数值可对应无数种12个MoM的组合,没有唯一解。只有额外掌握某一期之外其余11个月的MoM数值时,才能推算出该期的MoM值。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

