Pandas如何计算周数据对比前4周滚动均值的变化率
Pandas 单周数据对比前序4周滚动均值变化率计算方案
核心错误原因
你之前用shift()未得到正确结果的核心原因是偏移方向参数写反:要取当前行的上一行的滚动均值,需要传入正偏移量,负偏移量会取到下一行的值,完全匹配错计算基准。
偏移参数规则
shift()步长逻辑非常明确:
- 传入正整数
n:整列向下平移n行,当前行位置会取到原列中n行之前的历史值 - 传入负整数
-n:整列向上平移n行,当前行位置会取到原列中n行之后的未来值
正确实现代码
假设存储单周原始数据的列名为week_val(替换为你自己的实际列名即可),直接按如下逻辑计算:
import pandas as pd import numpy as np # 第一步:你已经完成的4周滚动均值计算,这部分不需要改 df['rolling_mean_fourweeks'] = df.rolling(4).mean().round(decimals=1) # 第二步:计算变化率,shift(1)取上一行的滚动均值作为计算基准 df['week_change_rate'] = (df['week_val'] / df['rolling_mean_fourweeks'].shift(1) - 1).round(2) # 可选:转换为百分比文本格式 df['week_change_rate_pct'] = df['week_change_rate'].apply(lambda x: f"{x*100:.0f}%" if pd.notna(x) else np.nan)
结果匹配校验
按上述代码计算的结果完全符合你的预期:
- 周序号3(即第4周):上一行是第3周,滚动窗口不足4个,
rolling_mean_fourweeks值为NaN,因此变化率计算结果为NaN - 周序号4(即第5周):上一行是第4周,对应第一个有效的4周滚动均值,代入计算即可得到约47%的正确结果
内容的提问来源于stack exchange,提问作者Zuko36
相关产品推荐
相关产品推荐

