Данные временных рядов можно найти повсюду, и для выполнения анализа временных рядов мы должны сначала предварительно обработать данные. Методы предварительной обработки временных рядов оказывают значительное влияние на точность моделирования данных.

Основные выводы из этого блога

В этой статье мы обсудим в основном эти моменты:

  1. Определение данных временных рядов и их важность.
  2. Этапы предварительной обработки данных временных рядов.
  3. Структурирование данных временных рядов, поиск пропущенных значений, шумоподавление функций и поиск выбросов, присутствующих в наборе данных.

Для начала давайте сначала разберемся с определением временного ряда:

Временной ряд — это последовательность равномерно распределенных наблюдений, записанных через определенный интервал времени.

Примером временного ряда могут быть цены на золото. В данном случае нашим наблюдением является цена золота, собранная через некоторое время через фиксированные промежутки времени. Единица времени может быть в минутах, часах, днях, годах и т. д. Но разница во времени между любыми двумя последовательными выборками будет одинаковой.

В этой статье мы увидим общие шаги предварительной обработки временных рядов, которые следует выполнить, прежде чем погрузиться в часть моделирования данных. Давайте рассмотрим общие проблемы, связанные с данными временных рядов.

Предварительная обработка данных временных рядов

Данные временных рядов содержат много информации, но обычно ее не видно. Распространенными проблемами, связанными с временными рядами, являются неупорядоченные временные метки, отсутствующие значения (или временные метки), выбросы и шум в данных. Из всех упомянутых проблем обработка пропущенных значений является самой сложной. Поскольку обычные методы вменения (метод, используемый для обработки отсутствующих данных путем замены отсутствующих значений для сохранения большей части информации) неприменимы при работе с данными временных рядов. Чтобы проанализировать анализ этой предварительной обработки в реальном времени, мы будем использовать набор данных Kaggle Air Passenger, который можно скачать здесь.

Структурирование временных рядов

Данные временных рядов обычно находятся в неструктурированных форматах, т. е. временные метки могут быть смешаны и неправильно упорядочены. Кроме того, в большинстве случаев столбец даты и времени имеет строковый тип данных по умолчанию, и важно сначала преобразовать столбец данных и времени в тип данных даты и времени, прежде чем применять к нему какую-либо операцию. Давайте реализуем это в нашем наборе данных:

import pandas as pd
passenger = pd.read_csv('AirPassengers.csv')
passenger['Date'] = pd.to_datetime(passenger['Date']) 
passenger.sort_values(by=['Date'], inplace=True, ascending=True)
#Above line will sort the values according to dates.

Вменение отсутствующих значений во временных рядах

Обработка пропущенных значений в данных временных рядов является сложной задачей. Обычные методы вменения неприменимы к данным временных рядов, поскольку имеет значение последовательность, в которой получаются значения. Для решения этой проблемы у нас есть следующие методы интерполяции:

Интерполяция

Интерполяция является широко используемым методом для вменения пропущенных значений временных рядов. Это помогает оценить отсутствующую точку данных, используя две окружающие известные точки данных. Этот метод прост и наиболее интуитивен. Однако интерполяция также имеет следующие подметоды:

  • Интерполяция на основе времени
  • Сплайн-интерполяция
  • Линейная интерполяция

Давайте посмотрим, как наши данные выглядят до импутации:

from matplotlib.pyplot import figure
import matplotlib.pyplot as plt
figure(figsize=(12, 5), dpi=80, linewidth=10)
plt.plot(passenger['Date'], passenger['Passengers'])
plt.title('Air Passengers Raw Data with Missing Values')
plt.xlabel('Years', fontsize=14)
plt.ylabel('Number of Passengers', fontsize=14)
plt.show()

Давайте посмотрим на вменения:

passenger[‘Linear’] = passenger[‘Passengers’].interpolate(method=’linear’)
passenger[‘Spline order 3’] = passenger[‘Passengers’].interpolate(method=’spline’, order=3)
passenger[‘Time’] = passenger[‘Passengers’].interpolate(method=’time’)
methods = ['Linear', 'Spline order 3', 'Time']
from matplotlib.pyplot import figure
import matplotlib.pyplot as plt
for method in methods:
    figure(figsize=(12, 4), dpi=80, linewidth=10)
    plt.plot(passenger["Date"], passenger[method])
    plt.title('Air Passengers Imputation using: ' + types)
    plt.xlabel("Years", fontsize=14)
    plt.ylabel("Number of Passengers", fontsize=14)
    plt.show()

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

Удаление шума из временного ряда

Шумовые элементы во временном ряду могут вызвать серьезные проблемы, поэтому перед построением любой модели настоятельно рекомендуется удалить шум. Процесс тщательной минимизации шума называется шумоподавлением. Ниже приведены некоторые методы, обычно используемые для удаления шума из временного ряда:

  • Повторяющиеся средства

