3 функции (с кодом) для анализа временных рядов в Pandas

Pandas почти не нуждается в представлении. Для тех, кто только начинает заниматься наукой о данных, Pandas расшифровывается как Panel Data Analysis и в настоящее время является основной библиотекой для преобразования данных в Python.

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

Временная последовательность

Давайте сначала договоримся о том, что такое временной ряд.

Ряд значений величины, полученных в последовательные моменты времени, часто с равными интервалами между ними. (Оксфордские языки)

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

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

Использование панд

Давайте import numpy as np и import pandas as pd.

Первое, чему мы должны научиться, это как создать набор дат в Pandas. Это может быть полезно при создании временных рядов для целей обучения.

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

# Create a date range of 7 days
pd.date_range("2022-01-01", periods=7, freq='D')
[OUT]:
DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04','2022-01-05', '2022-01-06', '2022-01-07'],               dtype='datetime64[ns]', freq='D')

Обратите внимание, что вывод представляет собой список с 7 днями от нашей начальной даты. Есть много других частот, которые можно использовать asfreq. Наиболее распространены "W” для недели, "M” для даты окончания месяца, "MS” для начала месяца и многие другие, которые можно найти здесь.

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

# Setting a seed for reproductionability
np.random.seed(12)
# Create dataset
df = pd.DataFrame({
 'date': pd.date_range("2022-01-01", periods=180, freq='D'),
 'sales': np.random.randint(1000, 10000, size=180)})
 # Set index
df = df.set_index('date')

Теперь перейдем к кодам функций Pandas. Обратите внимание, что важной характеристикой временного ряда является наличие дат в качестве индекса. Это требование выполняется, когда мы устанавливаем индекс в предыдущем коде.

ресамплинг

Первая интересная функция — это resample. Что он делает, так это берет набор данных или серию (столбец) и агрегирует данные в соответствии с rule, предоставленным в качестве аргумента. Это своего рода группа по функциям по дате.

Частота дат нашего набора данных ежедневно, верно? Что, если мы хотим преобразовать его в ежемесячные продажи?

Мы можем сделать это с помощью resample , но, поскольку данные агрегируются, мы также должны добавить функцию для работы с агрегированными числами. Мы можем sum() или вычислить mean() или median(), посмотреть max() месяца и т. д..

# Resample by month end date
df.resample(rule= 'M').mean()

Взяв среднее значение по месяцам и установив индекс как дату окончания месяца, вот результат.

Давайте теперь построим агрегированные данные по еженедельным продажам.

# Resample plot
df.resample('W').mean().plot(figsize=(15,5), title='Avg Weekly Sales');

Похоже, у нас наблюдается снижение продаж в период с марта по апрель и пик в середине июня.

Сдвиг

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

# Create a copy of the data
df_shift = df.copy()
#Shift one day up
df_shift['next_day_sales'] = df_shift.sales.shift(-1)
#Shift one week up
df_shift['next_week_sales'] = df_shift.sales.shift(-7)

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

Очевидно, что при желании мы можем создать различия между этими столбцами.

# Net gain/loss week over week
df_shift['one_week_net'] = df_shift.sales - df_shift.sales.shift(-7)

Скользящее среднее

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

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

# Calculate 2 days average with Pandas
df.rolling(2).mean()

На следующем рисунке мы видим, что первое значение равно NaN, так как данных недостаточно (в данном случае 2 точки данных) для создания среднего значения. Итак, для второй точки он берет две первые строки исходного набора данных и вычисляет среднюю точку. (6787 + 4325)/2 = 5556.

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

# Rolling plot
df.sales.plot(figsize=(25,8), legend=True, linestyle='--', color='darkgray')
df.rolling(window=7).sales.mean().plot(legend=True, label='7 day average', linewidth=2)
df.rolling(30).sales.mean().plot(legend=True, label='30 day average', linewidth=3)
df.rolling(100).sales.mean().plot(legend=True, label='100 day average', linewidth=4);

Перед тем, как ты уйдешь

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

  • resample: преобразование данных из ежедневной частоты в другие временные частоты.
  • shift: перемещайте данные вверх или вниз по столбцу для сравнения или вычислений.
  • rolling: Создавайте скользящие средние, наблюдая за тенденциями.

Если вам понравились эти данные, подписывайтесь на меня, чтобы узнать больше.



Если вы хотите начать членство в Medium, вот реферальная ссылка.

Рекомендации

Диапазон дат Pandas: https://pandas.pydata.org/docs/reference/api/pandas.date_range.html

Повторная выборка Pandas: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html

Сдвиг панд: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.shift.html

Панды катятся: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rolling.html