Pandas & NumPy Academy · Aula

Visualização final e exportação do relatório

Crie uma figura do Matplotlib com vários painéis e gráficos anotados, exporte-a para PNG e PDF e escreva um resumo estruturado em um arquivo markdown.

Aula 4 de 413 etapas

Visualização final e exportação do relatório é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.

O produto final

A última etapa do projeto transforma os KPIs calculados em um produto final refinado e fácil de compartilhar: uma figura do Matplotlib com vários painéis, com gráficos anotados, e um relatório estruturado em markdown, com referências às visualizações incorporadas. É isso que as partes interessadas realmente recebem — elementos visuais claros e um resumo narrativo. Uma boa visualização transforma números em insights; uma boa estrutura de relatório torna esses insights acionáveis. Esta lição aborda a arquitetura de figuras, as anotações, a exportação para PNG/PDF e a geração estruturada de markdown.

Configurando a figura com vários painéis

Use plt.subplots() com figsize e gridspec_kw para criar uma figura com painéis de tamanhos diferentes. Um layout comum para relatórios executivos é: um gráfico amplo de tendências na parte superior, e um mapa de calor de retenção e um gráfico de barras por região na linha inferior. Defina antecipadamente um estilo consistente com plt.style.use('seaborn-v0_8-whitegrid') para obter gráficos limpos e com aparência profissional, sem precisar formatar manualmente cada elemento.

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.')

Painel 1: Linha da tendência mensal da receita

Trace a receita mensal total como uma linha com marcadores, sobreponha uma média móvel de 3 meses e sombreie a área sob a linha real. Anote os meses de pico e de menor valor com setas e texto usando ax.annotate(). Isso conta a história imediatamente: quando a receita esteve mais forte, quando caiu e se a tendência de longo prazo é positiva. Use cores que diferenciem os valores reais dos suavizados sem criar conflito visual.

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()

Painel 2: Mapa de calor da retenção de coortes

Visualize a matriz de retenção de coortes como um mapa de calor codificado por cores usando o Seaborn. Normalize os valores para que 100% (período 0) seja representado pela cor mais intensa e a retenção decrescente fique progressivamente mais escura. Masque as células NaN (períodos futuros que ainda não ocorreram) para manter o gráfico limpo. Anote cada célula com o valor percentual para facilitar a leitura. Este gráfico é uma das ferramentas mais valiosas para compreender os padrões de fidelidade dos clientes.

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()

Painel 3: Gráfico de barras horizontais das principais regiões

Um gráfico de barras horizontais é ideal para comparar os nomes das regiões (rótulos de texto no eixo y) pela receita. Ordene as barras em ordem decrescente para que a melhor região fique no topo. Adicione os valores da receita ao final de cada barra usando ax.text(). Use uma paleta de cores divergente baseada na participação da receita — a região líder deve receber a cor mais intensa. Este gráfico comunica imediatamente a concentração geográfica e o desempenho regional.

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()

Salvando a figura com vários painéis

Exporte a figura concluída em dois formatos: PNG para incorporação em apresentações e relatórios na web, e PDF para impressão em alta resolução. Use dpi=150 ou um valor maior para PNG, garantindo que a figura fique nítida na resolução da tela. Passe bbox_inches='tight' para evitar o corte dos rótulos nas bordas da figura. Salve no diretório de saída definido na etapa de configuração do projeto.

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')

Escrevendo o relatório estruturado em Markdown

Gere o relatório textual escrevendo programaticamente um arquivo markdown estruturado. Inclua um cabeçalho, um resumo executivo com os principais KPIs, as principais conclusões de cada seção da análise e referências aos arquivos de figuras salvos. Ao gerar o relatório a partir do código, em vez de escrevê-lo manualmente, cada execução produz um relatório novo e preciso, que reflete os valores realmente calculados. Use f-strings do Python para incorporar os números calculados diretamente ao texto.

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')

Adicionando anotações aos gráficos

Gráficos eficazes contam uma história por meio de anotações. Use ax.axvline() para marcar eventos importantes (o lançamento de um produto, uma mudança de preço), ax.axhspan() para sombrear períodos de recessão e ax.annotate() para destacar pontos de dados relevantes com texto e setas. Identifique os eixos com unidades (ax.set_ylabel('Revenue ($)')), adicione um título descritivo, inclua uma legenda quando várias séries forem exibidas e formate os rótulos das marcações para facilitar a leitura usando 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()

Exportando tabelas de dados para o Excel

Algumas partes interessadas preferem o Excel aos relatórios em markdown. Use pd.ExcelWriter para exportar vários DataFrames para planilhas diferentes em uma única pasta de trabalho do Excel. Esse é um produto final profissional para partes interessadas do negócio que desejam explorar os dados por conta própria. Use startrow e startcol para organizar as tabelas em uma planilha e adicione uma planilha 'Summary' com os números de nível superior como a primeira aba.

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')

Automatizando a geração de relatórios

Encapsule todo o pipeline — ingestão, limpeza, cálculo de KPIs, visualização e exportação do relatório — em uma função main() que possa ser executada pela linha de comando. Use o módulo logging do Python para registrar os horários de início e término, a quantidade de linhas em cada etapa e quaisquer anomalias detectadas. Um pipeline que é executado de ponta a ponta com um único comando python pipeline.py está pronto para a automação programada via cron, Airflow ou um agendador na nuvem.

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()

Conclusão do curso e próximos passos

Você concluiu a trilha de Análise de dados: Pandas e NumPy. Agora você pode: criar e transformar matrizes NumPy com transmissão e álgebra linear, criar e manipular DataFrames do Pandas a partir de qualquer fonte de dados, limpar, remodelar e agregar conjuntos de dados do mundo real, criar visualizações com qualidade de publicação usando Matplotlib e Seaborn, aplicar testes estatísticos com SciPy, trabalhar com grandes conjuntos de dados usando particionamento e Dask, integrar o Pandas a bancos de dados SQL e projetar pipelines de dados reproduzíveis de ponta a ponta. Essas habilidades são a base de qualquer função orientada por dados no setor.

Verificação rápida

Teste sua compreensão dos conceitos de análise de dados desta lição.

Resumo da lição

Nesta lição final, você aprendeu que: figuras do Matplotlib com vários painéis usando GridSpec permitem layouts profissionais de relatórios que combinam vários tipos de gráficos; anotações (axvline, annotate, text) adicionam contexto narrativo aos gráficos; e a geração automatizada de relatórios (markdown, Excel, PNG, PDF) em uma função main() torna o pipeline programável e reproduzível. Parabéns por concluir a trilha de Pandas e NumPy — você está pronto para enfrentar desafios reais de análise de dados!

Grátis para começar

Aprenda Python com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

Perguntas Frequentes

A aula “Visualização final e exportação do relatório” é grátis?

Sim — o texto completo de “Visualização final e exportação do relatório” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.

O que vou aprender em “Visualização final e exportação do relatório”?

Crie uma figura do Matplotlib com vários painéis e gráficos anotados, exporte-a para PNG e PDF e escreva um resumo estruturado em um arquivo markdown. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Pandas & NumPy Academy?

Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Visualização final e exportação do relatório”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Pandas & NumPy Academy?

Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Configuração do projeto e ingestão de dados
  2. Limpeza de dados e engenharia de atributos
  3. Análise e cálculo de KPI
  4. Visualização final e exportação do relatório
← Voltar para Pandas & NumPy Academy