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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:57:04