使用statsmodels的x13_arima_analysis遇X13Error,求解决方案
解决X13-ARIMA分析中exog参数的日期不匹配错误
问题场景
使用statsmodels库的sm.tsa.x13_arima_analysis测试外生变量(exog)参数时,触发如下错误:
statsmodels.tools.sm_exceptions.X13Error: ERROR: forecasts end date, 2018.Feb, must end on or before user-defined regression variables end date, 2017.Feb.
测试代码
import statsmodels.api as sm import pandas as pd import numpy as np import os datelist = pd.date_range(pd.to_datetime('2012-12-31'), periods=1500).tolist() date_df = pd.DataFrame(datelist, columns=['dates']) endog = pd.concat([date_df, pd.DataFrame(np.random.randint(0, 100, size=(1500, 1)), columns=list('a'))], axis=1) exog = pd.concat([date_df, pd.DataFrame(np.random.randint(0, 100, size=(1500, 1)), columns=list('b'))], axis=1) endog.index = endog.dates endog = endog.drop(['dates'], axis=1) exog.index = exog.dates exog = exog.drop(['dates'], axis=1) endog = endog.resample('M').mean() exog = exog.resample('M').mean() X13PATH = r'D:\EconomicDataSeasonalAdjustTool\X13\x13as' os.chdir(X13PATH) os.environ['X13PATH'] = X13PATH print(os.environ['X13PATH']) res = sm.tsa.x13_arima_analysis(endog=endog, exog=exog, x12path=X13PATH, print_stdout=True) print(res.seasadj) print(res.plot)
完整报错信息
Traceback (most recent call last): File "C:\Python\Python310\lib\site-packages\IPython\core\interactiveshell.py", line 3553, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-12-21406d809098>", line 12, in <cell line: 12> res = sm.tsa.x13_arima_analysis(endog=endog, exog=exog, x12path=X13PATH, print_stdout=True) File "C:\Users\LSTM\AppData\Roaming\Python\Python310\site-packages\pandas\util\_decorators.py", line 210, in wrapper return func(*args, **kwargs) File "C:\Users\LSTM\AppData\Local\Programs\Python\Python310\lib\site-packages\statsmodels\tsa\x13.py", line 518, in x13_arima_analysis _check_errors(errors) File "C:\Users\LSTM\AppData\Local\Programs\Python\Python310\lib\site-packages\statsmodels\tsa\x13.py", line 201, in _check_errors raise X13Error(errors) statsmodels.tools.sm_exceptions.X13Error: ERROR: forecasts end date, 2018.Feb, must end on or before user-defined regression variables end date, 2017.Feb.
错误原因
X13-ARIMA默认会对内生变量(endog)生成预测值,但你的外生变量(exog)时间序列的结束日期早于预测的结束日期,导致程序无法在预测阶段获取对应的外生变量值,从而触发冲突。
解决方案
方案1:关闭预测功能
如果不需要生成预测值,直接在调用函数时设置forecast=False,避免超出exog的日期范围:
res = sm.tsa.x13_arima_analysis(endog=endog, exog=exog, x12path=X13PATH, print_stdout=True, forecast=False)
方案2:延长外生变量覆盖预测期
如果需要保留预测,需将exog的时间序列延长至预测结束日期,并补充对应外生变量值(可根据业务场景选择填充方式,如下示例用均值填充):
# 查看endog的最后日期,确认预测结束日期 print(endog.index[-1]) # 生成需要补充的日期范围(示例为2017-03至2018-02,需根据实际预测结束日期调整) extend_dates = pd.date_range(start='2017-03-31', end='2018-02-28', freq='M') # 用原exog的均值填充新日期的外生变量值 extend_exog = pd.DataFrame(np.full((len(extend_dates), 1), exog['b'].mean()), index=extend_dates, columns=['b']) # 合并原exog与补充部分 exog_extended = pd.concat([exog, extend_exog]) # 使用扩展后的exog调用函数 res = sm.tsa.x13_arima_analysis(endog=endog, exog=exog_extended, x12path=X13PATH, print_stdout=True)
方案3:限制预测期数
通过forecast_periods参数指定预测期数,确保预测结束日期不超过exog的结束日期。例如若exog最后日期为2017-02,可设置预测期数为0:
res = sm.tsa.x13_arima_analysis(endog=endog, exog=exog, x12path=X13PATH, print_stdout=True, forecast_periods=0)
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

