seasonal_decompose需手动指定period、处理缺失值和异常值,加法模型适用于季节波动稳定的数据,乘法模型要求y>0且适合振幅随趋势增长的数据。

Statsmodels 的 seasonal_decompose 能做经典季节性分解(加法/乘法),但默认不支持自适应周期、不能处理缺失值、对异常值敏感——用之前必须手动确认周期和数据质量。
怎么选加法还是乘法模型?看趋势与季节波动是否随均值变化
加法模型适用于季节波动幅度基本稳定的情况,比如月度气温数据;乘法模型适合季节振幅随趋势增长的数据,比如零售销售额。如果原始序列存在接近零或负值,seasonal_decompose 会直接报错 ValueError: Multiplicative seasonality is not appropriate for zero and negative values. ——此时只能选 model="additive",或先对数据做平移/变换。
- 快速判断:画图观察
plt.plot(y),若峰谷间距明显变宽,优先试model="multiplicative" - 乘法模型内部会对数据取 log,所以要求所有
y > 0;加法模型无此限制 - 如果不确定,两个都跑一遍,对比残差的平稳性和自相关图(
plot_acf(resid))
周期 period 参数必须显式指定,不能靠采样频率自动推断
Statsmodels 不会从 DatetimeIndex 的频率(如 "M" 或 "D")自动识别季节周期。例如月度数据要设 period=12,周度数据是 period=52,日度数据若存在周周期则为 period=7。设错会导致趋势项扭曲、季节项错位。
- 常见错误:
period=1(默认值)→ 分解完全失效,季节项全为零 - 高频数据(如每小时)若存在日周期,
period=24;若有周周期叠加,需先用 STL 或其他方法 - 用
pd.infer_freq(df.index)辅助判断频率,但最终period值仍需人工映射(如 "M" → 12)
缺失值和异常值会让分解结果严重失真
seasonal_decompose 内部使用移动平均(MA)平滑趋势,一旦遇到 NaN 就中断计算,导致整个趋势项变成 NaN。即使只有一两个异常点(比如某月销量突增 10 倍),也会拉高局部 MA,污染后续季节估计。
立即学习“Python免费学习笔记(深入)”;
- 必须在调用前清洗:
y = y.dropna()或插值(y.interpolate(method="linear")) - 异常值建议用
scipy.stats.zscore或 IQR 法识别后替换为邻近均值,不要直接删除(会破坏时序连续性) - 若数据天然稀疏(如部分月份无记录),考虑改用
STL(statsmodels 0.12+ 支持)并设置robust=True
分解结果不是模型,不能直接用于预测
分解输出的 trend、seasonal、resid 是确定性成分,不带置信区间,也不拟合任何参数。它更适合诊断(比如发现季节模式是否稳定)、辅助建模(如将 seasonal 作为特征输入 SARIMAX),而不是替代预测模型。
- 别把
resid当白噪声直接扔掉——先检验其 ACF/Q-statistic(acorr_ljungbox(resid, lags=10)) - 若
resid明显自相关,说明分解没捕获全部结构,应换用STL或加入 ARIMA 残差修正 - 注意:
seasonal_decompose返回对象的.plot()方法不支持中文标签,需手动 set_title


















