python的auto.arima()等价物

python的auto.arima()等价物,python,r,time-series,statsmodels,forecasting,Python,R,Time Series,Statsmodels,Forecasting,我试图用ARMA-ARIMA模型预测每周销售额。我在statsmodels中找不到用于调整顺序(p、d、q)的函数。目前R有一个函数forecast::auto.arima(),它将调整(p,d,q)参数 如何为我的型号选择正确的订单?python中是否有用于此目的的库?您可以实现多种方法: 包括aic和bic。根据它们的定义,(请参见和),这些标准会对模型中的参数数量进行惩罚。因此,您可以使用这些数字来比较模型。此外,scipy还具有对指定参数空间进行网格搜索的功能。因此,这样的工作流应该可以

我试图用ARMA-ARIMA模型预测每周销售额。我在
statsmodels
中找不到用于调整顺序(p、d、q)的函数。目前R有一个函数
forecast::auto.arima()
,它将调整(p,d,q)参数


如何为我的型号选择正确的订单?python中是否有用于此目的的库?

您可以实现多种方法:

  • 包括
    aic
    bic
    。根据它们的定义,(请参见和),这些标准会对模型中的参数数量进行惩罚。因此,您可以使用这些数字来比较模型。此外,scipy还具有对指定参数空间进行网格搜索的功能。因此,这样的工作流应该可以工作:

    def objfunc(order, exog, endog):
        from statsmodels.tsa.arima_model import ARIMA
        fit = ARIMA(endog, order, exog).fit()
        return fit.aic()
    
    from scipy.optimize import brute
    grid = (slice(1, 3, 1), slice(1, 3, 1), slice(1, 3, 1))
    brute(objfunc, grid, args=(exog, endog), finish=None)
    
    确保使用
    finish=None
    调用
    brute

  • 您可以从
    ARIMAResults
    获取
    pvalues
    。因此,一种阶跃算法很容易实现,其中模型的阶数在整个维度上增加,从而为添加的参数获得最低的p值

  • 用于交叉验证替代模型。最好的方法是将时间序列的尾部(比如最近5%的数据)保留在样本之外,并使用这些点获得拟合模型的测试误差

  • 实际上

    def objfunc(order,*params ):    
        from statsmodels.tsa.arima_model import ARIMA   
        p,d,q = order   
        fit = ARIMA(endog, order, exog).fit()  
        return fit.aic()    
    from scipy.optimize import brute
    grid = (slice(1, 3, 1), slice(1, 3, 1), slice(1, 3, 1))
    brute(objfunc, grid, args=params, finish=None)
    

    我编写了这些实用函数来直接计算pdq值 get_PDQ_parallel需要三个以时间戳(datetime)为索引的串行输入数据。n_作业将提供多个并行处理器。输出将是数据帧,aic和bic值在索引中的顺序=(P,D,Q) p和q范围为[0,12],而d范围为[0,1]

    import statsmodels 
    from statsmodels import api as sm
    from sklearn.metrics import r2_score,mean_squared_error
    from sklearn.utils import check_array
    from functools import partial
    from multiprocessing import Pool
    def get_aic_bic(order,series):
        aic=np.nan
        bic=np.nan
        #print(series.shape,order)
        try:
            arima_mod=statsmodels.tsa.arima_model.ARIMA(series,order=order,freq='H').fit(transparams=True,method='css')
            aic=arima_mod.aic
            bic=arima_mod.bic
            print(order,aic,bic)
        except:
            pass
        return aic,bic
    
    def get_PDQ_parallel(data,n_jobs=7):
        p_val=13
        q_val=13
        d_vals=2
        pdq_vals=[ (p,d,q) for p in range(p_val) for d in range(d_vals) for q in range(q_val)]
        get_aic_bic_partial=partial(get_aic_bic,series=data)
        p = Pool(n_jobs)
        res=p.map(get_aic_bic_partial, pdq_vals)  
        p.close()
        return pd.DataFrame(res,index=pdq_vals,columns=['aic','bic']) 
    
    可能的解决办法

    df=pd.read_csv("http://vincentarelbundock.github.io/Rdatasets/csv/datasets/AirPassengers.csv")
    
    # Define the p, d and q parameters to take any value between 0 and 2
    p = d = q = range(0, 2)
    print(p)
    
    
    import itertools
    import warnings
    
    # Generate all different combinations of p, q and q triplets
    pdq = list(itertools.product(p, d, q))
    print(pdq)
    
    # Generate all different combinations of seasonal p, q and q triplets
    seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
    
    print('Examples of parameter combinations for Seasonal ARIMA...')
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))
    Examples of parameter combinations for Seasonal ARIMA...
    SARIMAX: (0, 0, 1) x (0, 0, 1, 12)
    SARIMAX: (0, 0, 1) x (0, 1, 0, 12)
    SARIMAX: (0, 1, 0) x (0, 1, 1, 12)
    SARIMAX: (0, 1, 0) x (1, 0, 0, 12)
    
    y=df
    
    #warnings.filterwarnings("ignore") # specify to ignore warning messages
    
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(y,
                                                order=param,
                                                seasonal_order=param_seasonal,
                                                enforce_stationarity=False,
                                                enforce_invertibility=False)
    
                results = mod.fit()
    
                print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
            except:
                continue
    ARIMA(0, 0, 0)x(0, 0, 1, 12)12 - AIC:3618.0303991426763
    ARIMA(0, 0, 0)x(0, 1, 1, 12)12 - AIC:2824.7439963684233
    ARIMA(0, 0, 0)x(1, 0, 0, 12)12 - AIC:2942.2733127230185
    ARIMA(0, 0, 0)x(1, 0, 1, 12)12 - AIC:2922.178151133141
    ARIMA(0, 0, 0)x(1, 1, 0, 12)12 - AIC:2767.105066400224
    ARIMA(0, 0, 0)x(1, 1, 1, 12)12 - AIC:2691.233398643673
    ARIMA(0, 0, 1)x(0, 0, 0, 12)12 - AIC:3890.816777796087
    ARIMA(0, 0, 1)x(0, 0, 1, 12)12 - AIC:3541.1171286722
    ARIMA(0, 0, 1)x(0, 1, 0, 12)12 - AIC:3028.8377323188824
    ARIMA(0, 0, 1)x(0, 1, 1, 12)12 - AIC:2746.77973129136
    ARIMA(0, 0, 1)x(1, 0, 0, 12)12 - AIC:3583.523640623017
    ARIMA(0, 0, 1)x(1, 0, 1, 12)12 - AIC:3531.2937768990187
    ARIMA(0, 0, 1)x(1, 1, 0, 12)12 - AIC:2781.198675746594
    ARIMA(0, 0, 1)x(1, 1, 1, 12)12 - AIC:2720.7023088205974
    ARIMA(0, 1, 0)x(0, 0, 1, 12)12 - AIC:3029.089945668332
    ARIMA(0, 1, 0)x(0, 1, 1, 12)12 - AIC:2568.2832251221016
    ARIMA(0, 1, 0)x(1, 0, 0, 12)12 - AIC:2841.315781459511
    ARIMA(0, 1, 0)x(1, 0, 1, 12)12 - AIC:2815.4011044132576
    ARIMA(0, 1, 0)x(1, 1, 0, 12)12 - AIC:2588.533386513587
    ARIMA(0, 1, 0)x(1, 1, 1, 12)12 - AIC:2569.9453272483315
    ARIMA(0, 1, 1)x(0, 0, 0, 12)12 - AIC:3327.5177587522303
    ARIMA(0, 1, 1)x(0, 0, 1, 12)12 - AIC:2984.716706112334
    ARIMA(0, 1, 1)x(0, 1, 0, 12)12 - AIC:2789.128542154043
    ARIMA(0, 1, 1)x(0, 1, 1, 12)12 - AIC:2537.0293659293943
    ARIMA(0, 1, 1)x(1, 0, 0, 12)12 - AIC:2984.4555708516436
    ARIMA(0, 1, 1)x(1, 0, 1, 12)12 - AIC:2939.460958374472
    ARIMA(0, 1, 1)x(1, 1, 0, 12)12 - AIC:2578.7862352774437
    ARIMA(0, 1, 1)x(1, 1, 1, 12)12 - AIC:2537.771484229265
    ARIMA(1, 0, 0)x(0, 0, 0, 12)12 - AIC:3391.5248913820797
    ARIMA(1, 0, 0)x(0, 0, 1, 12)12 - AIC:3038.142074281268
    C:\Users\Dell\Anaconda3\lib\site-packages\statsmodels\base\model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
      "Check mle_retvals", ConvergenceWarning)
    ARIMA(1, 0, 0)x(0, 1, 0, 12)12 - AIC:2839.809192263449
    ARIMA(1, 0, 0)x(0, 1, 1, 12)12 - AIC:2588.50367175184
    ARIMA(1, 0, 0)x(1, 0, 0, 12)12 - AIC:2993.4630440139595
    ARIMA(1, 0, 0)x(1, 0, 1, 12)12 - AIC:2995.049216326931
    ARIMA(1, 0, 0)x(1, 1, 0, 12)12 - AIC:2588.2463284315304
    ARIMA(1, 0, 0)x(1, 1, 1, 12)12 - AIC:2592.80110502723
    ARIMA(1, 0, 1)x(0, 0, 0, 12)12 - AIC:3352.0350133621478
    ARIMA(1, 0, 1)x(0, 0, 1, 12)12 - AIC:3006.5493366627807
    ARIMA(1, 0, 1)x(0, 1, 0, 12)12 - AIC:2810.6423724894516
    ARIMA(1, 0, 1)x(0, 1, 1, 12)12 - AIC:2559.584031948852
    ARIMA(1, 0, 1)x(1, 0, 0, 12)12 - AIC:2981.2250436794675
    ARIMA(1, 0, 1)x(1, 0, 1, 12)12 - AIC:2959.3142304724834
    ARIMA(1, 0, 1)x(1, 1, 0, 12)12 - AIC:2579.8245645892207
    ARIMA(1, 0, 1)x(1, 1, 1, 12)12 - AIC:2563.13922589258
    ARIMA(1, 1, 0)x(0, 0, 0, 12)12 - AIC:3354.7462930846423
    ARIMA(1, 1, 0)x(0, 0, 1, 12)12 - AIC:3006.702997636003
    ARIMA(1, 1, 0)x(0, 1, 0, 12)12 - AIC:2809.3844175191666
    ARIMA(1, 1, 0)x(0, 1, 1, 12)12 - AIC:2558.484602766447
    ARIMA(1, 1, 0)x(1, 0, 0, 12)12 - AIC:2959.885810636943
    ARIMA(1, 1, 0)x(1, 0, 1, 12)12 - AIC:2960.712709764296
    ARIMA(1, 1, 0)x(1, 1, 0, 12)12 - AIC:2557.945907092698
    ARIMA(1, 1, 0)x(1, 1, 1, 12)12 - AIC:2559.274166458508
    ARIMA(1, 1, 1)x(0, 0, 0, 12)12 - AIC:3326.3285511700374
    ARIMA(1, 1, 1)x(0, 0, 1, 12)12 - AIC:2985.868532151721
    ARIMA(1, 1, 1)x(0, 1, 0, 12)12 - AIC:2790.7677149967103
    ARIMA(1, 1, 1)x(0, 1, 1, 12)12 - AIC:2538.820635541546
    ARIMA(1, 1, 1)x(1, 0, 0, 12)12 - AIC:2963.2789505804294
    ARIMA(1, 1, 1)x(1, 0, 1, 12)12 - AIC:2941.2436984747465
    ARIMA(1, 1, 1)x(1, 1, 0, 12)12 - AIC:2559.8258191422606
    ARIMA(1, 1, 1)x(1, 1, 1, 12)12 - AIC:2539.712354465328
    


    另请参见

    现在有一个合适的python包来执行自动arima

    文件:

    示例用法:

    def evaluate_arima_模型(X,arima_顺序):
    #准备培训数据集
    列车尺寸=整数(长度(X)*0.90)
    列车,测试=X[0:列车尺寸],X[列车尺寸:]
    历史=[x代表列车中的x]
    #预测
    预测=列表()
    对于范围内的t(len(测试)):
    模型=ARIMA(历史,顺序=ARIMA_顺序)
    模型拟合=模型拟合(disp=0)
    yhat=model_fit.forecast()[0]
    预测。追加(yhat)
    history.append(测试[t])
    #计算样本外误差
    误差=均方误差(测试、预测)
    返回错误
    #评估ARIMA模型的p、d和q值组合
    def评估_模型(数据集、p_值、d_值、q_值):
    dataset=dataset.astype('float32')
    最佳分数,最佳cfg=浮动(“inf”),无
    对于p_值中的p:
    对于d in d_值:
    对于q_值中的q:
    顺序=(p,d,q)
    尝试:
    mse=评估arima模型(数据集,顺序)
    如果mse<最佳分数:
    最佳分数,最佳cfg=mse,顺序
    打印('ARIMA%s MSE=%.3f%'(顺序,MSE))
    除:
    持续
    打印('Best ARIMA%s MSE=%.3f%'(Best\u cfg,Best\u分数))
    #加载数据集
    def解析器(x):
    return datetime.strtime('190'+x',%Y-%m')
    导入日期时间
    p_值=[4,5,6,7,8]
    d_值=[0,1,2]
    q_值=[2,3,4,5,6]
    警告。过滤器警告(“忽略”)
    评估_模型(训练、p_值、d_值、q_值)
    

    这将为您提供p、d、q值,然后使用ARIMA模型的值。从现在起,我们可以直接使用PyPI的软件包。

    在conda中,使用
    conda安装-c saravji pmdarima
    进行安装

    用户
    saravji
    已将其放入蟒蛇云中

    然后用,

    from pmdarima.arima import auto_arima
    

    (请注意,名称
    金字塔arima
    已更改为
    pmdarima
    )。

    master中已经有一个包装函数为您执行此操作。这是我们现在最接近auto.arima的地方了。@jseabold您知道源代码,但名称表明它是arma而不是arimaYes,它只用于订单选择。现在还没有任何自动的集成检查。两年后很难回答这个问题,但是在代码示例的最后一行中exog和endog会有什么值呢?他们贡献了什么?不要紧,对于那些同样对此感到困惑的人来说,exog/endog是数据拟合的结果。Brute会自动使用其第二个参数作为函数的第一个参数,然后按其列出的顺序使用其他参数。虽然此代码段可以解决此问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!可以在这里查阅库文档:仅供参考,python auto arima已经移到了pmdarima,因此它可能不会与另一个更受欢迎的库发生冲突,使用相同名称的Old thread,但这可能不是选择d的最佳方式。传统上,这是通过使用单位根测试(如KPSS测试)来完成的。
    from pmdarima.arima import auto_arima