Прогнозирование, часть 3.1 — Создание прогноза с помощью Python — Prophet
Это руководство было создано, чтобы демократизировать науку о данных для бизнес-пользователей (т. е. свести к минимуму использование тем по продвинутой математике) и смягчить личное разочарование, которое мы испытали, следуя руководствам и изо всех сил пытаясь применить то же самое руководство для наших нужд. Учитывая это, наша миссия заключается в следующем:
- Обеспечить практическое применение задач по науке о данных с минимальным использованием сложных математических тем
- Используйте только полный набор данных, которые аналогичны данным, которые мы видим в бизнес-среде, и которые общедоступны в учебнике, вместо использования простых данных или фрагментов данных, используемых во многих учебниках
- Четко укажите предварительные требования в начале руководства. Мы постараемся предоставить дополнительную информацию об этих предварительных условиях
- Предоставьте как письменное руководство, так и видеоруководство по каждой теме, чтобы убедиться, что все шаги просты для выполнения и четко проиллюстрированы
1. Описание
Это серия из нескольких частей о том, как создавать прогнозы с помощью одного из наиболее широко используемых инструментов обработки данных — Python.
Прогнозирование — это процесс предсказания будущего на основе прошлых и настоящих данных и их тенденций. Точность прогноза снижается по мере того, как вы растягиваете свой прогноз. Например, если вы прогнозируете ежемесячные продажи, то точность прогноза продаж за первый месяц прогноза будет выше, чем продажи за второй месяц прогноза и так далее. Один из моих коллег любит утверждать, что лучший способ предсказать завтрашнюю погоду — это предположить, что она похожа на сегодняшнюю. Все остальное только догадки.
Серия прогнозов состоит из:
- Часть 1.1 — Создание прогноза с помощью Excel 2016/2019
- Часть 1.2. Расширенные темы прогнозирования с использованием Excel 2016/2019
- Часть 2.1 — Создание прогноза с использованием Python — ARIMA
- Часть 2.2 — Расширенные темы по прогнозированию с использованием Python — ARIMA
- Часть 2.3. Расширение прогноза (Python) для включения возможностей анализа «что, если» — ARIMA
- Часть 3.1. Создание прогноза с помощью Python — Prophet
- Часть 3.2 — Расширенные темы по прогнозированию с использованием Python — Prophet
- Часть 3.3 — Расширение прогноза (Python) для включения возможностей анализа «что, если» — Prophet
- Часть 4.1 — Создание прогноза с использованием Python — LSTM
- Часть 4.2 — Расширенные темы по прогнозированию с использованием Python — LSTM
- Часть 4.3. Расширение прогноза (Python) для включения возможностей анализа «что, если» — LSTM
Prophet — это процедура прогнозирования данных временных рядов на основе аддитивной модели, в которой нелинейные тренды соответствуют годовой, еженедельной и ежедневной сезонности, а также праздничным эффектам. Он лучше всего работает с временными рядами, которые имеют сильные сезонные эффекты и несколько сезонов исторических данных. Пророк устойчив к отсутствующим данным и сдвигам в тренде и обычно хорошо справляется с выбросами.
Prophet — это программное обеспечение с открытым исходным кодом, выпущенное командой Facebook Core Data Science. Он доступен для загрузки на CRAN и PyPI.
Пророк это:
- Точный и быстрый: Prophet используется во многих приложениях Facebook для создания надежных прогнозов для планирования и постановки целей. Мы обнаружили, что в большинстве случаев он работает лучше, чем любой другой подход. Мы подбираем модели в Stan, чтобы вы получали прогнозы всего за несколько секунд.
- Полностью автоматический: получите разумный прогноз на основе беспорядочных данных без ручных усилий. Пророк устойчив к выбросам, отсутствующим данным и резким изменениям в ваших временных рядах.
- Настраиваемые прогнозы. Процедура Prophet включает в себя множество возможностей для пользователей по настройке и корректировке прогнозов. Вы можете использовать интерпретируемые человеком параметры, чтобы улучшить свой прогноз, добавив свои знания в предметной области.
- Доступно в R или Python: мы реализовали процедуру Prophet в R и Python, но они используют один и тот же базовый код Stan для подгонки. Используйте любой язык, который вам удобен, чтобы получать прогнозы.
2. Предпосылки
Ниже приведены необходимые программы для этого руководства:
- [x] Python (Download Anaconda Python from here => https://www.anaconda.com/download/ and install on your computer.)
- [x] Python Package: fbprophet (Install using "conda install -c conda-forge fbprophet" in your Anaconda Prompt). All other python packages used in this tutorial comes with Anaconda Python.
Ниже приведены необходимые знания для этого урока:
- [x] Create Forecast Using Excel 2016/2019 tutorial
- [x] Basic knowledge Python (You really do not need to be expert in python to use python for data science tasks. Many data scientists supplement their basic knowledge of python with google :-) to complete their tasks. We will provide a tutorial soon...
- [x] Basic knowledge installing Python packages (Good news is that Anaconda simplifies this for you somewhat, but they only have limited selection of packages you may need - e.g., pmdarima, which is used in this tutorial cannot be installed using this method). We will provide a tutorial soon...
- [x] Basic knowledge Jupyter Notebook/Lab (Good news is that Jupyter Notebook/Lab is easy to use and learn). We will provide a tutorial soon...
- [x] Basic knowledge Pandas (Pandas is data analysis tools for the Python programming language. This is one of the tool where more you know will make your job easier and there is always google :-). We will provide a tutorial soon...
- [x] Basic knowledge statistical data visualization tool, such as matplotlib, seaborn, bokeh, or plotly (These are data visualization tool for the Python programming language. These are a set of the tool where more you know will make your job easier and there is always google :-). We will provide a tutorial soon...
- [x] Historical data with same frequency (e.g., hourly, daily, weekly, monthly, quarterly, yearly, etc.), to create a forecast. This is important since you cannot create a forecast without historical data that does not have same frequency. If your data does not follow same frequency, then aggregate your data so it will be same frequency. For example, if your data consists of any random two days per week then aggregate (i.e., sum up those two days) your data into a weekly data then create a forecast using aggregated data.
3. Шаги
Пожалуйста, следуйте пошаговым инструкциям, которые разделены на 10 основных шагов, как показано ниже:
- Получить данные
- Формат данных
- Импорт данных
- Очистить данные
- Анализ данных
- Подготовительные данные
- Разработать модель прогноза
- Подходящая модель прогноза и прогноз прогноза
- Подтвердить прогноз
- Сохранить прогноз
3.1. Получить данные
Бюро переписи населения США ведет ежемесячный отчет о розничной торговле с января 1992 года по настоящее время. Эти данные были выбраны для иллюстрации прогнозирования, поскольку они содержат обширные исторические данные с одинаковой месячной периодичностью. Данные доступны в виде электронной таблицы Excel по адресу https://www.census.gov/retail/mrts/www/mrtssales92-present.xls.
3.1.1. Нажмите на ссылку, чтобы сохранить электронную таблицу Excel в локальный каталог/папку.
3.1.2. Откройте электронную таблицу Excel (например, Ежемесячный торговый отчет).
3.1.3. Ежемесячный отчет о розничной торговле организован по годам, где каждый год с 1992 по 2018 год разделен на рабочий лист. На каждом листе есть два разных типа фигур — не скорректированные и скорректированные. Для каждого типа имеется сводная цифра, за которой следует более подробная цифра, организованная в соответствии с Кодексом НАИКС (т. е. Североамериканской отраслевой классификационной системой — стандартом, используемым федеральными статистическими агентствами при классификации коммерческих предприятий с целью сбора, анализа и публикации). статистические данные, относящиеся к деловой экономике США.).
3.2. Формат данных
Нам нужно будет отформатировать данные в Ежемесячном отчете о торговле, чтобы мы могли создать прогноз на основе консолидированных данных за несколько лет. В то же время, эти данные немного больше, чем хотелось бы, поэтому мы будем фильтровать данные следующим образом:
- Используйте период с января 2005 г. по настоящее время, чтобы убедиться, что циклическое поведение (полный экономический цикл с бумом и спадом) представлено в наших данных.
- Используйте данные «НЕ КОРРЕКТИРОВАТЬСЯ», как показано в строках ячеек с 7 по 12 в электронной таблице. Другие данные хороши, но для наших нужд их мало.
3.2.1. Вставьте новый рабочий лист под названием «Прогноз».
3.2.2. Скопируйте и вставьте данные из рабочего листа 2005 года в рабочий лист «Прогноз». При вставке данных используйте опцию «Транспонировать» при вставке. Легче прокручивать вверх и вниз, чем прокручивать вбок, чтобы увидеть данные.
3.2.3. Повторите шаг 3.2.2 для 2006–2018 годов.
3.2.4. Скопируйте и вставьте метку столбца поверх вставленных данных. Снова при вставке данных используйте опцию «Транспонировать» при вставке.
3.2.5. Вставьте столбец даты слева от вставленных данных, начните с 01.01.2005 в первой строке, затем 01.02.2005 во второй строке, затем заполните строки датой. Дата окончания должна быть 01.10.2018.
3.2.6. Сохраните таблицу как mrtssales92-present_step2.xlsx.
3.3. Импорт данных
В отличие от Excel, который находится в одном приложении, вам нужно будет импортировать данные в python — в частности, в pandas (библиотека анализа данных Python), которая представляет собой базу данных в памяти Python, где вы можете выполнять анализ данных и моделирование.
3.3.1. Экспорт данных Excel в файл CSV
3.3.1.1. Откройте рабочий лист Excel под названием «mrtssales92-present_step2.xlsx».
3.3.1.2. Перейдите к рабочему листу «Прогноз» и преобразуйте все числа в просто числа — например, 330 000 вместо 330 000. Так как 330000 импортируется как число, а 330000 импортируется как текст. Так проще. В противном случае вам нужно будет программно изменить тип данных.
3.3.1.3. Увеличьте дату, которая в настоящее время заканчивается 01.10.2018, до 01.12.2020, поскольку мы будем создавать прогноз до декабря 2020 года.
3.3.1.4. Сохраните рабочий лист в формате файла CSV под названием «mrtssales92-present_step3.csv».
3.3.2. Импорт пакетов Python
Лучшей аналогией Python как языка программирования является смартфон. Python — отличный язык программирования, на котором можно выполнять множество задач, как на новом смартфоне. Как и новый смартфон, он немного ограничен, поскольку может выполнять только основные задачи без приложений, которые превосходно справляются со специальными задачами, такими как Google Map. Пакеты Python похожи на приложения для смартфонов, где эти пакеты могут очень хорошо выполнять определенные задачи, например pandas.
3.3.2.1. Установите пакет Python pmdarima
!pip install fbprophet
Requirement already satisfied: fbprophet in /usr/local/lib/python3.6/dist-packages (0.6) Requirement already satisfied: Cython>=0.22 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.29.21) Requirement already satisfied: cmdstanpy==0.4 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.4.0) Requirement already satisfied: pystan>=2.14 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.19.1.1) Requirement already satisfied: numpy>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.18.5) Requirement already satisfied: pandas>=0.23.4 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.0.5) Requirement already satisfied: matplotlib>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (3.2.2) Requirement already satisfied: LunarCalendar>=0.0.9 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.0.9) Requirement already satisfied: convertdate>=2.1.2 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.2.1) Requirement already satisfied: holidays>=0.9.5 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.9.12) Requirement already satisfied: setuptools-git>=1.2 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.2) Requirement already satisfied: python-dateutil>=2.8.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.8.1) Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.23.4->fbprophet) (2018.9) Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (2.4.7) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (0.10.0) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (1.2.0) Requirement already satisfied: ephem>=3.7.5.3 in /usr/local/lib/python3.6/dist-packages (from LunarCalendar>=0.0.9->fbprophet) (3.7.7.1) Requirement already satisfied: pymeeus<=1,>=0.3.6 in /usr/local/lib/python3.6/dist-packages (from convertdate>=2.1.2->fbprophet) (0.3.7) Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from holidays>=0.9.5->fbprophet) (1.15.0)
3.3.2.2. Импортируйте пакеты Python, чтобы Python мог их использовать и отображать свою версию. Отображение версии важно, поскольку это позволит другим пользователям копировать вашу работу, используя ту же версию Python и версию пакетов Python.
import pandas as pd import matplotlib as plt import fbprophet from fbprophet import Prophet import statsmodels from statsmodels.tsa.seasonal import seasonal_decompose import platform import numpy as np import sklearn from sklearn.metrics import mean_squared_error from pandas.tseries.offsets import MonthBegin from pandas.tseries.offsets import MonthEnd
/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
print('Python: ', platform.python_version()) print('pandas: ', pd.__version__) print('matplotlib: ', plt.__version__) print('Prophet: ', fbprophet.__version__) print('statsmodels: ', statsmodels.__version__) print('NumPy: ', np.__version__) print('sklearn: ', sklearn.__version__)
Python: 3.6.9 pandas: 1.0.5 matplotlib: 3.2.2 Prophet: 0.6 statsmodels: 0.10.2 NumPy: 1.18.5 sklearn: 0.22.2.post1
Очень краткое объяснение пакетов python:
- панды: инструмент анализа данных
- matplotlib: инструмент визуализации данных
- Пророк: процедура прогнозирования данных временных рядов на основе аддитивной модели, в которой нелинейные тренды соответствуют годовой, еженедельной и ежедневной сезонности, а также праздничным эффектам.
- statsmodels: инструмент статистических моделей
- numpy: инструмент для научных вычислений
- sklearn — машинное обучение
3.3.3. Импортируйте данные из вновь созданного CSV-файла и укажите, что столбец даты является столбцом индекса.
#Upload file
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
print('User uploaded file "{name}" with length {length} bytes'.format(
name=fn, length=len(uploaded[fn])))
#Assign uploaded file to pandas
monthly_retail_data = pd.read_csv(fn, index_col = 0)
Виджет загрузки доступен только тогда, когда ячейка была выполнена в текущем сеансе браузера. Пожалуйста, перезапустите эту ячейку, чтобы включить.
Saving mrtssales92-present_part3_3.csv to mrtssales92-present_part3_3.csv
User uploaded file "mrtssales92-present_part3_3.csv" with length 9426 bytes
3.3.4. Проверить правильность импорта данных
Как показано ниже, столбец даты импортируется как индекс, а все остальные столбцы импортируются как число.
monthly_retail_data.info()
<class 'pandas.core.frame.DataFrame'> Index: 192 entries, 1/1/2005 to 12/1/2020 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Retail and food services sales, total 166 non-null float64 1 Retail sales and food services excl motor vehicle and parts 166 non-null float64 2 Retail sales and food services excl gasoline stations 166 non-null float64 3 Retail sales and food services excl motor vehicle and parts and gasoline stations 166 non-null float64 4 Retail sales, total 166 non-null float64 5 Retail sales, total (excl. motor vehicle and parts dealers) 166 non-null float64 dtypes: float64(6) memory usage: 10.5+ KB
Вы также можете отобразить импортированные данные.
monthly_retail_data
Примечания. Нет чисел после ноября 2018 года, которые отображаются как NaN, то есть просто отсутствуют значения. Это имеет смысл, поскольку эти даты были созданы в качестве заполнителя для прогноза.
3.3.5. Преобразуйте индекс на сегодняшний день. Индекс должен быть датой и временем, что требуется для данных временных рядов.
monthly_retail_data.index = pd.to_datetime(monthly_retail_data.index)
3.3.6. Убедитесь, что индекс был преобразован в дату, когда индекс был преобразован в DatetimeIndex
monthly_retail_data.info()
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 192 entries, 2005-01-01 to 2020-12-01 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Retail and food services sales, total 166 non-null float64 1 Retail sales and food services excl motor vehicle and parts 166 non-null float64 2 Retail sales and food services excl gasoline stations 166 non-null float64 3 Retail sales and food services excl motor vehicle and parts and gasoline stations 166 non-null float64 4 Retail sales, total 166 non-null float64 5 Retail sales, total (excl. motor vehicle and parts dealers) 166 non-null float64 dtypes: float64(6) memory usage: 10.5 KB
3.4. Очистить данные
После того, как данные были отформатированы, нам нужно будет очистить данные. Есть трюизм в утверждении, что мусор в мусоре. Простая вещь, например, если все числа сохранены, так как число необходимо проверить.
Убедитесь, что все числа хранятся в виде чисел, а не текста. То же самое относится и к дате, и к тексту. Кроме того, убедитесь, что все числа, даты и текст совпадают. Например, число хранится не как число, а как текст — например, 121К вместо 121000. Вам нужно будет очистить данные, чтобы убедиться, что все числа сохранены как числа. Импортированный ежемесячный торговый отчет не содержит грязных данных, поэтому этот шаг не требуется.
3.5. Анализ данных
После того, как данные будут импортированы, мы будем анализировать данные для поиска некоторых конкретных элементов. Эти предметы:
- Отсутствующие данные. Было бы хорошо, если бы все данные были заполнены, но в реальной жизни это не всегда так. Нам нужно будет определить все недостающие данные и обозначить их как таковые.
- Выбросы. Выбросы случаются. Было бы неплохо их включить, но это исказит наш прогноз без дополнительных преимуществ. Нам нужно будет идентифицировать все выбросы и обозначить их как таковые.
- Сезонность. Это характеристика данных, в которых данные претерпевают регулярные и предсказуемые изменения, которые происходят каждый год. Это важно, поскольку если исторические данные имеют сезонный характер, то наш прогноз также должен отражать эту сезонность.
- Циклическое поведение. Это имеет место, когда в данных наблюдаются регулярные колебания, которые обычно длятся с интервалом не менее двух лет, например, экономический спад или экономический бум.
3.5.1. Отсутствующие данные
Отформатированный Ежемесячный отчет о торговле кажется полностью заполненным, поэтому этот шаг не нужен.
3.5.2. Выбросы
Самый простой способ обнаружить выбросы — создать линейную диаграмму данных, как показано ниже, поскольку точки данных ограничены по объему. Отформатированный Ежемесячный отчет о торговле кажется постоянным из года в год, поэтому этот шаг не нужен.
3.5.3. Сезонность
Самый простой способ определить сезонность — создать линейную диаграмму для каждого из размеченных данных. Анализ сезонности будет показан ниже для каждого показателя продаж.
3.5.4. Циклическое поведение
Самый простой способ определить, отражают ли данные циклическое поведение, — создать линейную диаграмму для каждого из данных о продажах. Как видите, данные отражают циклическое поведение, когда в период с 2005 по 2006 год был экономический бум, за которым следовал экономический спад в период с 2007 по 2009 год, за которым следовал постепенный рост продаж в период с 2010 по 2015 год, а затем экономический бум с 2016 года по настоящее время. Анализ циклического поведения будет показан ниже для всех данных о продажах.
3.5.5. Отфильтруйте данные только по историческим или фактическим данным, поскольку нет смысла анализировать пустые данные.
monthly_retail_actuals = monthly_retail_data.loc['2005-01-01':'2018-10-01']
3.5.6. Настроить диаграмму
Здесь мы будем устанавливать размер диаграммы, так как диаграмма по умолчанию слишком мала.
# Get current size
fig_size = plt.rcParams["figure.figsize"]
# Set figure width to 12 and height to 9
fig_size[0] = 30
fig_size[1] = 5
plt.rcParams["figure.figsize"] = fig_size
3.5.7. Анализ Розничная торговля и общественное питание, всего
3.5.7.1. Диаграмма Продажи в сфере розничной торговли и общественного питания, всего
Теперь давайте нарисуем данные. Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создавать красивые диаграммы с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail and food services sales, total', kind='line', grid=1)
plt.pyplot.show()
Преобразование индекса в актуальное состояние снова
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.7.2. Разложите данные о продажах в сфере розничной торговли и общественного питания, общие данные временного ряда
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_and_food_services_sales_total_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail and food services sales, total'], model='multiplicative')
Retail_and_food_services_sales_total_decompose_result.plot()
plt.pyplot.show()
3.5.8. Анализ розничных продаж и общественного питания, кроме автомобилей и запасных частей
3.5.8.1. Диаграмма Розничная торговля и услуги общественного питания, кроме автомобилей и запасных частей
Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создать действительно красивую диаграмму с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail sales and food services excl motor vehicle and parts', kind='line', grid=1)
plt.pyplot.show()
Снова преобразовать индекс в дату
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.8.2. Разложить данные временных рядов по розничным продажам и услугам общественного питания, исключая автомобили и запасные части.
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail sales and food services excl motor vehicle and parts'], model='multiplicative')
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_decompose_result.plot()
plt.pyplot.show()
3.5.9. Анализ розничных продаж и общественного питания, кроме автозаправочных станций
3.5.9.1. Диаграмма Розничные продажи и услуги общественного питания без автозаправочных станций
Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создать действительно красивую диаграмму с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail sales and food services excl gasoline stations', kind='line', grid=1)
plt.pyplot.show()
Снова преобразовать индекс в дату
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.9.2. Разложить данные временных рядов по розничным продажам и услугам общественного питания без учета автозаправочных станций
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_sales_and_food_services_excl_gasoline_stations_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail sales and food services excl gasoline stations'], model='multiplicative')
Retail_sales_and_food_services_excl_gasoline_stations_decompose_result.plot()
plt.pyplot.show()
3.5.10. Розничная торговля и услуги общественного питания, кроме автомобилей, запасных частей и автозаправочных станций
3.5.10.1. Диаграмма Розничные продажи и услуги общественного питания, за исключением автомобилей, запасных частей и автозаправочных станций
Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создать действительно красивую диаграмму с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail sales and food services excl motor vehicle and parts and gasoline stations', kind='line', grid=1)
plt.pyplot.show()
Снова преобразовать индекс в дату
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.10.2. Декомпозиция данных временных рядов по розничным продажам и услугам общественного питания, исключая автомобили, запасные части и автозаправочные станции.
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail sales and food services excl motor vehicle and parts and gasoline stations'], model='multiplicative')
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_decompose_result.plot()
plt.pyplot.show()
3.5.11. Анализ Розничные продажи, всего
3.5.11.1. График Розничные продажи, всего
Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создать действительно красивую диаграмму с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail sales, total', kind='line', grid=1)
plt.pyplot.show()
Снова преобразовать индекс в дату
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.11.2. Разложите розничные продажи, общие данные временного ряда
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_sales_total_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail sales, total'], model='multiplicative')
Retail_sales_total_decompose_result.plot()
plt.pyplot.show()
3.5.12. Анализ Розничные продажи, всего (исключая торговцев автомобилями и автозапчастями)
3.5.12.1. Диаграмма Розничные продажи, всего (без учета дилеров автомобилей и запчастей)
Мы не можем создать диаграмму с использованием столбца индекса, поэтому мы временно удалим индекс даты перед созданием линейной диаграммы с сеткой. Вы можете создать действительно красивую диаграмму с помощью Python, но пока этого достаточно.
monthly_retail_actuals.reset_index().plot(x='Month', y='Retail sales, total (excl. motor vehicle and parts dealers)', kind='line', grid=1)
plt.pyplot.show()
Снова преобразовать индекс в дату
monthly_retail_actuals.index = pd.to_datetime(monthly_retail_actuals.index)
3.5.12.2. Разложите данные временных рядов по розничным продажам, всего (исключая торговцев автомобилями и запчастями)
Декомпозиция в основном используется для анализа временных рядов, а в качестве инструмента анализа ее можно использовать для информирования моделей прогнозирования о вашей проблеме. Он обеспечивает структурированный подход к проблеме прогнозирования временных рядов как в целом с точки зрения сложности моделирования, так и, в частности, с точки зрения того, как лучше всего отразить каждый из этих компонентов в данной модели. Была выбрана мультипликативная модель, поскольку изменения увеличиваются или уменьшаются с течением времени, тогда как изменения аддитивной модели с течением времени постоянно производятся на одну и ту же величину.
Мы видим, что информация о тенденциях и сезонности, полученная из розничных продаж и продаж в сфере общественного питания, общие данные кажутся согласующимися с наблюдаемыми данными. Остатки кажутся интересными, когда изменчивость показывает высокую изменчивость в 2008/2009 гг. (т. е. Великая рецессия) и в 2012 г. (не знаю, что произошло в 2012 г. — возможно, начало экономического подъема).
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_decompose_result = seasonal_decompose(monthly_retail_actuals['Retail sales, total (excl. motor vehicle and parts dealers)'], model='multiplicative')
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_decompose_result.plot()
plt.pyplot.show()
3.6. Подготовительные данные
Нам нужно будет подготовить данные, чтобы гарантировать, что мы используем только чистые данные для создания нашего прогноза. Вот некоторые из основных задач подготовки данных:
- Удалите выбросы данных. Скажем, в течение одного месяца ваши продажи удвоились или утроились благодаря рекламной акции, которая раз в жизни. Это хорошая точка данных для рассмотрения, но она исказит наш прогноз, не предоставив никакой ценности. Нам нужно будет ограничить и ограничить наши данные, чтобы гарантировать удаление выбросов.
- Вменить недостающие данные. Иногда некоторые данные просто отсутствуют по какой-либо причине. Если процент отсутствующих значений низок, вы можете вменить эти отсутствующие данные.
Ежемесячный отчет о торговле не содержит каких-либо выбросов или отсутствующих данных, поэтому этот шаг не требуется.
3.7. Разработка и проверка прогнозной модели
Чтобы создать модель прогноза, мы будем использовать Prophet для прогнозирования роста.
3.7.1. Продажи в сфере розничной торговли и общественного питания, всего
3.7.1.1. Отфильтровать ежемесячные данные о розничных продажах только по розничным продажам и продажам в сфере общественного питания, общие данные
Retail_and_food_services_sales_total_data = monthly_retail_actuals.filter(items=['Retail and food services sales, total'])
print('All: ', Retail_and_food_services_sales_total_data.shape)
All: (166, 1)
3.7.1.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_and_food_services_sales_total_train = Retail_and_food_services_sales_total_data.loc['2005-01-01':'2016-12-01']
Retail_and_food_services_sales_total_test = Retail_and_food_services_sales_total_data.loc['2017-01-01':]
3.7.1.3. Проверка правильности разделения данных
print( 'Train: ', Retail_and_food_services_sales_total_train.shape) print( 'Test: ', Retail_and_food_services_sales_total_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.1.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_and_food_services_sales_total_train = Retail_and_food_services_sales_total_train.reset_index()
Retail_and_food_services_sales_total_train.columns = ['ds', 'y']
Retail_and_food_services_sales_total_train.head()
3.7.1.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_and_food_services_sales_total_model = Prophet() Retail_and_food_services_sales_total_model.fit(Retail_and_food_services_sales_total_train)
INFO:numexpr.utils:NumExpr defaulting to 2 threads. INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b55bc5cc0>
3.7.1.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_and_food_services_sales_total_future = Retail_and_food_services_sales_total_model.make_future_dataframe(freq='M', periods=22)
Retail_and_food_services_sales_total_forecast = Retail_and_food_services_sales_total_model.predict(Retail_and_food_services_sales_total_future)
Retail_and_food_services_sales_total_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.1.7. График прогноза модели
Retail_and_food_services_sales_total_model.plot(Retail_and_food_services_sales_total_forecast)
3.7.1.8. Диаграмма отдельных компонентов модели прогноза
Retail_and_food_services_sales_total_model.plot_components(Retail_and_food_services_sales_total_forecast)
3.7.1.9. Подтвердить прогноз
3.7.1.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_and_food_services_sales_total_forecast_filtered = Retail_and_food_services_sales_total_forecast.filter(["ds","yhat"])
Retail_and_food_services_sales_total_forecast_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование в начало месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_and_food_services_sales_total_forecast_filtered['ds'] = pd.to_datetime(Retail_and_food_services_sales_total_forecast_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_and_food_services_sales_total_forecast_filtered.columns = ['Month', 'Prediction']
Retail_and_food_services_sales_total_forecast_filtered = Retail_and_food_services_sales_total_forecast_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_and_food_services_sales_total_validate = pd.DataFrame(Retail_and_food_services_sales_total_forecast_filtered, index = Retail_and_food_services_sales_total_test.index, columns=['Prediction'])
Retail_and_food_services_sales_total_validate = pd.concat([Retail_and_food_services_sales_total_test, Retail_and_food_services_sales_total_validate], axis=1)
Retail_and_food_services_sales_total_validate
3.7.1.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_and_food_services_sales_total_validate.plot()
plt.pyplot.show()
3.7.1.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_and_food_services_sales_total_validate['Abs Diff'] = (Retail_and_food_services_sales_total_validate['Retail and food services sales, total'] - Retail_and_food_services_sales_total_validate['Prediction']).abs()
Retail_and_food_services_sales_total_validate['Abs Diff %'] = (Retail_and_food_services_sales_total_validate['Retail and food services sales, total'] - Retail_and_food_services_sales_total_validate['Prediction']).abs()/Retail_and_food_services_sales_total_validate['Retail and food services sales, total']
Retail_and_food_services_sales_total_validate.loc['Average Abs Diff %'] = pd.Series(Retail_and_food_services_sales_total_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_and_food_services_sales_total_validate.loc['Min Abs Diff %'] = pd.Series(Retail_and_food_services_sales_total_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_and_food_services_sales_total_validate.loc['Max Abs Diff %'] = pd.Series(Retail_and_food_services_sales_total_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_and_food_services_sales_total_validate
3.7.1.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_and_food_services_sales_total_future_all = Retail_and_food_services_sales_total_model.make_future_dataframe(freq='M', periods=48)
Retail_and_food_services_sales_total_forecast_all = Retail_and_food_services_sales_total_model.predict(Retail_and_food_services_sales_total_future_all)
Retail_and_food_services_sales_total_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_and_food_services_sales_total_forecast_all = Retail_and_food_services_sales_total_forecast_all.filter(["ds","yhat"])
Retail_and_food_services_sales_total_forecast_all['ds'] = pd.to_datetime(Retail_and_food_services_sales_total_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_and_food_services_sales_total_forecast_all.columns = ['Month', 'Prediction']
Retail_and_food_services_sales_total_forecast_all = Retail_and_food_services_sales_total_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_and_food_services_sales_total = monthly_retail_data.filter(items=['Retail and food services sales, total'])
Retail_and_food_services_sales_total_1 = Retail_and_food_services_sales_total.loc['2005-01-01':'2016-12-01']
Retail_and_food_services_sales_total_2 = Retail_and_food_services_sales_total.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_and_food_services_sales_total_validate_all = pd.DataFrame(Retail_and_food_services_sales_total_forecast_all, index = Retail_and_food_services_sales_total_2.index, columns=['Prediction'])
Retail_and_food_services_sales_total_validate_all = pd.concat([Retail_and_food_services_sales_total_2, Retail_and_food_services_sales_total_validate_all], axis=1)
Retail_and_food_services_sales_total_validate_all = Retail_and_food_services_sales_total_1.append(Retail_and_food_services_sales_total_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_and_food_services_sales_total_validate_all.plot()
plt.pyplot.show()
3.7.2. Розничная торговля и услуги общественного питания, кроме автомобилей и запасных частей
3.7.2.1. Отфильтровать ежемесячные данные о розничных продажах, чтобы указать только розничные продажи и услуги общественного питания, кроме автомобилей и запчастей.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_data = monthly_retail_actuals.filter(items=['Retail sales and food services excl motor vehicle and parts'])
print('All: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_data.shape)
All: (166, 1)
3.7.2.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_data.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_test = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_data.loc['2017-01-01':]
3.7.2.3. Проверка правильности разделения данных
print( 'Train: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train.shape) print( 'Test: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.2.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train.reset_index()
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train.columns = ['ds', 'y']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train.head()
3.7.2.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model = Prophet() Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.fit(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_train)
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b5a2c37f0>
3.7.2.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_future = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.make_future_dataframe(freq='M', periods=22)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.predict(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_future)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.2.7. График прогноза модели
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.plot(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast)
3.7.2.8. Диаграмма отдельных компонентов модели прогноза
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.plot_components(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast)
3.7.2.9. Подтвердить прогноз
3.7.2.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование в начало месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate = pd.DataFrame(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_filtered, index = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_test.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate = pd.concat([Retail_sales_and_food_services_excl_motor_vehicle_and_parts_test, Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate], axis=1)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate
3.7.2.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate.plot()
plt.pyplot.show()
3.7.2.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Abs Diff'] = (Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Retail sales and food services excl motor vehicle and parts'] - Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Prediction']).abs()
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Abs Diff %'] = (Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Retail sales and food services excl motor vehicle and parts'] - Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Prediction']).abs()/Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Retail sales and food services excl motor vehicle and parts']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate.loc['Average Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate.loc['Min Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate.loc['Max Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate
3.7.2.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_future_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.make_future_dataframe(freq='M', periods=48)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_model.predict(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_future_all)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts = monthly_retail_data.filter(items=['Retail sales and food services excl motor vehicle and parts'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_1 = Retail_sales_and_food_services_excl_motor_vehicle_and_parts.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_2 = Retail_sales_and_food_services_excl_motor_vehicle_and_parts.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all = pd.DataFrame(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_forecast_all, index = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_2.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all = pd.concat([Retail_sales_and_food_services_excl_motor_vehicle_and_parts_2, Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all], axis=1)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_1.append(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_validate_all.plot()
plt.pyplot.show()
3.7.3. Розничная торговля и общественное питание, кроме автозаправочных станций
3.7.3.1. Отфильтровать ежемесячные данные о розничных продажах, чтобы указать только данные о розничных продажах и услугах общественного питания, исключая данные о заправочных станциях.
Retail_sales_and_food_services_excl_gasoline_stations_data = monthly_retail_actuals.filter(items=['Retail sales and food services excl gasoline stations'])
print('All: ', Retail_sales_and_food_services_excl_gasoline_stations_data.shape)
All: (166, 1)
3.7.3.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_sales_and_food_services_excl_gasoline_stations_train = Retail_sales_and_food_services_excl_gasoline_stations_data.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_gasoline_stations_test = Retail_sales_and_food_services_excl_gasoline_stations_data.loc['2017-01-01':]
3.7.3.3. Проверка правильности разделения данных
print( 'Train: ', Retail_sales_and_food_services_excl_gasoline_stations_train.shape) print( 'Test: ', Retail_sales_and_food_services_excl_gasoline_stations_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.3.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_sales_and_food_services_excl_gasoline_stations_train = Retail_sales_and_food_services_excl_gasoline_stations_train.reset_index()
Retail_sales_and_food_services_excl_gasoline_stations_train.columns = ['ds', 'y']
Retail_sales_and_food_services_excl_gasoline_stations_train.head()
3.7.3.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_sales_and_food_services_excl_gasoline_stations_model = Prophet() Retail_sales_and_food_services_excl_gasoline_stations_model.fit(Retail_sales_and_food_services_excl_gasoline_stations_train)
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b556dc7f0>
3.7.3.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_sales_and_food_services_excl_gasoline_stations_future = Retail_sales_and_food_services_excl_gasoline_stations_model.make_future_dataframe(freq='M', periods=22)
Retail_sales_and_food_services_excl_gasoline_stations_forecast = Retail_sales_and_food_services_excl_gasoline_stations_model.predict(Retail_sales_and_food_services_excl_gasoline_stations_future)
Retail_sales_and_food_services_excl_gasoline_stations_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.3.7. График прогноза модели
Retail_sales_and_food_services_excl_gasoline_stations_model.plot(Retail_sales_and_food_services_excl_gasoline_stations_forecast)
3.7.3.8. Диаграмма отдельных компонентов модели прогноза
Retail_sales_and_food_services_excl_gasoline_stations_model.plot_components(Retail_sales_and_food_services_excl_gasoline_stations_forecast)
3.7.3.9. Подтвердить прогноз
3.7.3.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered = Retail_sales_and_food_services_excl_gasoline_stations_forecast.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование в начало месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered = Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_sales_and_food_services_excl_gasoline_stations_validate = pd.DataFrame(Retail_sales_and_food_services_excl_gasoline_stations_forecast_filtered, index = Retail_sales_and_food_services_excl_gasoline_stations_test.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_gasoline_stations_validate = pd.concat([Retail_sales_and_food_services_excl_gasoline_stations_test, Retail_sales_and_food_services_excl_gasoline_stations_validate], axis=1)
Retail_sales_and_food_services_excl_gasoline_stations_validate
3.7.3.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_sales_and_food_services_excl_gasoline_stations_validate.plot()
plt.pyplot.show()
3.7.3.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_sales_and_food_services_excl_gasoline_stations_validate['Abs Diff'] = (Retail_sales_and_food_services_excl_gasoline_stations_validate['Retail sales and food services excl gasoline stations'] - Retail_sales_and_food_services_excl_gasoline_stations_validate['Prediction']).abs()
Retail_sales_and_food_services_excl_gasoline_stations_validate['Abs Diff %'] = (Retail_sales_and_food_services_excl_gasoline_stations_validate['Retail sales and food services excl gasoline stations'] - Retail_sales_and_food_services_excl_gasoline_stations_validate['Prediction']).abs()/Retail_sales_and_food_services_excl_gasoline_stations_validate['Retail sales and food services excl gasoline stations']
Retail_sales_and_food_services_excl_gasoline_stations_validate.loc['Average Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_gasoline_stations_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_gasoline_stations_validate.loc['Min Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_gasoline_stations_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_gasoline_stations_validate.loc['Max Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_gasoline_stations_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_gasoline_stations_validate
3.7.3.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_sales_and_food_services_excl_gasoline_stations_future_all = Retail_sales_and_food_services_excl_gasoline_stations_model.make_future_dataframe(freq='M', periods=48)
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_gasoline_stations_model.predict(Retail_sales_and_food_services_excl_gasoline_stations_future_all)
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_gasoline_stations_forecast_all.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_gasoline_stations_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_gasoline_stations_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_sales_and_food_services_excl_gasoline_stations = monthly_retail_data.filter(items=['Retail sales and food services excl gasoline stations'])
Retail_sales_and_food_services_excl_gasoline_stations_1 = Retail_sales_and_food_services_excl_gasoline_stations.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_gasoline_stations_2 = Retail_sales_and_food_services_excl_gasoline_stations.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_sales_and_food_services_excl_gasoline_stations_validate_all = pd.DataFrame(Retail_sales_and_food_services_excl_gasoline_stations_forecast_all, index = Retail_sales_and_food_services_excl_gasoline_stations_2.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_gasoline_stations_validate_all = pd.concat([Retail_sales_and_food_services_excl_gasoline_stations_2, Retail_sales_and_food_services_excl_gasoline_stations_validate_all], axis=1)
Retail_sales_and_food_services_excl_gasoline_stations_validate_all = Retail_sales_and_food_services_excl_gasoline_stations_1.append(Retail_sales_and_food_services_excl_gasoline_stations_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_sales_and_food_services_excl_gasoline_stations_validate_all.plot()
plt.pyplot.show()
3.7.4. Розничная торговля и услуги общественного питания, кроме автомобилей, запасных частей и автозаправочных станций
3.7.4.1. Отфильтровать ежемесячные розничные данные только по розничным продажам и услугам общественного питания, общие данные только по розничным продажам и услугам общественного питания, исключая автомобили, запчасти и автозаправочные станции.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_data = monthly_retail_actuals.filter(items=['Retail sales and food services excl motor vehicle and parts and gasoline stations'])
print('All: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_data.shape)
All: (166, 1)
3.7.4.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_data.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_test = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_data.loc['2017-01-01':]
3.7.4.3. Проверка правильности разделения данных
print( 'Train: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train.shape) print( 'Test: ', Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.4.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train.reset_index()
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train.columns = ['ds', 'y']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train.head()
3.7.4.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model = Prophet() Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.fit(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_train)
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b52f0e5f8>
3.7.4.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_future = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.make_future_dataframe(freq='M', periods=22)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.predict(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_future)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.4.7. График прогноза модели
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.plot(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast)
3.7.4.8. Диаграмма отдельных компонентов модели прогноза
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.plot_components(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast)
3.7.4.9. Подтвердить прогноз
3.7.4.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование в начало месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate = pd.DataFrame(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_filtered, index = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_test.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate = pd.concat([Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_test, Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate], axis=1)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate
3.7.4.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate.plot()
plt.pyplot.show()
3.7.4.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Abs Diff'] = (Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Retail sales and food services excl motor vehicle and parts and gasoline stations'] - Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Prediction']).abs()
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Abs Diff %'] = (Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Retail sales and food services excl motor vehicle and parts and gasoline stations'] - Retail_and_food_services_sales_total_validate['Prediction']).abs()/Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Retail sales and food services excl motor vehicle and parts and gasoline stations']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate.loc['Average Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate.loc['Min Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate.loc['Max Abs Diff %'] = pd.Series(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate
3.7.4.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_future_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.make_future_dataframe(freq='M', periods=48)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_model.predict(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_future_all)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all.filter(["ds","yhat"])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all['ds'] = pd.to_datetime(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all.columns = ['Month', 'Prediction']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations = monthly_retail_data.filter(items=['Retail sales and food services excl motor vehicle and parts and gasoline stations'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_1 = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations.loc['2005-01-01':'2016-12-01']
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_2 = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all = pd.DataFrame(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_forecast_all, index = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_2.index, columns=['Prediction'])
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all = pd.concat([Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_2, Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all], axis=1)
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all = Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_1.append(Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_sales_and_food_services_excl_motor_vehicle_and_parts_and_gasoline_stations_validate_all.plot()
plt.pyplot.show()
3.7.5. Розничные продажи, всего
3.7.5.1. Фильтр Ежемесячные розничные продажи, общие данные
Retail_sales_total_data = monthly_retail_actuals.filter(items=['Retail sales, total'])
print('All: ', Retail_sales_total_data.shape)
All: (166, 1)
3.7.5.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_sales_total_train = Retail_sales_total_data.loc['2005-01-01':'2016-12-01']
Retail_sales_total_test = Retail_sales_total_data.loc['2017-01-01':]
3.7.5.3. Проверка правильности разделения данных
print( 'Train: ', Retail_sales_total_train.shape) print( 'Test: ', Retail_sales_total_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.5.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_sales_total_train = Retail_sales_total_train.reset_index()
Retail_sales_total_train.columns = ['ds', 'y']
Retail_sales_total_train.head()
3.7.5.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_sales_total_model = Prophet() Retail_sales_total_model.fit(Retail_sales_total_train)
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b52d2a4a8>
3.7.5.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_sales_total_future = Retail_sales_total_model.make_future_dataframe(freq='M', periods=22)
Retail_sales_total_forecast = Retail_sales_total_model.predict(Retail_sales_total_future)
Retail_sales_total_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.5.7. График прогноза модели
Retail_sales_total_model.plot(Retail_sales_total_forecast)
3.7.5.8. Диаграмма отдельных компонентов модели прогноза
Retail_sales_total_model.plot_components(Retail_sales_total_forecast)
3.7.5.9. Подтвердить прогноз
3.7.5.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_sales_total_forecast_filtered = Retail_sales_total_forecast.filter(["ds","yhat"])
Retail_sales_total_forecast_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование в начало месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_sales_total_forecast_filtered['ds'] = pd.to_datetime(Retail_sales_total_forecast_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_sales_total_forecast_filtered.columns = ['Month', 'Prediction']
Retail_sales_total_forecast_filtered = Retail_sales_total_forecast_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_sales_total_validate = pd.DataFrame(Retail_sales_total_forecast_filtered, index = Retail_sales_total_test.index, columns=['Prediction'])
Retail_sales_total_validate = pd.concat([Retail_sales_total_test, Retail_sales_total_validate], axis=1)
Retail_sales_total_validate
3.7.5.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_sales_total_validate.plot()
plt.pyplot.show()
3.7.5.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_sales_total_validate['Abs Diff'] = (Retail_sales_total_validate['Retail sales, total'] - Retail_sales_total_validate['Prediction']).abs()
Retail_sales_total_validate['Abs Diff %'] = (Retail_sales_total_validate['Retail sales, total'] - Retail_sales_total_validate['Prediction']).abs()/Retail_sales_total_validate['Retail sales, total']
Retail_sales_total_validate.loc['Average Abs Diff %'] = pd.Series(Retail_sales_total_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_sales_total_validate.loc['Min Abs Diff %'] = pd.Series(Retail_sales_total_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_sales_total_validate.loc['Max Abs Diff %'] = pd.Series(Retail_sales_total_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_sales_total_validate
3.7.5.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_sales_total_future_all = Retail_sales_total_model.make_future_dataframe(freq='M', periods=48)
Retail_sales_total_forecast_all = Retail_sales_total_model.predict(Retail_sales_total_future_all)
Retail_sales_total_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_sales_total_forecast_all = Retail_sales_total_forecast_all.filter(["ds","yhat"])
Retail_sales_total_forecast_all['ds'] = pd.to_datetime(Retail_sales_total_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_sales_total_forecast_all.columns = ['Month', 'Prediction']
Retail_sales_total_forecast_all = Retail_sales_total_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_sales_total = monthly_retail_data.filter(items=['Retail sales, total'])
Retail_sales_total_1 = Retail_sales_total.loc['2005-01-01':'2016-12-01']
Retail_sales_total_2 = Retail_sales_total.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_sales_total_validate_all = pd.DataFrame(Retail_sales_total_forecast_all, index = Retail_sales_total_2.index, columns=['Prediction'])
Retail_sales_total_validate_all = pd.concat([Retail_sales_total_2, Retail_sales_total_validate_all], axis=1)
Retail_sales_total_validate_all = Retail_sales_total_1.append(Retail_sales_total_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_sales_total_validate_all.plot()
plt.pyplot.show()
3.7.6. Розничные продажи, всего (без учета дилеров по продаже автомобилей и запчастей)
3.7.6.1. Отфильтровать ежемесячные данные о розничных продажах, чтобы указать только розничные продажи, всего (исключая продажи автомобилей и запчастей)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_data = monthly_retail_actuals.filter(items=['Retail sales, total (excl. motor vehicle and parts dealers)'])
print('All: ', Retail_sales_total_excl_motor_vehicle_and_parts_dealers_data.shape)
All: (166, 1)
3.7.6.2. Разделите данные на обучающие и тестовые данные
Мы будем погружать данные в два набора данных:
- Данные поезда
- Тестовые данные
Обычно мы используем сплит 70 Train/30 Test (70/30), 80 Train/20 Test (80/20), 90 Train/10 Test (90/10) или даже 95 Train/5 Test (95/5). где данные поезда используются для создания прогноза, а тестовые данные используются для проверки прогноза, но для упрощения мы разделим данные следующим образом:
- Данные поезда: с января 2005 г. по декабрь 2016 г.
- Данные испытаний: с января 2017 г. по октябрь 2018 г.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_data.loc['2005-01-01':'2016-12-01']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_test = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_data.loc['2017-01-01':]
3.7.6.3. Проверка правильности разделения данных
print( 'Train: ', Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train.shape) print( 'Test: ', Retail_sales_total_excl_motor_vehicle_and_parts_dealers_test.shape)
Train: (144, 1) Test: (22, 1)
3.7.6.4. Подготовка данных поезда для моделирования
Пророк требует, чтобы столбец даты назывался «ds», а столбец значений — «y».
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train.reset_index()
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train.columns = ['ds', 'y']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train.head()
3.7.6.5. Подходит для модели
Мы подгоняем модель, создавая экземпляр нового объекта Prophet. Затем вы вызываете его метод подгонки и передаете исторический фрейм данных.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model = Prophet() Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.fit(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_train)
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this. INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this. <fbprophet.forecaster.Prophet at 0x7f7b52406400>
3.7.6.6. Прогноз продаж с использованием модели
Затем прогнозы делаются в кадре данных со столбцом ds, содержащим даты, для которых должен быть сделан прогноз. Мы используем:
- Freq = «M», чтобы указать, что это месячные данные.
- Периоды = 22 используются, поскольку набор тестовых данных охватывает 22 месяца, поэтому мы можем сравнить, насколько хорошо модель прогнозирует продажи по сравнению с фактическими продажами.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_future = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.make_future_dataframe(freq='M', periods=22)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.predict(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_future)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast
Выше много информации. Столбцы, которые нам интересны в будущем, — это «ds», что указывает на месяц, и «yhat», что указывает на прогнозируемый объем продаж.
3.7.6.7. График прогноза модели
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.plot(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast)
3.7.6.8. Диаграмма отдельных компонентов модели прогноза
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.plot_components(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast)
3.7.6.9. Подтвердить прогноз
3.7.6.9.1. Подготовьте данные прогноза, чтобы мы могли сравнить прогноз с фактическими данными в тестовом наборе данных.
Нам нужны только два столбца данных — «ds», чтобы мы могли сопоставлять месяцы, и «yhat», чтобы мы могли сравнивать прогнозируемые продажи с фактическими продажами.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast.filter(["ds","yhat"])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered
Prophet возвращает все данные прогнозируемого месяца с датой окончания месяца. Преобразование к началу месяца необходимо, чтобы мы могли сравнить прогноз с фактическими данными.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered['ds'] = pd.to_datetime(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered['ds']) - pd.offsets.MonthBegin(n=0)
Переименуйте имена столбцов с «ds» и «yhat» на имена столбцов, используемые в тестовом наборе данных — «Месяц» и «Прогноз».
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered.columns = ['Month', 'Prediction']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered.set_index('Month')
Соедините набор данных прогноза с набором тестовых данных, чтобы мы могли сравнить, как работает модель прогноза.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate = pd.DataFrame(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_filtered, index = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_test.index, columns=['Prediction'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate = pd.concat([Retail_sales_total_excl_motor_vehicle_and_parts_dealers_test, Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate], axis=1)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate
3.7.6.9.2. График разницы фактических продаж с прогнозируемыми продажами
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate.plot()
plt.pyplot.show()
3.7.6.9.3. Вычислите абсолютную разницу между фактическими продажами и прогнозируемыми продажами.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Abs Diff'] = (Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Retail sales, total (excl. motor vehicle and parts dealers)'] - Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Prediction']).abs()
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Abs Diff %'] = (Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Retail sales, total (excl. motor vehicle and parts dealers)'] - Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Prediction']).abs()/Retail_and_food_services_sales_total_validate['Retail and food services sales, total']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate.loc['Average Abs Diff %'] = pd.Series(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Abs Diff %'].mean(), index = ['Abs Diff %'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate.loc['Min Abs Diff %'] = pd.Series(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Abs Diff %'].min(), index = ['Abs Diff %'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate.loc['Max Abs Diff %'] = pd.Series(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate['Abs Diff %'].max(), index = ['Abs Diff %'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate
3.7.6.9.4. Сравните все исторические/фактические продажи с прогнозируемыми продажами
Создайте прогноз продаж на 48 месяцев, используя модель прогноза.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_future_all = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.make_future_dataframe(freq='M', periods=48)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_model.predict(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_future_all)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all
Подготовьте прогнозируемые продажи, чтобы их можно было сравнить с фактическими/историческими продажами.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all.filter(["ds","yhat"])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all['ds'] = pd.to_datetime(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all['ds']) - pd.offsets.MonthBegin(n=0)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all.columns = ['Month', 'Prediction']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all.set_index('Month')
Отфильтруйте фактические/исторические продажи по периодам, когда нет прогнозируемых данных о продажах и когда есть прогнозируемые данные о продажах.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers = monthly_retail_data.filter(items=['Retail sales, total (excl. motor vehicle and parts dealers)'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_1 = Retail_sales_total_excl_motor_vehicle_and_parts_dealers.loc['2005-01-01':'2016-12-01']
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_2 = Retail_sales_total_excl_motor_vehicle_and_parts_dealers.loc['2017-01-01':]
Соедините фактические/исторические данные о продажах с прогнозируемыми данными о продажах
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all = pd.DataFrame(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_forecast_all, index = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_2.index, columns=['Prediction'])
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all = pd.concat([Retail_sales_total_excl_motor_vehicle_and_parts_dealers_2, Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all], axis=1)
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all = Retail_sales_total_excl_motor_vehicle_and_parts_dealers_1.append(Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all, sort=True)
Нанесите на график все данные, включая фактические/исторические данные о продажах с прогнозируемыми данными о продажах.
Retail_sales_total_excl_motor_vehicle_and_parts_dealers_validate_all.plot()
plt.pyplot.show()
3.8. Сохранить прогноз
Как и все, вновь созданный прогноз необходимо поддерживать. Скорее ежемесячно, поскольку это месячный прогноз, прогноз необходимо обновлять, чтобы отразить пересмотренную тенденцию.
Чтобы пересмотреть прогноз, чтобы отразить более актуальные данные, выполните описанные выше шаги, где вы будете пересматривать шаг 3.7.
При погружении данных в два набора данных:
- Данные поезда: с января 2005 г. по январь 2017 г. (+ 1 месяц)
- Данные испытаний: с февраля 2017 г. (+ 1 месяц) по ноябрь 2018 г. (+ 1 месяц)
Повторите процедуру для всех последующих месяцев.