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