Вопрос или проблема
У меня есть данные временных рядов на Python 3, как показано ниже:
Дата `Еженедельные_продажи`
2010-05-02 3400
2010-05-02 5600
2010-05-02 4590
2010-05-02 5800
2010-05-12 2380
2010-05-12 6700
2010-05-12 3700
Временной ряд не является непрерывным, так как есть несколько наблюдений одной и той же даты. Я пытаюсь спрогнозировать продажи на Python, используя ARIMA, но мой график ACF и PACF показывает, что нет корреляции между лагами. Также, если я запускаю тест Дики-Фуллера, чтобы проверить стационарность, моя система зависает.
Как я могу это исправить?
Похоже, вы потеряли немного информации в этом наборе данных. У вас не должно быть 4 измерений для одной временной отметки для одной переменной – как вы узнаете, какую из первых четырех строк использовать для 2010-05-02
?
Я бы предложил проверить источник ваших данных, или же придумать способ объяснить значение четырех значений… они как-то отличаются (используя другую информацию)?
Как вы вообще создаете лаги по этому индексу даты? Брать среднее за каждый день?
В зависимости от пакета, который вы используете для теста Дики-Фуллера (и других методов), он может быть не предназначен для работы с одинаковыми временными отметками в качестве входных данных… что может объяснять, почему сессия зависает.
Один из вариантов – использовать байесовский подход и моделировать данные как распределение возможных значений, которые меняются со временем. Каждая неделя будет частью модели состояния. Самое распространенное название / структура – Байесовская структурная модель временных рядов (BSTS).
Ответ или решение
Обработка временных рядов с несколькими наблюдениями для одного временного штампа
Ваша проблема с временными рядами, где несколько наблюдений соответствуют одной и той же дате, является распространенной среди аналитиков данных и требует тщательного подхода для эффективного решения. Рассмотрим несколько шагов, которые помогут вам справиться с данной ситуацией.
1. Понимание проблемы
Существует множество причин, по которым вы можете иметь несколько наблюдений на одну и ту же дату. Это может быть связано с различными точками продажи, различными каналах распределения или различными группами клиентов. Прежде всего, вам следует уточнить, что означают эти дублирующие значения. Если они действительно представляют одно и то же событие, то, возможно, есть необходимость агрегировать эти данные.
2. Агрегация данных
Если ваши наблюдения не различаются по каким-либо критериям, вам стоит рассмотреть способ агрегирования данных. Для этого вы можете выполнить следующие действия:
-
Среднее значение: Рассчитайте среднее значение для каждой даты. Это позволит вам сгладить данные и устранить шум:
import pandas as pd data = {'Date': ['2010-05-02', '2010-05-02', '2010-05-02', '2010-05-02', '2010-05-12', '2010-05-12', '2010-05-12'], 'Weekly_Sales': [3400, 5600, 4590, 5800, 2380, 6700, 3700]} df = pd.DataFrame(data) # Преобразуем в datetime df['Date'] = pd.to_datetime(df['Date']) # Агрегация aggregated_df = df.groupby('Date')['Weekly_Sales'].mean().reset_index()
-
Суммирование: Если дублирующие значения представляют собой продажи из разных источников, можно использовать суммирование:
aggregated_df = df.groupby('Date')['Weekly_Sales'].sum().reset_index()
-
Другие статистики: Вы также можете использовать медиану, максимальные или минимальные значения, в зависимости от контекста задачи.
3. Проверка стационарности
После агрегации данных вам следует повторно провести тесты на стационарность, такие как тест Дики-Фуллера. Это можно сделать следующим образом:
from statsmodels.tsa.stattools import adfuller
result = adfuller(aggregated_df['Weekly_Sales'])
print('ADF Statistic:', result[0])
print('p-value:', result[1])
Если данные по-прежнему не стационарные, вы можете рассмотреть возможность применения преобразований, таких как взятие разностей и логарифмов.
4. Построение модели
После того, как вы убедитесь, что данные стационарные, вы можете приступить к построению модели. Если модель ARIMA не работает должным образом, рассмотрите использование других подходов, таких как:
- SARIMA: Если у вас есть сезонные данные, можно рассмотреть использование сезонного ARIMA.
- Байесовская структура временных рядов: Это продвинутый метод, который учитывает неопределенности и может быть полезен, если у вас много данных и вы хотите учесть вероятность:
# Установка библиотеки для BSTS # !pip install bsts # Пример использования BSTS можно найти в документации
5. Заключение
Работа с временными рядами, содержащими несколько наблюдений за одно и то же время, требует корректной агрегации данных, постоянного анализа их стационарности и выбора подходящей модели. Если вы будете следовать описанным шагам, ваши прогнозы станут более надежными и точными.
Если ваша система продолжает зависать, возможно, это связано с недостатком ресурсов или несовместимостью библиотек, поэтому имеет смысл провести оптимизацию кода или воспользоваться более мощными инструментами обработки данных.
Основываясь на приведенных выше рекомендациях, вы сможете разработать более эффективную стратегию работы с вашими временными рядами.