Python 使用6年数据集预测销售额

Python 使用6年数据集预测销售额,python,pandas,machine-learning,neural-network,forecasting,Python,Pandas,Machine Learning,Neural Network,Forecasting,我试图根据6年数据集2014年1月1日==>2020年1月1日来预测需求。 首先,我尝试按月重新组合需求,因此我得到了一个包含两列(月和销售额)和72行(12个月*6年)的数据集。 附言:我正在使用python 我的第一个问题是:如果知道我只有72行,那么预测下一年(2020年)就足够了吗 我的第二个问题是,你有没有什么模型可以建议我使用,并且可以给我一个很好的准确性 我曾经尝试过使用arima模型,并结合季节性(sarimax)和LSTM,虽然它不起作用,但我不确定我是否做对了 我的第三个问题

我试图根据6年数据集2014年1月1日==>2020年1月1日来预测需求。 首先,我尝试按月重新组合需求,因此我得到了一个包含两列(月和销售额)和72行(12个月*6年)的数据集。 附言:我正在使用python

我的第一个问题是:如果知道我只有72行,那么预测下一年(2020年)就足够了吗

我的第二个问题是,你有没有什么模型可以建议我使用,并且可以给我一个很好的准确性

我曾经尝试过使用arima模型,并结合季节性(sarimax)和LSTM,虽然它不起作用,但我不确定我是否做对了

我的第三个问题是:python中是否有测试告诉您是否存在季节性

这些预言与现实毫无关系。。。
我非常感谢任何人的帮助

回答您的第一个问题: 您收集的数据看起来很小,如果您能够收集每日数据,这样您的模型就可以做得很好,这将是一件好事。由于递归神经网络在以较少的时差收集数据元素时表现良好,我建议您每天收集数据,这样可以使您达到(12 x 30 x 6),它可以成为任何模型的最佳输入

对第二个问题的答复: 我个人建议你尝试一下LSTM,它提供了更多的数据,这是一个有价值的参数,在这篇文章中提供了一个很好的集合

性能随参数的变化而变化,因此在选择输入的参数时要谨慎

对第三个问题的答复: 季节性通常使用称为“异常检测”的技术进行检测。在上面给出的中篇文章中也对此进行了一个小讨论

  • 据我所知,我们可以利用如此大量的数据进行有意义的预测 数据(这意味着每个月使用6个数据点 拟合模型),但尽量使用尽可能多的数据-然后 准确性只会提高
  • 时间序列中几乎总是有一些季节性,甚至更多, 还有一种趋势。所以你需要分解你原来的时间 序列到趋势、季节和残差,所有预测都将 用残差做的。关于模型-ARIMA对于 预测时间序列,为了使其更精确,只需调整 参数(p和q)使用PACF和ACF
  • 换句话说,我们通过分解使时间序列保持平稳
    • 为了从中提取残差(我们应该只在平稳数据上训练我们的模型)。你可以检查平稳性,而不是季节性
    • 它有ADF测试

  • 我对它做了很多研究,有一个关于ts预测的项目,例如,其中描述了所有步骤:

    原始数据集是按天收集的(大约有3000行),我是重新组合它的人,因为我需要按月预测销售额。我已经看过了链接,u说,非常有用,谢谢,但是没有任何python代码,而且我还不太擅长编程,因为我刚刚开始。你有一个示例代码吗?好的,我会很快与你分享一些资源。谢谢你的快速回答,我很感激!你查过我的arima代码了吗?我看不出我在模型中做错了什么。。。我将订单推到5(PACF和ACF,但仍然不够好)我可以看到,您首先尝试找出最佳参数,然后(我认为您使用(0,1,2)参数用于SARIMAX模型,因为它们是最佳的)获取最佳参数和拟合与训练模型。*尝试使用网格搜索进行超参数调谐(更方便);*尽量不要只使用5个参数,有时最好的参数可能更大;*尝试完全使用ARIMA模型,而不是SARIMAX;*尝试收集更多数据,可能会因为以下原因导致错误预测:(
    #shrink the dataset
    dataa=data[(data['Produit']=='ACP NOR/STD')&(data['Région']=='Europe')]
    
    gb2=dataa.groupby(by=[dataa['Mois'].dt.strftime('%Y, %m')])['Chargé (T)'].sum().reset_index()
    gb2.Mois=pd.to_datetime(gb2.Mois)
    
    [#create a time serie][2]
    series = pd.Series(gb2['Chargé (T)'].values, index=gb2.Mois)
    
    
    #decompose the dataset to 3 things: trend, seasonality and noise
    from pylab import rcParams
    import statsmodels.api as sm
    rcParams['figure.figsize'] = 18, 8
    decomposition = sm.tsa.seasonal_decompose(series, model='additive')
    fig = decomposition.plot()
    plt.show()
    
    
        #calculate acf and pacf to know in which order to stop
    
        from statsmodels.graphics.tsaplots import plot_acf
        from statsmodels.graphics.tsaplots import plot_pacf
        from matplotlib import pyplot
    
        pyplot.figure()
        pyplot.subplot(211)
        plot_acf(series, ax=pyplot.gca())
        pyplot.subplot(212)
        plot_pacf(series, ax=pyplot.gca())
        pyplot.show()
    
    import itertools
    p = d = q = range(0, 5)
    pdq = list(itertools.product(p, d, q))
    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]))
    
    
        import warnings
        warnings.filterwarnings("ignore")
        for param in pdq:
            for param_seasonal in seasonal_pdq:
                try:
                    mod = sm.tsa.statespace.SARIMAX(series,
                                                    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
    
    mod = sm.tsa.statespace.SARIMAX(series,
                                    order=(0, 1, 2),
                                    seasonal_order=(0, 4, 0, 12),
                                    enforce_stationarity=False,
                                    enforce_invertibility=False)
    
        results = mod.fit()
    
        print(results.summary().tables[1])
        results.plot_diagnostics(figsize=(16, 8))
        plt.show()
        #get predictions
        pred = results.get_prediction(start=pd.to_datetime('2019-01-01'), dynamic=False)
        pred_ci = pred.conf_int()
    
        ax = series['2014':].plot(label='observed')
        pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.8, figsize=(14, 7))
    
        ax.fill_between(pred_ci.index,
                        pred_ci.iloc[:, 0],
                        pred_ci.iloc[:, 1], color='k', alpha=.2)
    
        ax.set_xlabel('Date')
        ax.set_ylabel('Chargé (T)')
        plt.legend()
    
        plt.show()