Я пытаюсь прогнозировать спрос на основе набора данных за 6 лет 01.01.2014 ==> 01.01.2020. Сначала я попытался перегруппировать спрос по месяцам, и в результате я получил набор данных из 2 столбцов (месяц и продажи) и 72 строк (12 месяцев * 6 лет). PS: Я работаю с python.
Мой первый вопрос: достаточно ли получить прогнозы на следующий год (2020), зная тот факт, что у меня всего 72 строки.
Мой второй вопрос: есть ли модели, с которыми вы можете посоветовать мне поработать, и это дало бы мне хорошую точность?
Я пытался работать с моделью арима в сочетании с сезонностью (саримакс) и LSTM, хотя она не работала, я не уверен, правильно ли я это делаю.
Мой третий вопрос: есть ли любой тест в python, который говорит вам, есть ли сезонность или нет?
#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()
Предсказания не имеют ничего общего с реальностью .. Я был бы очень признателен за любую помощь.