Python 使用6年数据集预测销售额
我试图根据6年数据集2014年1月1日==>2020年1月1日来预测需求。 首先,我尝试按月重新组合需求,因此我得到了一个包含两列(月和销售额)和72行(12个月*6年)的数据集。 附言:我正在使用python 我的第一个问题是:如果知道我只有72行,那么预测下一年(2020年)就足够了吗 我的第二个问题是,你有没有什么模型可以建议我使用,并且可以给我一个很好的准确性 我曾经尝试过使用arima模型,并结合季节性(sarimax)和LSTM,虽然它不起作用,但我不确定我是否做对了 我的第三个问题是:python中是否有测试告诉您是否存在季节性 这些预言与现实毫无关系。。。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,虽然它不起作用,但我不确定我是否做对了 我的第三个问题
我非常感谢任何人的帮助 回答您的第一个问题: 您收集的数据看起来很小,如果您能够收集每日数据,这样您的模型就可以做得很好,这将是一件好事。由于递归神经网络在以较少的时差收集数据元素时表现良好,我建议您每天收集数据,这样可以使您达到(12 x 30 x 6),它可以成为任何模型的最佳输入 对第二个问题的答复: 我个人建议你尝试一下LSTM,它提供了更多的数据,这是一个有价值的参数,在这篇文章中提供了一个很好的集合 性能随参数的变化而变化,因此在选择输入的参数时要谨慎 对第三个问题的答复: 季节性通常使用称为“异常检测”的技术进行检测。在上面给出的中篇文章中也对此进行了一个小讨论
- 为了从中提取残差(我们应该只在平稳数据上训练我们的模型)。你可以检查平稳性,而不是季节性
- 它有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()