使用statsmodels的STL做时序分解时报错无法从endog确定周期
报错解决方法:ValueError: Unable to determine period from endog
报错原因
statsmodels的STL分解需要明确时间序列的周期参数,当传入的序列索引无法被自动识别频率、或没有显式传入周期参数时就会触发该报错。
解决方案
两种方案选其一即可:
方案1:显式指定period参数
直接在STL调用时传入你数据对应的周期值,这是最稳妥的方案。比如你的数据是日度数据,若按周度季节性则周期为7,修改代码为:
STL(sdf, seasonal=21, period=7, robust=True)
方案2:补全时间索引的频率属性
先将数据索引转为可识别频率的DatetimeIndex,让STL自动推断周期:
- 先确认索引为DatetimeIndex类型
import pandas as pd sdf.index = pd.to_datetime(sdf.index)
- 为索引设置对应频率,比如样例为工作日频率则设置为'B':
sdf = sdf.asfreq('B')
设置完成后再调用STL即可自动识别周期。
额外注意事项
- STL要求
seasonal参数必须为奇数,你代码中写的20是偶数,调整完周期后记得把seasonal改成对应奇数,否则还会触发新的参数校验报错。 - 周期值需要匹配你的数据业务属性:日度数据常用周期为7(周季节性)、22(月工作日季节性)、365(年季节性),根据你的实际场景选择即可。
内容的提问来源于stack exchange,提问作者yunfei
相关产品推荐
相关产品推荐

