У меня есть набор данных временных рядов. Я использую python, pandas и statsmodels, чтобы попытаться спрогнозировать следующий месяц моих данных.
У меня есть данные за день:
Сначала я запускаю autoarima, чтобы посмотреть, какие переменные мне нужно добавить в мою модель Sarimax:
auto_arima(df['data'],seasonal=True,m=7).summary()
Я обучаю свою модель с этими параметрами:
train = df.loc[:'2019-12-31']
test = df.loc['2020-01-01':'2020-01-31']
model = SARIMAX(train['n_transactions'],order=autoarima.order,seasonal_order= autoarima.seasonal_order)
results = model.fit()
start=len(train)
end=len(train)+len(test)-1
predictions = results.predict(start=start, end=end, dynamic=False, typ='levels').rename(f'Daily SARIMA{autoarima.order}{autoarima.seasonal_order} Predictions')
ax = test['n_transactions'].plot(legend=True,figsize=(12,6))
predictions.plot(legend=True)
ax.autoscale(axis='x',tight=True)
ax.set(xlabel=xlabel, ylabel=ylabel);
SARIMA MSE Error: 4.088022969
SARIMA RMSE Error: 2.021885993
SARIMA average: 8.7
SARIMA std: 4.539544925
results.plot_diagnostics(figsize=(16, 8))
plt.show()
модель не очень хорошо предсказывает, поэтому я хочу посмотреть, как моя модель предсказывает на следующий день. Каждый день собираюсь заново тренировать модель, потому что для меня это важнее только в следующем месяце.
all_df = pd.DataFrame()
test = df.iloc[-62:]
i = -62
for index, row in test.iterrows():
train = df.iloc[:i:]
model = SARIMAX(train['n_transactions'],order=autoarima.order,seasonal_order= autoarima.seasonal_order)
results = model.fit()
start = len(train)
end = len(train)
predictions = results.predict(start=start, end=end, dynamic=False, typ='levels')
test_df = pd.DataFrame(columns = {'predictions'})
test_df['predictions'] = predictions
all_df = pd.concat([all_df, test_df], axis=0, sort=False)
i += 1
ylabel='n_transactions'
xlabel=''
ax = test['n_transactions'].plot(legend=True,figsize=(12,6))
all_df['predictions'].plot(legend=True)
ax.autoscale(axis='x',tight=True)
ax.set(xlabel=xlabel, ylabel=ylabel);
Может быть. На изображении ниже видно, что однажды модель получает сдвиг в хорошем прогнозе. Есть ли способ исправить это?