1

我正在尝试预测 2000 多种产品的销售量。在我的数据中,我将每个产品的销售数据重新采样为每周销售数据,并且每个产品的时间序列数据表现不同。季节性模式并不明显,这就是为什么我决定在 Python 中使用 auto_arima 函数来处理两种不同的条件,假设存在季节性,而没有。对于季节性情况,我假设周期为 52 周,因为在 1 年期间观察到数据季节性分解的峰值相同。现在,我的问题是,为自动 arima 函数尝试两种不同的条件并捕获提供最低 mse 的最佳模型(ARIMA 或 SARIMAX)是一种好习惯吗?此外,auto_arima 函数在尝试查找 sarimax 模型的顺序时工作非常缓慢。我很高兴听到任何关于加快速度和我的第一个问题的建议。

谢谢。

df_models = pd.DataFrame()
df_model_results = pd.DataFrame()

for k in range(len(df_stationary_items)):
 
 test_df = grouped_df.get_group(df_stationary_items[k])
 X = test_df['Quantity'].values
 train, test = X[0:len(X)-1], X[len(X)-1:]
 try:
     stepwise_fit = auto_arima(test_df['Quantity'], start_p=0, start_q=0,
                           max_p=6, max_q=6,m=52,
                           start_P=0,seasonal=True,alpha=0.05,
                           d=None,D=None, max_D=1 ,trace=True,n_jobs=-1,
                           error_action='ignore',stepwise=True)
     df_models =df_models.append({"ItemNo": df_stationary_items[k], "Order": stepwise_fit.order,"SeasonalOrder": stepwise_fit.seasonal_order},ignore_index=True)
        
     model = SARIMAX(train, order=stepwise_fit.order,seasonal_order=stepwise_fit.seasonal_order)
     model_fit = model.fit()
     predictions = model_fit.predict(start=len(train), end=len(train)+len(test)-1, dynamic=False)
     rmse= sqrt(mean_squared_error(test, predictions))
     df_model_results =df_model_results.append({"ItemNo": df_stationary_items[k],"StationaryP":result[1] ,"Order": stepwise_fit.order,"SeasonalOrder": stepwise_fit.seasonal_order,"Predicted":predictions[0],"Expected":test[0],"STDEV":test_df['Quantity'].std(),"rmse":rmse},ignore_index=True)
 except:
     continue
     
df_test_results_nonseasonal = pd.DataFrame()
df_model_results_nonseasonal = pd.DataFrame()
df_models_nonseasonal=pd.DataFrame()

for m in range(len(df_stationary_items)):
    test_df_nonseasonal = grouped_df.get_group(df_stationary_items[m])    
    X_non = test_df_nonseasonal['Quantity'].values
    train_non, test_non = X_non[0:len(X_non)-1], X_non[len(X_non)-1:]
    try:
    

        stepwise_nonseasonal = auto_arima(test_df_nonseasonal['Quantity'],error_action='ignore',seasonal=False)
        df_models_nonseasonal =df_models_nonseasonal.append({"ItemNo": df_stationary_items[m], "Order": stepwise_nonseasonal.order},ignore_index=True)
        model_non = ARIMA(train_non, order=stepwise_nonseasonal.order)
        model_fit_non = model_non.fit()
        predictions_non = model_fit_non.predict(start=len(train_non), end=len(train_non)+len(test_non)-1, dynamic=False)
        rmse_non= sqrt(mean_squared_error(test_non, predictions_non))
        df_model_results_nonseasonal =df_model_results_nonseasonal.append({"ItemNo": df_stationary_items[m],"StationaryP":result_non[1] ,"Order": stepwise_nonseasonal.order,"Predicted":predictions_non[0],"Expected":test_non[0],"STDEV":test_df_nonseasonal['Quantity'].std(),"rmse":rmse_non},ignore_index=True)
    except:
       continue

任何预测多种产品的建议都会很棒!

4

0 回答 0