0Pricing
Pandas & NumPy Academy · Урок

Визуализация месячной динамики

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

«Визуализация месячной динамики» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Вычисление месячных итогов выручки

Перед построением диаграммы агрегируйте DataFrame с продажами до месячных итогов. Сгруппируйте данные по столбцу Period year_month и просуммируйте выручку. Преобразуйте PeriodIndex в DatetimeIndex с помощью .to_timestamp(), чтобы форматировщик дат Matplotlib корректно отображал подписи делений. Сортировка по индексу обеспечивает хронологическое направление линейной диаграммы слева направо.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_parquet('sales_features.parquet')

monthly = df.groupby('year_month')['revenue'].sum().sort_index()
monthly.index = monthly.index.to_timestamp()
print(monthly.head())

Построение линейной диаграммы месячной выручки

Создайте Figure и Axes с помощью plt.subplots(figsize=(12, 5)) и вызовите ax.plot(), чтобы построить тенденцию месячной выручки. Используйте marker='o', чтобы поместить точку в каждом месяце: так отдельные значения будут видны даже на сглаженной линии. Задайте цвет и толщину линии, чтобы основная тенденция выделялась среди добавляемых позднее дополнительных рядов.

fig, ax = plt.subplots(figsize=(12, 5))

ax.plot(monthly.index, monthly.values,
        color='steelblue', linewidth=2, marker='o', markersize=5,
        label='Monthly Revenue')

ax.set_title('Monthly Revenue Trend')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue (USD)')
plt.tight_layout()
plt.show()

Добавление скользящего среднего за 3 месяца

Линия исходной месячной выручки может выглядеть неровной из-за сезонного шума. Добавьте скользящее среднее за 3 месяца, вычисленное с помощью monthly.rolling(3).mean(), чтобы яснее показать основную тенденцию. Изобразите его пунктирной линией контрастного цвета, чтобы оно выделялось, но не скрывало исходный ряд.

rolling_avg = monthly.rolling(3).mean()

ax.plot(rolling_avg.index, rolling_avg.values,
        color='darkorange', linewidth=2, linestyle='--',
        label='3-Month Moving Avg')

ax.legend()
plt.show()

Аннотирование месяца с пиковым значением

Используйте ax.annotate(), чтобы отметить месяц с максимальной выручкой. Найдите пик с помощью monthly.idxmax(), а его значение — с помощью monthly.max(). Стрелка аннотации указывает от текстовой подписи на пиковую точку данных, поэтому вывод сразу заметен любому читателю диаграммы, в том числе получившему её в формате PNG или PDF.

peak_date = monthly.idxmax()
peak_val = monthly.max()

ax.annotate(f'Peak: ${peak_val:,.0f}',
            xy=(peak_date, peak_val),
            xytext=(peak_date, peak_val * 1.1),
            arrowprops=dict(arrowstyle='->', color='red'),
            color='red', fontsize=10)
plt.show()

Аннотирование месяца с минимальным значением

Аналогично отметьте месяц с минимальной выручкой, используя monthly.idxmin(), чтобы выявить возможную сезонность или перебои. Аннотации пикового и минимального значений дают полную картину: они показывают не только лучший месяц, но и глубину возможного падения выручки, что помогает планировать денежный поток.

trough_date = monthly.idxmin()
trough_val = monthly.min()

ax.annotate(f'Trough: ${trough_val:,.0f}',
            xy=(trough_date, trough_val),
            xytext=(trough_date, trough_val * 0.85),
            arrowprops=dict(arrowstyle='->', color='navy'),
            color='navy', fontsize=10)
plt.show()

Форматирование подписей делений дат

Стандартные подписи дат на диаграммах Matplotlib часто накладываются друг на друга или имеют неудобный для чтения формат. Импортируйте mdates из matplotlib и задайте MonthLocator и DateFormatter, чтобы управлять частотой делений и форматом подписей. Поворот подписей делений на 45 градусов предотвращает их наложение на оси из 12 месяцев.

import matplotlib.dates as mdates

ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

Добавление затенённой области для 4-го квартала

Выделите период 4-го квартала (октябрь — декабрь) затенённым фоном с помощью ax.axvspan(). Это сразу делает сезонные закономерности заметными: если пик стабильно приходится на затенённую область, 4-й квартал является важным периодом продаж, на который стоит направить рекламные акции. Параметр alpha управляет прозрачностью затенения.

