Задать вопрос
@MasterCopipaster

Изменили выходные параметры в fitted.forecast в Python — как его теперь использовать в моем случае?

Доброе время суток, занимался тут изучением одной статьи по мат анализу ( заголовок для поиска "Out-of-Time cross-validation" )
И наткнулся на проблему: похоже что статья написана 3 года назад, и за это время разработчики пакета что то поменяли в функции fitted.forecast судя по коду приведеному на сайте там должно возвращатся 3 перемеенных fc, se, conf однако я получаю список чисел. По итогу я не могу воспроизвести пример из статьи, и самое больное что найти как это поченить я тоже не могу. Может кто ни буть сталкивался с этим подскажите как исправить?

Полный код для восрпоизведения:

import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_predict
from statsmodels.tsa.arima.model import ARIMA


df = pd.read_csv("https://hands-on.cloud/wp-content/uploads/2022/02/catfish_sales_1986_2001.csv")
train = df.Total[:130]
test = df.Total[130:]
#  Build Model
model = ARIMA(train, order=(1, 1, 1))
fitted = model.fit()
# Forecast using 95% confidence interval
fc, se, conf = fitted.forecast(39, alpha=0.05)
# Make as pandas series
fc_series = pd.Series(fc, index=test.index)
lower_series = pd.Series(conf[:, 0], index=test.index)
upper_series = pd.Series(conf[:, 1], index=test.index)
# Plot
plt.figure(figsize=(12,5), dpi=100)
plt.plot(train, label='training')
plt.plot(test, label='actual')
plt.plot(fc_series, label='forecast')
plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.15)
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()


получаю ошибку:
fc, se, conf = fitted.forecast(39, alpha=0.05)
ValueError: too many values to unpack (expected 3)


Хотя ожидается что результатом работы должен стать вот такой график:

ngcb1
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
В общем ради интереса, получил модель как на графике в статье. Из тех данных что у вас есть.
1. Модель имеет тренировочный сет 130 плюс предполагает предсказание на 39 дней то есть конечное количество это 169. В коде же об этом не слова и он берет его до конца временной последовательности
2. Задана неправильная вариация параметра order. Что бы его задавать правильно требуется понимание.
3. По мелочи поправили остальное.
4. Самое главное, практическая ценность данной модели близка к нулю. Он предсказывает средние значения и как мы видим он "зацепил" ТРЕНД, кстати его параметром конечно же автор статьи тоже не указал, но я поправил.

В общем хотели рабочий код, который из данного датасета строит и визуализирует авторегрессивную модель то вот.

df = pd.read_csv("https://hands-on.cloud/wp-content/uploads/2022/02/catfish_sales_1986_2001.csv")
train = df.Total[:130]
test = df.Total[130:170]

model = ARIMA(train, order=(1, 0, 0),trend='ct').fit()
   

fc = model.get_forecast(39, alpha=0.05) 

fc_series = pd.Series(fc.predicted_mean, index=test.index)
lower_series = pd.Series(fc.conf_int().iloc[:, 0], index=test.index)
upper_series = pd.Series(fc.conf_int().iloc[:, 1], index=test.index)

plt.figure(figsize=(12,5), dpi=100)
plt.plot(train, label='training')
plt.plot(test, label='actual')
plt.plot(fc_series, label='forecast')
plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.15)
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Вот описание метода forecast и он действительно возвращает array_like объект.
Видимо, он при правильном применении с правильными данными должен вернуть многомерный объект, скажем три вектора или что-то в таком роде. И эти три вектора или массива, видимо, должны лечь в ваши три переменных.

Но если метод применяется не к тем данным, которые формируют именно три вектора, то и результат не тот получается.
Garbage in - garbage out.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы