时间序列预测的ARIMA/SARIMAX

2024-04-19 16:21:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图预测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

任何关于预测多种产品的建议都将非常好


Tags: testtruedfmodellenorderitemstrain