0Pricing
Pandas & NumPy Academy · Урок

Финальная визуализация и экспорт отчёта

Создайте многопанельный рисунок Matplotlib с аннотированными графиками, экспортируйте его в PNG и PDF и запишите структурированное резюме в файл Markdown

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

Итоговый результат

На последнем этапе итогового проекта вычисленные KPI превращаются в оформленный результат, которым можно поделиться: многопанельная фигура Matplotlib с аннотированными диаграммами и структурированный отчёт в формате markdown со встроенными ссылками на визуализации. Именно это получают заинтересованные стороны — понятные визуальные материалы и связное резюме. Хорошая визуализация превращает числа в выводы, а хорошая структура отчёта делает эти выводы применимыми на практике. В этом уроке рассматриваются архитектура фигуры, аннотации, экспорт в PNG/PDF и создание структурированного документа markdown.

Настройка многопанельной фигуры

Используйте plt.subplots() с параметрами figsize и gridspec_kw, чтобы создать фигуру с панелями разного размера. Распространённая компоновка отчёта для руководства: широкая диаграмма динамики сверху, а в нижнем ряду — тепловая карта удержания и столбчатая диаграмма по регионам. Заранее задайте единый стиль с помощью plt.style.use('seaborn-v0_8-whitegrid'), чтобы получить чистые профессиональные диаграммы без ручного форматирования каждого элемента.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.style.use('seaborn-v0_8-whitegrid')

# 2x2 layout with custom row heights
fig = plt.figure(figsize=(16, 12))
gs = gridspec.GridSpec(2, 2,
                       height_ratios=[1, 1.2],
                       hspace=0.4, wspace=0.35)

ax_trend   = fig.add_subplot(gs[0, :])   # full width top row
ax_heatmap = fig.add_subplot(gs[1, 0])   # bottom left
ax_bar     = fig.add_subplot(gs[1, 1])   # bottom right

print('Figure with 3 panels created.')

Панель 1: линейная диаграмма ежемесячной выручки

Изобразите общую ежемесячную выручку в виде линии с маркерами, наложите скользящее среднее за 3 месяца и закрасьте область под фактической линией. Аннотируйте месяцы пиковых и минимальных значений стрелками и текстом с помощью ax.annotate(). Так история становится понятной с первого взгляда: когда выручка была максимальной, когда снижалась и является ли долгосрочная тенденция положительной. Используйте цвета, которые различают фактические и сглаженные значения и при этом не конфликтуют друг с другом.

import pandas as pd
import matplotlib.pyplot as plt

monthly = pd.read_parquet('output/kpi_monthly_category_revenue.parquet')
monthly_total = monthly.sum(axis=1)

ax = plt.gca()
ax.plot(monthly_total.index, monthly_total.values,
        marker='o', linewidth=2, color='#2196F3', label='Monthly Revenue')
ax.plot(monthly_total.index,
        monthly_total.rolling(3, min_periods=1).mean().values,
        linewidth=2, linestyle='--', color='#FF5722', label='3-Month Avg')
ax.fill_between(monthly_total.index, monthly_total.values, alpha=0.1, color='#2196F3')

# Annotate peak
peak_idx = monthly_total.idxmax()
ax.annotate(f'Peak: ${monthly_total[peak_idx]/1e3:.0f}K',
            xy=(peak_idx, monthly_total[peak_idx]),
            xytext=(0, 20), textcoords='offset points',
            arrowprops=dict(arrowstyle='->', color='#E91E63'),
            color='#E91E63', fontsize=10)
ax.set_title('Monthly Revenue Trend', fontsize=14, fontweight='bold')
ax.legend()
plt.show()

Панель 2: тепловая карта удержания по когортам

Визуализируйте матрицу удержания когорт в виде тепловой карты с цветовой кодировкой с помощью Seaborn. Нормализуйте значения так, чтобы 100 % (период 0) отображались самым ярким цветом, а снижающееся удержание — постепенно более тёмными оттенками. Замаскируйте ячейки NaN (будущие периоды, которые ещё не наступили), чтобы сохранить чистоту графика. Добавьте в каждую ячейку процентное значение для быстрого ознакомления. Этот график — один из самых ценных инструментов для понимания закономерностей лояльности клиентов.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

retention = pd.read_parquet('output/kpi_cohort_retention.parquet')

fig, ax = plt.subplots(figsize=(10, 6))

sns.heatmap(
    retention,
    annot=True,
    fmt='.0%',
    cmap='YlOrRd_r',
    mask=retention.isna(),
    linewidths=0.5,
    ax=ax,
    cbar_kws={'label': 'Retention Rate'}
)
ax.set_title('Cohort Retention Matrix', fontsize=14, fontweight='bold')
ax.set_xlabel('Months After First Purchase')
ax.set_ylabel('Cohort Month')
plt.tight_layout()
plt.show()

