Ошибка в определении фрейма данных при прогнозировании нескольких TS Stat в Python

Я пытался воспроизвести этот код для прогнозирования статистики в python, Я столкнулся со странной ошибкой «имя« прогнозы »не определено», что довольно странно, поскольку раньше я мог воспроизвести код без каких-либо ошибок.

Разница здесь с эталонным кодом (который приведен в ссылке ниже и кодом, который мне удалось реализовать): я не использую тренировочный набор и не извлекаю последние 6 месяцев для оценки, а вместо этого я использую все обучающие данные для создания статистического прогноза.

Например: если мои данные временного ряда были до 22 сентября, я хотел предоставить все данные до 22 сентября в качестве тренировочного набора для моей статистической модели, а предыдущие данные обучения имели временные ряды до 22 марта, а остальные 6 месяцев были тестовое задание. Но теперь есть ошибки, которые я не могу понять, почему, поскольку логика такая же?

Прилагается упрощенный фрейм данных, используемый для расчета:

{'Key': {0: 65162552161356, 1: 65162552635756, 2: 65162552843456, 3: 65162552842856, 4: 65162552736856}, '2021-04-01': {0: 31, 1: 0, 2: 281, 3: 207, 4: 55}, '2021-05-01': {0: 25, 1: 0, 2: 72, 3: 104, 4: 6}, '2021-06-01': {0: 16, 1: 0, 2: 108, 3: 32, 4: 14}, '2021-07-01': {0: 8, 1: 0, 2: 107, 3: 78, 4: 10}, '2021-08-01': {0: 21, 1: 0, 2: 80, 3: 40, 4: 9}, '2021-09-01': {0: 24, 1: 0, 2: 40, 3: 73, 4: 3}, '2021-10-01': {0: 13, 1: 0, 2: 36, 3: 79, 4: 11}, '2021-11-01': {0: 59, 1: 0, 2: 65, 3: 139, 4: 14}, '2021-12-01': {0: 51, 1: 0, 2: 41, 3: 87, 4: 10}, '2022-01-01': {0: 2, 1: 0, 2: 43, 3: 47, 4: 6}, '2022-02-01': {0: 0, 1: 0, 2: 0, 3: 63, 4: 3}, '2022-03-01': {0: 0, 1: 0, 2: 16, 3: 76, 4: 18}, '2022-04-01': {0: 0, 1: 0, 2: 37, 3: 32, 4: 8}, '2022-05-01': {0: 0, 1: 0, 2: 106, 3: 96, 4: 40}, '2022-06-01': {0: 0, 1: 0, 2: 101, 3: 75, 4: 16}, '2022-07-01': {0: 0, 1: 0, 2: 60, 3: 46, 4: 14}, '2022-08-01': {0: 0, 1: 0, 2: 73, 3: 91, 4: 13}, '2022-09-01': {0: 0, 1: 0, 2: 19, 3: 17, 4: 2}}

Вот ссылка для справки: https://towardsdatascience.com/time-series-forecasting-with-statistical-models-f08dcd1d24d1

import random
from itertools import product
from IPython.display import display, Markdown
from multiprocessing import cpu_count
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from statsforecast import StatsForecast
from nixtlats.data.datasets.m4 import M4, M4Info
from statsforecast.models import (
    adida, 
    croston_classic, 
    croston_sba, 
    croston_optimized,
    historic_average,
    imapa,
    naive,
    random_walk_with_drift, 
    seasonal_exponential_smoothing,
    seasonal_naive, 
    seasonal_window_average,
    ses, 
    tsb,
    window_average
)
df = pd.read_excel ('C:/X/X/X/2.1 Demand_Data_Used.xlsx')
df['Key'] = df['Key'].astype(str)
df = pd.melt(df,id_vars='Key',value_vars=list(df.columns[1:]),var_name ='ds')
df.columns = df.columns.str.replace('Key', 'unique_id')
df.columns = df.columns.str.replace('value', 'y')
df["ds"] = pd.to_datetime(df["ds"],format='%Y-%m-%d')
df=df[["ds","unique_id","y"]]

df['unique_id'] = df['unique_id'].astype('object')
df = df.set_index('unique_id')
df.reset_index()

seasonality = 30 #Monthly data

models = [
    adida,
    croston_classic,
    croston_sba,
    croston_optimized,
    historic_average,
    imapa,
    naive,
    random_walk_with_drift,
    (seasonal_exponential_smoothing, seasonality, 0.2),
    (seasonal_naive, seasonality),
    (seasonal_window_average, seasonality, 2 * seasonality),
    (ses, 0.1),
    (tsb, 0.3, 0.2),
    (window_average, 2 * seasonality)
    ]

fcst = StatsForecast(df=df, models=models, freq='MS', n_jobs=cpu_count())
%time forecasts = fcst.forecast(6)
forecasts.reset_index()

forecasts = forecasts.reset_index().merge(df_test, how='left', on=['unique_id', 'ds'])
models = forecasts.drop(columns=['unique_id', 'ds', 'y']).columns.to_list()

Прикреплено изображение ошибки:

Может ли кто-нибудь дать мне знать, что я делаю неправильно? Это было бы очень признательно.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема возникает из-за семьи Кростон. Я открыл вопрос для решения проблемы. Между тем, пропуск этих моделей работает.

models = [
    adida,
    #croston_classic,
    #croston_sba,
    #croston_optimized,
    historic_average,
    imapa,
    naive,
    random_walk_with_drift,
    (seasonal_exponential_smoothing, seasonality, 0.2),
    (seasonal_naive, seasonality),
    (seasonal_window_average, seasonality, 2 * seasonality),
    (ses, 0.1),
    (tsb, 0.3, 0.2),
    (window_average, 2 * seasonality)
    ]
fcst = StatsForecast(df=df, models=models, freq='MS', n_jobs=cpu_count())
fcst.forecast(6)

Обновлять:

Новейшая версия StatsForecast устраняет проблему. Вы можете использовать его, используя,

from statsforecast.models import CrostonClassic, CrostonSBA, CrostonOptimized

models = [
    CrostonClassic(),
    CrostonSBA(),
    CrostonOptimized()
]

fcst = StatsForecast(df=df, models=models, freq='MS', n_jobs=cpu_count())
fcst.forecast(6)

Спасибо за разъяснение того же. Я действительно хотел узнать результаты Croston Models. Есть ли другой способ реализовать Croston Models. Кроме того, та же строка кода отлично работает с другим набором данных, который я изначально использовал для тестирования, и это удивительно. Также есть ли способ узнать, когда проблема будет исправлена?

user20068761 05.10.2022 11:50

Ребята, вы смогли решить эту проблему?

user20203146 18.11.2022 10:30

Да, новейшая версия StatsForecast исправляет проблему, связанную с семьей Кростон.

fede garza 19.11.2022 00:36

Я попытался переустановить библиотеку с помощью Pip install StatsForecast и перезапустил ядро, но столкнулся с той же ошибкой, что и выше. Не похоже, что это исправлено. Я что-то не так понял?

user20203146 23.11.2022 10:02

Вы можете использовать pip install -U statsforecast, чтобы обновить последнюю версию. Вот пример колаба, показывающий, что теперь он работает как положено: colab.research.google.com/drive/…

fede garza 02.12.2022 01:30

Другие вопросы по теме