$ sudo teach IT

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

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

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

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

Что вы узнаете в рамках статьи

  • Что такое временной ряд.
  • Как строить графики изменения показателей во времени.
  • Как работать с датами в Matplotlib.
  • Как отображать несколько временных рядов одновременно.
  • Как настраивать отображение длинных диапазонов дат.
  • Как выделять важные события на графике.
  • Какие особенности характерны для временных рядов.

Ключевые термины

  • Временной ряд — последовательность наблюдений, привязанных ко времени.
  • Временная ось — ось графика, содержащая даты или время.
  • Тренд — долгосрочное направление изменения показателя.
  • Сезонность — регулярно повторяющиеся изменения данных.
  • Аннотация — текстовое пояснение на графике.
  • Временная метка (timestamp) — конкретный момент времени.

Что такое временной ряд

Представим, что интернет-магазин сохраняет ежедневную выручку.

date        revenue
2025-01-01    1200
2025-01-02    1350
2025-01-03    1400
2025-01-04    1600

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

Первый график временного ряда

Начнем с простого примера.

import matplotlib.pyplot as plt

dates = [
    "2025-01-01",
    "2025-01-02",
    "2025-01-03",
    "2025-01-04",
    "2025-01-05"
]

sales = [1200, 1350, 1400, 1600, 1800]

plt.plot(dates, sales)

plt.show()

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

Использование объектов datetime

На практике даты обычно хранятся не строками, а специальными объектами даты и времени. Для этого используется модуль datetime.

from datetime import datetime

dates = [
    datetime(2025, 1, 1),
    datetime(2025, 1, 2),
    datetime(2025, 1, 3),
    datetime(2025, 1, 4),
    datetime(2025, 1, 5)
]

Matplotlib умеет работать с такими объектами автоматически. Это особенно удобно при анализе реальных данных.

Построение графика с datetime

import matplotlib.pyplot as plt
from datetime import datetime

dates = [
    datetime(2025, 1, 1),
    datetime(2025, 1, 2),
    datetime(2025, 1, 3),
    datetime(2025, 1, 4),
    datetime(2025, 1, 5)
]

sales = [1200, 1350, 1400, 1600, 1800]

plt.plot(dates, sales)

plt.show()

Такой подход считается стандартным при работе с временными рядами.

Настройка подписей осей

Как и в обычных графиках, временные ряды желательно снабжать подписями.

plt.title("Продажи по дням")
plt.xlabel("Дата")
plt.ylabel("Выручка")

Полный пример:

plt.plot(dates, sales)

plt.title("Продажи по дням")
plt.xlabel("Дата")
plt.ylabel("Выручка")

plt.show()

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

Проблема длинных подписей

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

Например:

dates = [
    "2025-01-01",
    "2025-01-02",
    "2025-01-03",
    ...
]

Если дат много, график становится трудночитаемым.

Поворот подписей

Для решения проблемы обычно поворачивают подписи: plt.xticks(rotation=45).

Полный пример:

plt.plot(dates, sales)

plt.xticks(rotation=45)

plt.show()

После поворота даты становятся значительно более читаемыми. Этот прием используется очень часто.

Форматирование дат на графике

При построении временных рядов Matplotlib автоматически подбирает подписи для оси X. Иногда это приводит к неожиданному результату: вместо одной подписи на день появляются отметки каждые 12 часов (00 и 12).

Например, для диапазона из нескольких дней график может отображать такие значения:

01-01 00
01-01 12
01-02 00
01-02 12
...

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

Если требуется показывать только даты с указанием года, можно использовать специальные форматтеры из модуля matplotlib.dates.

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

ax = plt.gca()

ax.xaxis.set_major_formatter(
    mdates.DateFormatter('%d.%m.%Y')
)

plt.show()

Результат:

01.01.2025
02.01.2025
03.01.2025
04.01.2025

Наиболее полезные шаблоны форматирования:

Формат Пример
%d.%m.%Y 05.01.2025
%d-%m-%Y 05-01-2025
%Y-%m-%d 2025-01-05
%d %b %Y 05 Jan 2025
%B %Y January 2025
%H:%M 14:30

Также можно управлять частотой отображения дат. Например, показывать только одну метку на день:

ax.xaxis.set_major_locator(
    mdates.DayLocator()
)

или одну метку на месяц:

ax.xaxis.set_major_locator(
    mdates.MonthLocator()
)

Таким образом, связка Locator + Formatter позволяет полностью контролировать внешний вид временной оси: выбирать шаг между датами и формат их отображения. Это особенно полезно при работе с большими временными рядами, где автоматически созданные подписи могут оказаться слишком частыми или неудобными для чтения.

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

Предположим, компания анализирует продажи двух магазинов.

sales_a = [1200, 1350, 1400, 1600, 1800]
sales_b = [1000, 1100, 1250, 1500, 1700]

Мы можем отобразить оба ряда одновременно.

plt.plot(
    dates,
    sales_a,
    label="Магазин A"
)

plt.plot(
    dates,
    sales_b,
    label="Магазин B"
)

plt.legend()

plt.show()

Теперь график позволяет сравнивать динамику двух показателей.

Когда это полезно

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

Работа с длинными диапазонами дат

Иногда данные собираются месяцами или даже годами.

Например:

2022
2023
2024
2025

В этом случае график может оказаться перегруженным подписями. Matplotlib предоставляет специальные инструменты форматирования дат.

Для этого используется модуль:

import matplotlib.dates as mdates

Форматирование дат

Например:

plt.gca().xaxis.set_major_formatter(
    mdates.DateFormatter("%Y-%m")
)

Теперь даты будут отображаться в формате:

2025-01
2025-02
2025-03

Такой формат часто используется в аналитических отчетах.

Выделение важных событий

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

Вертикальные линии

Самый простой способ выделения события — вертикальная линия.

import matplotlib.pyplot as plt
import pandas as pd

dates = pd.to_datetime([
    "2025-01-01",
    "2025-01-02",
    "2025-01-03",
    "2025-01-04",
    "2025-01-05"
])

sales = [120, 150, 180, 160, 210]

plt.figure(figsize=(8, 4))

plt.plot(dates, sales, marker="o")

plt.axvline(x=dates[2], color="red", linestyle="--", linewidth=2, label="Начало акции")

plt.title("Продажи по дням")
plt.xlabel("Дата")
plt.ylabel("Продажи")
plt.legend()
plt.grid(True)

plt.show()

На графике появится вертикальная линия, показывающая момент события.

Добавление подписи

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

plt.annotate(
    "Запуск рекламы",
    (dates[2], 1400)
)

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

Поиск трендов

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

Наиболее частые ошибки

  • Использовать строки вместо datetime при сложной работе с датами
    Это ограничивает возможности форматирования.
  • Не поворачивать подписи дат
    График становится трудно читаемым.
  • Отображать слишком много временных рядов одновременно
    Визуализация перегружается.
  • Не подписывать важные события
    Пользователям сложно интерпретировать изменения на графике.
  • Игнорировать временной порядок данных
    Это может привести к неверным выводам.

Наиболее частые вопросы

  • Можно ли использовать строки вместо datetime?
    Да, но для серьезной работы лучше использовать datetime.
  • Зачем нужен модуль matplotlib.dates?
    Для более гибкого управления отображением дат.
  • Когда использовать несколько временных рядов на одном графике?
    Когда требуется сравнить динамику различных показателей.
  • Для чего нужны аннотации?
    Они помогают пояснять важные события на графике.
  • Можно ли отображать данные за несколько лет?
    Да, Matplotlib поддерживает работу с большими временными диапазонами.

Итоги

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

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

На следующий урок