auto.arima() equivalent for python

前端 未结 8 852
旧时难觅i
旧时难觅i 2020-11-28 03:30

I am trying to predict weekly sales using ARMA ARIMA models. I could not find a function for tuning the order(p,d,q) in statsmodels. Currentl

相关标签:
8条回答
  • 2020-11-28 04:11

    actually

    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)
    
    0 讨论(0)
  • 2020-11-28 04:12
    def evaluate_arima_model(X, arima_order):
        # prepare training dataset
        train_size = int(len(X) * 0.90)
        train, test = X[0:train_size], X[train_size:]
        history = [x for x in train]
        # make predictions
        predictions = list()
        for t in range(len(test)):
            model = ARIMA(history, order=arima_order)
            model_fit = model.fit(disp=0)
            yhat = model_fit.forecast()[0]
            predictions.append(yhat)
            history.append(test[t])
        # calculate out of sample error
        error = mean_squared_error(test, predictions)
        return error
    
    # evaluate combinations of p, d and q values for an ARIMA model
    def evaluate_models(dataset, p_values, d_values, q_values):
        dataset = dataset.astype('float32')
        best_score, best_cfg = float("inf"), None
        for p in p_values:
            for d in d_values:
                for q in q_values:
                    order = (p,d,q)
                    try:
                        mse = evaluate_arima_model(dataset, order)
                        if mse < best_score:
                            best_score, best_cfg = mse, order
                        print('ARIMA%s MSE=%.3f' % (order,mse))
                    except:
                        continue
        print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score))
    
    # load dataset
    def parser(x):
        return datetime.strptime('190'+x, '%Y-%m')
    
    
    
    import datetime
    p_values = [4,5,6,7,8]
    d_values = [0,1,2]
    q_values = [2,3,4,5,6]
    warnings.filterwarnings("ignore")
    evaluate_models(train, p_values, d_values, q_values)
    

    This will give you the p,d,q values, then use the values for your ARIMA model

    0 讨论(0)
提交回复
热议问题