import datetime

q4_start = datetime.datetime(2023, 10, 1)
q4_end = datetime.datetime(2023, 12, 31)

ax.axvspan(q4_start, q4_end, alpha=0.15, color='gold', label='Q4')
ax.legend()
plt.show()

Построение выручки по категориям во времени

Создайте многолинейную диаграмму, где каждая линия представляет категорию товара. Преобразуйте DataFrame с данными по месяцам и категориям так, чтобы столбцы соответствовали категориям, а индекс — времени, затем переберите столбцы и вызовите ax.plot() для каждого из них. При повторных вызовах для одних и тех же Axes Matplotlib автоматически назначает каждой линии отдельный цвет.

monthly_cat = df.groupby(['year_month', 'category'])['revenue'].sum().unstack('category')
monthly_cat.index = monthly_cat.index.to_timestamp()

fig, ax = plt.subplots(figsize=(12, 6))
for col in monthly_cat.columns:
    ax.plot(monthly_cat.index, monthly_cat[col], label=col, linewidth=1.5)

ax.legend(loc='upper left', fontsize=8)
ax.set_title('Monthly Revenue by Category')
plt.tight_layout()
plt.show()

Составная столбчатая диаграмма месячной выручки

Составная столбчатая диаграмма показывает общую месячную выручку и одновременно раскрывает вклад каждой категории в общий столбец. Напрямую примените monthly_cat.plot(kind='bar', stacked=True, ax=ax) к DataFrame после сводного преобразования. Составные столбцы лучше всего использовать, если категорий меньше шести: в противном случае цвета становится трудно различать.

fig, ax = plt.subplots(figsize=(12, 5))

monthly_cat.plot(kind='bar', stacked=True, ax=ax, colormap='tab10')

ax.set_title('Monthly Revenue by Category (Stacked)')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue')
ax.legend(loc='upper left', fontsize=8)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Темп роста от месяца к месяцу

Постройте процентный темп роста от месяца к месяцу рядом с выручкой, чтобы добавить контекст: визуально небольшой столбец января может означать рост на 20 % по сравнению с предыдущим месяцем. Вычислите рост с помощью monthly.pct_change() * 100 и изобразите его на дополнительной оси Y с помощью ax.twinx(), чтобы использовать ту же ось X, не смешивая единицы измерения.

growth = monthly.pct_change() * 100

fig, ax1 = plt.subplots(figsize=(12, 5))
ax2 = ax1.twinx()

ax1.bar(monthly.index, monthly.values, width=20, color='steelblue', alpha=0.6, label='Revenue')
ax2.plot(growth.index, growth.values, color='red', marker='o', label='MoM Growth %')

ax1.set_ylabel('Revenue')
ax2.set_ylabel('MoM Growth %')
plt.title('Revenue and Month-over-Month Growth')
plt.tight_layout()
plt.show()

Сохранение рисунка для отчётов

Используйте fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight'), чтобы получить PNG высокого разрешения, подходящий для презентаций или веб-панелей. Аргумент bbox_inches='tight' обрезает лишнее пустое пространство, а dpi=150 обеспечивает чёткое изображение без чрезмерно большого файла. Дополнительно сохраните рисунок в PDF для отчётов, предназначенных для печати.

fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight')
fig.savefig('monthly_trend.pdf', bbox_inches='tight')
print('Figure saved as PNG and PDF')

Быстрая проверка

Проверьте своё понимание концепций анализа данных из этого урока.

Итоги урока

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

Часто задаваемые вопросы

Урок «Визуализация месячной динамики» бесплатный?

Да — полный текст урока «Визуализация месячной динамики» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Визуализация месячной динамики»?

Стройте линейный график месячной выручки, накладывайте трёхмесячное скользящее среднее и отмечайте месяцы пиковых и минимальных значений. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

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

Сколько времени занимает урок «Визуализация месячной динамики»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Загрузка и проверка набора данных о продажах
  2. Расчёт выручки и построение признаков
  3. Анализ GroupBy по регионам и категориям
  4. Визуализация месячной динамики
← Назад к Pandas & NumPy Academy