Панель 3: горизонтальная столбчатая диаграмма ведущих регионов

Горизонтальная столбчатая диаграмма идеально подходит для сравнения регионов (текстовые подписи на оси y) по выручке. Отсортируйте столбцы по убыванию, чтобы лучший регион оказался сверху. Добавьте подписи со значениями выручки в конце каждого столбца с помощью ax.text(). Используйте расходящуюся цветовую палитру на основе доли выручки: ведущему региону назначьте самый насыщенный цвет. Этот график сразу показывает географическую концентрацию и результаты регионов.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
top5 = region_kpi.head(5).sort_values('total_revenue')

fig, ax = plt.subplots(figsize=(8, 5))
colors = cm.Blues(np.linspace(0.4, 0.9, len(top5)))

bars = ax.barh(top5['region'], top5['total_revenue'], color=colors)
for bar, val in zip(bars, top5['total_revenue']):
    ax.text(bar.get_width() * 1.01, bar.get_y() + bar.get_height()/2,
            f'${val/1e3:.0f}K', va='center', fontsize=9)

ax.set_title('Top 5 Regions by Revenue', fontsize=13, fontweight='bold')
ax.set_xlabel('Total Revenue ($)')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.show()

Сохранение многопанельного рисунка

Экспортируйте готовый рисунок в двух форматах: PNG — для вставки в презентации и веб-отчёты, а PDF — для высококачественной печати. Используйте dpi=150 или выше для PNG, чтобы рисунок оставался чётким при экранном разрешении. Передайте bbox_inches='tight', чтобы подписи не обрезались у края рисунка. Сохраните файл в выходной каталог, заданный на этапе настройки проекта.

import matplotlib.pyplot as plt

# After assembling all panels in the figure
fig.suptitle('2024 Sales Performance Report', fontsize=16,
             fontweight='bold', y=1.02)

# Save as PNG (for web/presentations)
fig.savefig('output/report_figure.png',
            dpi=150,
            bbox_inches='tight',
            facecolor='white')

# Save as PDF (for print)
fig.savefig('output/report_figure.pdf',
            bbox_inches='tight',
            facecolor='white')

print('Figures saved:')
print('  output/report_figure.png')
print('  output/report_figure.pdf')

Создание структурированного отчёта в Markdown

Сформируйте текстовый отчёт, программно записав структурированный файл Markdown. Включите заголовок, резюме для руководства с основными KPI, ключевые выводы каждого раздела анализа и ссылки на сохранённые файлы рисунков. При создании отчёта из кода, а не вручную, каждый запуск формирует новый точный отчёт, отражающий фактически вычисленные значения. Используйте f-строки Python, чтобы напрямую вставлять вычисленные числа в текст.

import pandas as pd
from datetime import datetime

df = pd.read_parquet('output/analysis_ready.parquet')
region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
retention = pd.read_parquet('output/kpi_cohort_retention.parquet')

report = f'''
# 2024 Sales Performance Report

Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}

## Executive Summary

- **Total Revenue**: ${df['revenue'].sum():,.0f}
- **Total Orders**: {df['order_id'].nunique():,}
- **Unique Customers**: {df['customer_id'].nunique():,}
- **Top Region**: {region_kpi.iloc[0]['region']} (${region_kpi.iloc[0]['total_revenue']:,.0f})
- **Average Month-3 Retention**: {retention.get(3, pd.Series([0])).mean():.1%}

## Key Findings

1. Revenue grew steadily through the year with a peak in October.
2. The top region accounts for {region_kpi.iloc[0]['revenue_share']:.0%} of total revenue.
3. Month-3 cohort retention averages {retention.get(3, pd.Series([0])).mean():.1%}.

## Figures

![Revenue Trends](report_figure.png)
'''
with open('output/report.md', 'w') as f:
    f.write(report)
print('Report written to output/report.md')

Добавление аннотаций на графики

Эффективные графики рассказывают историю с помощью аннотаций. Используйте ax.axvline(), чтобы отметить важные события (запуск продукта, изменение цены), ax.axhspan() — чтобы выделить периоды рецессии, а ax.annotate() — чтобы обратить внимание на примечательные точки данных с помощью текста и стрелок. Подпишите оси с указанием единиц измерения (ax.set_ylabel('Revenue ($)')), добавьте информативный заголовок, включите легенду, если показано несколько рядов, и отформатируйте подписи делений для удобства чтения с помощью ax.yaxis.set_major_formatter(FuncFormatter(...)).

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import pandas as pd

monthly_total = pd.read_parquet('output/kpi_monthly_category_revenue.parquet').sum(axis=1)

fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(monthly_total.index, monthly_total.values, linewidth=2.5, color='#1565C0')

# Format y-axis as $K
ax.yaxis.set_major_formatter(
    mticker.FuncFormatter(lambda x, _: f'${x/1e3:.0f}K')
)

# Mark a hypothetical event
ax.axvline(x='2024-06', color='red', linestyle=':', alpha=0.6)
ax.text('2024-06', monthly_total.max() * 0.95,
        ' Campaign\n Launch', color='red', fontsize=9)

ax.set_title('Monthly Revenue 2024', fontsize=14, fontweight='bold')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Экспорт таблиц данных в Excel

Некоторые заинтересованные стороны предпочитают Excel отчётам в Markdown. Используйте pd.ExcelWriter, чтобы экспортировать несколько DataFrames на разные листы одной книги Excel. Это профессиональный результат работы для бизнес-пользователей, которые хотят самостоятельно исследовать данные. Используйте startrow и startcol, чтобы расположить таблицы на листе, и добавьте лист «Summary» с основными показателями в качестве первой вкладки.

import pandas as pd

region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
retention = pd.read_parquet('output/kpi_cohort_retention.parquet')
product_rank = pd.read_parquet('output/kpi_product_ranking.parquet')

with pd.ExcelWriter('output/sales_report_2024.xlsx', engine='openpyxl') as writer:
    region_kpi.to_excel(writer, sheet_name='Region KPIs', index=False)
    retention.to_excel(writer, sheet_name='Cohort Retention')
    product_rank.head(50).to_excel(writer, sheet_name='Top 50 Products', index=False)

print('Excel workbook written: output/sales_report_2024.xlsx')

Автоматизация создания отчётов

Оберните весь pipeline — загрузку, очистку, вычисление KPI, визуализацию и экспорт отчёта — в функцию main(), которую можно запускать из командной строки. Используйте модуль logging Python для записи времени начала и окончания, количества строк на каждом этапе и обнаруженных аномалий. pipeline, выполняемый от начала до конца одной командой python pipeline.py, готов к автоматизации по расписанию с помощью cron, Airflow или облачного планировщика.

import logging
import time
from datetime import datetime

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s'
)

def main():
    start = time.time()
    logging.info('Pipeline started')

    logging.info('Step 1: Data ingestion')
    # load_and_merge()  # returns df

    logging.info('Step 2: Data cleaning')
    # clean(df)  # returns df_clean

    logging.info('Step 3: KPI computation')
    # compute_kpis(df_clean)  # saves parquet files

    logging.info('Step 4: Visualisation and report export')
    # build_report()  # saves PNG, PDF, markdown, Excel

    elapsed = time.time() - start
    logging.info(f'Pipeline complete in {elapsed:.1f}s')

if __name__ == '__main__':
    main()

Завершение курса и следующие шаги

Вы завершили трек «Анализ данных: Pandas и NumPy». Теперь Вы умеете: создавать и преобразовывать массивы NumPy с помощью broadcasting и линейной алгебры, создавать и изменять Pandas DataFrames из любых источников данных, очищать, изменять форму и агрегировать реальные наборы данных, создавать визуализации профессионального качества с помощью Matplotlib и Seaborn, применять статистические тесты SciPy, работать с большими наборами данных с помощью разбиения на части и Dask, интегрировать Pandas с базами данных SQL и проектировать воспроизводимые сквозные конвейеры обработки данных. Эти навыки лежат в основе любой работы с данными в индустрии.

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

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

Повторение урока

В этом заключительном уроке Вы узнали, что многопанельные рисунки Matplotlib с GridSpec позволяют создавать профессиональные макеты отчётов, объединяющие разные типы графиков; аннотации (axvline, annotate, text) добавляют графикам контекст и пояснения; а автоматическое создание отчётов (Markdown, Excel, PNG, PDF) в функции main() делает pipeline пригодным для запуска по расписанию и воспроизводимым. Поздравляем с завершением трека Pandas и NumPy — теперь Вы готовы решать реальные задачи анализа данных!

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

Урок «Финальная визуализация и экспорт отчёта» бесплатный?

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

Чему я научусь в уроке «Финальная визуализация и экспорт отчёта»?

Создайте многопанельный рисунок Matplotlib с аннотированными графиками, экспортируйте его в PNG и PDF и запишите структурированное резюме в файл Markdown Ты практикуешь 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. Анализ и вычисление KPI
  4. Финальная визуализация и экспорт отчёта
← Назад к Pandas & NumPy Academy