Скользящее среднее — это просто среднее значение для окна предыдущих наблюдений, где окно представляет собой последовательность значений из данных временного ряда. Среднее значение рассчитывается для каждого упорядоченного окна. Это может значительно помочь минимизировать шум в данных временных рядов.

Применим скользящее среднее к цене акций Google:

rolling_google = google_stock_price['Open'].rolling(20).mean()
plt.plot(google_stock_price['Date'], google_stock_price['Open'])
plt.plot(google_stock_price['Date'], rolling_google)
plt.xlabel('Date')
plt.ylabel('Stock Price')
plt.legend(['Open','Rolling Mean'])
plt.show()

  • Преобразование Фурье

Преобразование Фурье может помочь удалить шум путем преобразования данных временных рядов в частотную область, и оттуда мы можем отфильтровать шумовые частоты. Затем мы можем применить обратное преобразование Фурье, чтобы получить отфильтрованный временной ряд. Давайте применим преобразование Фурье к цене акций Google.

denoised_google_stock_price = fft_denoiser(value, 0.001, True)
plt.plot(time, google_stock['Open'][0:300])
plt.plot(time, denoised_google_stock_price)
plt.xlabel('Date', fontsize = 13)
plt.ylabel('Stock Price', fontsize = 13)
plt.legend([‘Open’,’Denoised: 0.001'])
plt.show()

Обнаружение выбросов во временном ряду

Выброс во временном ряду относится к внезапному пику или падению линии тренда. Нас не интересуют факторы, вызывающие выбросы, но, безусловно, факторов может быть несколько. Мы ограничимся обнаружением выбросов. Давайте взглянем на доступные методы обнаружения выбросов:

  • Подход, основанный на скользящих статистических границах

Этот метод наиболее интуитивно понятен и работает практически для всех видов временных рядов. В этом методе верхние и нижние границы создаются на основе конкретных статистических показателей, таких как среднее значение и стандартное отклонение, оценки Z и T и процентили распределений. Например, мы можем определить верхнюю и нижнюю границу как:

Взятие среднего значения и стандартного отклонения всего ряда не рекомендуется для обнаружения выбросов, поскольку в этом случае граница будет статической. Границы должны создаваться на скользящей основе, например, рассмотрение непрерывного набора наблюдений для создания границ, а затем переход к другому окну. Этот метод очень эффективен и прост для обнаружения выбросов.

  • Изолированный лес

Как следует из названия, Изолирующий лес — это алгоритм машинного обучения на основе дерева решений для обнаружения аномалий. Он работает путем изоляции точек данных в заданном наборе функций с использованием разделов дерева решений. Другими словами, он берет выборку из набора данных и строит деревья по этой выборке, пока каждая точка не будет изолирована. Чтобы изолировать точку данных, разделы создаются случайным образом путем выбора разделения между максимальным и минимальным значениями этой функции до тех пор, пока каждая точка не будет изолирована. Случайное разделение функций создаст более короткие пути в деревьях для аномальных точек данных и, таким образом, отличает их от остальных данных.

  • Кластеризация K-средних

Кластеризация K-средних снова является неконтролируемым алгоритмом машинного обучения, часто используемым для обнаружения выбросов в данных временных рядов. Этот алгоритм просматривает точку данных в наборе данных и группирует аналогичные точки данных в K кластеров. Аномалии различаются путем измерения расстояния от точки данных до ее ближайшего центроида. Если расстояние превышает определенное пороговое значение, точка данных помечается как аномалия. Алгоритм K-Means использует для сравнения евклидовы расстояния.

Возможные вопросы интервью

Если вы пишете проект по временным рядам в своем резюме, то интервьюер может задать следующие возможные вопросы из этой темы:

  1. Каковы способы предварительной обработки данных временных рядов и чем они отличаются от стандартных методов вменения?
  2. Что означает окно временного ряда?
  3. Вы слышали о методе изолированного леса? Если да, то можете объяснить, как это работает?
  4. Что такое преобразование Фурье и зачем оно нам?
  5. Каковы различные методы исправления пропущенных значений в данных временных рядов?

Заключение

В этом руководстве мы рассмотрели некоторые распространенные методы предварительной обработки данных временных рядов. Мы начали с упорядочивания наблюдений временных рядов; затем мы рассмотрели различные методы вменения отсутствующих значений. Мы обнаружили, что вменение временных рядов отличается от традиционных методов вменения, поскольку мы имеем дело с упорядоченным набором наблюдений. Кроме того, мы применили некоторые методы удаления шума к набору данных о ценах на акции Google и, наконец, обсудили некоторые методы обнаружения выбросов для временных рядов. Использование всех упомянутых шагов предварительной обработки обеспечивает получение высококачественных данных, готовых для построения сложных моделей.

Наслаждайтесь обучением! Наслаждайтесь предварительной обработкой! Наслаждайтесь алгоритмами!