Как стать автором
Обновить
747.25
OTUS
Цифровые навыки от ведущих экспертов

Полезные методы работы с данными в Pandas. Часть 2

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров11K
Автор статьи: Роман Козлов

Руководитель курса BI-аналитика

Введение

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

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

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

Методы работы с временными рядами

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

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

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

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

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

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

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

Скользящие средние в Pandas, метод rolling()

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

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

В общем виде формула вычисления простого скользящего среднего выглядит так:

SMA_{t}=\frac{1}{n}\sum_{i=0}^{n-1}p_{t-1}=\frac{p_{t}+p_{t-1}+...+p_{t-i}+...+p_{t-n+2}+p_{t-n+1}}{n}

,где n - размер окна для расчёта скользящего среднего, а pti - значение исходной функции в точке t i.

Например, если у нас есть временной ряд данных 4, 5, 6, 7, 8, 9 и размер окна равен 3, то скользящее среднее будет вычислено следующим образом:

SMA3 = (4 + 5 + 6)/3 = 5
SMA4 = (5 + 6 + 7)/3 = 6
SMA5 = (6 + 7 + 8)/3 = 7
SMA6 = (7 + 8 + 9)/3 = 8

Начинаем мы считать с SMA3, так как размер окна равен 3. Именно после третьего элемента временного ряда у нас есть достаточное количество элементов для вычисления среднего значения по окну размером 3.

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

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

При использовании метода rolling(), нужно указать размер окна с помощью параметра window. Затем можете применять различные функции к этому скользящему окну, например mean(), для вычисление скользящего среднего для конкретного элемента.

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

import pandas as pd

data = [4, 5, 6, 7, 8, 9]
df = pd.DataFrame(data, columns=["Значения"]) 

df["Скользящее_среднее"] = df["Значения"].rolling(window=3).mean()

Результаты вычисления скользящего среднего будут сохранены в одноименный столбик в датафрейме.

Давайте рассмотрим более интересный и приближенный к реальности пример, где вычисление скользящего среднего могут очень пригодится. Мы проанализируем ежедневное изменение цены на акции компании Microsoft за последние 2 года.

Сначала установим библиотеку yfinance, необходимую для получения цен для акции:

pip install yfinance

 Затем импортируем библиотеки для работы с данными:

import pandas as pd 
import yfinance as yf
import matplotlib.pyplot as plt

Мы используем метод download() библиотеки vfinance и сохраним показатели Open High Low Close Adi Close и Volume, которые характеризуют ежедневное изменение цены на акции Microsoft.

msft = yf.download("MSFT", start="2020-01-01", end="2023-04-08")

Данные сохранятся в датафрейм, и мы сможем посчитать скользящее среднее для цены закрытия акций с размером окна 50 дней:

msft["SMA_50"] = msft["Close"].rolling(window=50).mean()

А далее мы просто нарисуем обычный линейный график, который отобразит динамику изменения цены закрытия за каждый день и скользящую среднюю за 50-дней.

plt.figure(figsize=(12, 6)) 
plt.plot(msft["Close"], label="Цена закрытия")
plt.plot(msft["SMA_50"], label="50-дневная скользящая средняя") 
plt.title("Динамика изменения цены на акции Microsoft") 
plt.xlabel("Дата")
plt.ylabel("Цена") 
plt.legend() 
plt.show()

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

Например, видно, что нисходящий тренд на акции, который продолжался весь 2022 год сменился в начале 2023 года и теперь цены уверенно растут.

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

Однако стоит отметить, что такие сигналы могут быть ложными и необходимо дополнительное подтверждение от других технических индикаторов или анализа.

Смещение данных, метод shift()

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

В Pandas для создания лаговых переменных можно использовать метод shift(). Он смещает данные на указанное количество строк вверх или вниз. Это полезно, когда нужно сравнить значения на текущей строке с

предыдущими или будущими значениями. Например, мы можем сместить данные на одну строку вниз, чтобы сравнить значения на текущей строке с предыдущей строкой. Мы также можем сместить данные на несколько строк вверх, чтобы сравнить значения на текущей строке с будущими значениями. Например, для создания лаговой переменной для временного ряд данных 4, 5, 6, 7, 8, 9с лагом 1, можно выполнить следующий код:

import pandas as pd

data = pd.Series([4, 5, 6, 7, 8, 9]) 
lag_1 = data.shift(1)

Мы получим новый столбик, который содержит данные из предыдущего временного ряда со смещением вперед на 1 период: [NaN, 4, 5, 6, 7, 8].

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

С помощью следующего кода мы сможем теперь посчитать динамику абсолютного изменения показателя временного ряда:

difference = data - lag_1

Мы можем использовать метод shift() и рассчитать показатель ежедневного колебания цены закрытия на акции в процентах.

plt.figure(figsize=(12, 6))
plt.plot((msft.Close/msft.Close.shift(1) - 1)*100, label="Цена закрытия") plt.title("Ежедневные колебания цены закрытия на акции Microsoft") plt.xlabel("Дата")
plt.ylabel("Изменение в %") plt.legend()
plt.show()

 

На этом графике видно, что в начале 2020 года ежедневное изменение цены закрытия на акции Microsoft достигало 15%. Такая повышенная волатильность возможно связана с мировым локдауном, связанным с пандемией Covid-19.

Также с помощью методаshift()можно вычислять среднемесячные или среднегодовые изменения исследуемых показателей.

Например, чтобы рассчитать среднемесячное изменение цены закрытия акций, можно использовать методshift()с аргументом freq=pd.DateOffset(months=1), чтобы сдвинуть цену закрытия на один месяц назад. Затем можно рассчитать отношение текущей цены закрытия к цене закрытия месяц назад и вычесть из него единицу, чтобы получить процентное изменение цены за месяц.

Аналогично, можно использовать методshift()с аргументом freq=pd.DateOffset(months=1)для расчета среднегодовых изменений показателей.

Таким образом, методshift()представляет собой мощный инструмент для анализа временных рядов и позволяет извлекать ценную информацию из данных.

Заключение

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

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

Еще одним методом является декомпозиция временных рядов на тренд, сезонность и остаток, что позволяет более детально проанализировать изменения в данных.

Кроме того, существует множество методов для прогнозирования временных рядов, включая модели ARIMA, SARIMA, модели на основе экспоненциального сглаживания, нейронные сети и многие другие.

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

В следующей статье мы рассмотрим задачи, связанные с преобразованием вложенных структур данных и методы нормализация сложных JSON-структур. Такие задачи очень часто стоят перед аналитиками, особенно после получения данных при работе с различными API.

В заключение приглашаю вас на бесплатный вебинар, который прольет свет на разнообразие вариантов профессиональной специализации внутри обширной сферы аналитики данных. Если вы уже интересовались этой темой хоть немного, то наверняка обратили внимание, какой большой разброс навыков встречается в описаниях вакансий в разделе “Требования”. Возникает тревожный вопрос - неужели ВСЁ это нужно знать и уметь? Неужели дата-аналитик настолько универсальный солдат? А если какая-то сфера мне упорно не дается - что делать?

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

Теги:
Хабы:
+7
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS