如何在含缺失值的时间序列上适配pmdarima auto_arima?
处理含缺失值时间序列的auto_arima替代方案(无需插补)
如果你不想使用插补值,又要利用pmdarima的自动参数搜索能力处理含NaN的周粒度时间序列,有以下几个可行方案:
方案1:用pmdarima选参数,statsmodels状态空间ARIMA拟合
pmdarima的auto_arima核心是自动搜索最优ARIMA阶数(包括季节性参数),而statsmodels的状态空间ARIMA支持直接拟合含缺失值的数据。可以拆分两步操作:
- 第一步:临时清理数据中的NaN(比如删除含缺失值的行),用这部分干净数据跑
auto_arima,得到最优的order和seasonal_order参数。 - 第二步:将原始含NaN的完整时间序列传入statsmodels的
ARIMA模型,指定method='statespace',并用第一步得到的参数进行拟合。
示例代码:
import pmdarima as pm import statsmodels.api as sm # 假设ts是含NaN的周粒度时间序列 ts_clean = ts.dropna() # 用干净数据自动搜索最优参数 auto_model = pm.auto_arima(ts_clean, seasonal=True, m=52) # m=52对应周粒度季节性 best_order = auto_model.order best_seasonal_order = auto_model.seasonal_order # 用原始含NaN数据拟合状态空间ARIMA final_model = sm.tsa.ARIMA(ts, order=best_order, seasonal_order=best_seasonal_order) results = final_model.fit(method='statespace')
方案2:自定义带缺失值支持的自动参数搜索
如果担心临时清理数据会影响参数选择的准确性,可以基于pmdarima的搜索逻辑,替换内部的拟合函数为statsmodels的状态空间ARIMA,让整个搜索过程直接处理含缺失值的数据。
- 复用pmdarima的
stepwise或random搜索策略,将每一步的模型拟合替换为支持NaN的statsmodels实现,无需预处理数据就能完成参数搜索和模型拟合。
示例思路(简化版):
from pmdarima.arima import StepwiseContext import statsmodels.api as sm # 自定义拟合函数,使用statsmodels状态空间ARIMA def fit_statespace_arima(y, order, seasonal_order): model = sm.tsa.ARIMA(y, order=order, seasonal_order=seasonal_order) return model.fit(method='statespace') # 替换pmdarima默认拟合逻辑,直接处理含NaN的数据 with StepwiseContext(fit=fit_statespace_arima): auto_model = pm.auto_arima(ts, seasonal=True, m=52) # ts为含NaN的原始数据
方案3:仅删除连续缺失段,保留单点缺失
如果缺失值是分散的单点(而非连续多周缺失),可以仅删除连续缺失的极端情况,保留单点缺失的数据集来跑auto_arima。单点缺失对ARIMA参数选择的影响极小,后续用statsmodels状态空间ARIMA拟合时仍能处理这些单点缺失。
内容的提问来源于stack exchange,提问作者Elis
相关产品推荐
相关产品推荐

