Visualización final y exportación del informe
Cree una figura de Matplotlib con varios paneles y gráficos anotados, expórtela a PNG y PDF, y escriba un resumen estructurado en un archivo Markdown.
Visualización final y exportación del informe es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
El entregable final
La última etapa del proyecto integrador convierte los KPI calculados en un entregable pulido y fácil de compartir: una figura de Matplotlib con varios paneles, con gráficos anotados, y un informe markdown estructurado, con referencias a las visualizaciones insertadas. Esto es lo que reciben realmente las partes interesadas: visualizaciones claras y un resumen narrativo. Una buena visualización transforma los números en conclusiones; una buena estructura del informe hace que esas conclusiones sean aplicables. En esta lección se abordan la arquitectura de figuras, las anotaciones, la exportación a PNG/PDF y la generación de markdown estructurado.
Configuración de la figura con varios paneles
Use plt.subplots() con figsize y gridspec_kw para crear una figura con paneles de distintos tamaños. Un diseño habitual para un informe ejecutivo incluye un gráfico de tendencias amplio en la parte superior y un mapa de calor de retención junto con un gráfico de barras por región en la fila inferior. Establezca de antemano un estilo coherente con plt.style.use('seaborn-v0_8-whitegrid') para obtener gráficos limpios y de aspecto profesional sin tener que dar formato manualmente a 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.')Panel 1: línea de tendencia de los ingresos mensuales
Represente los ingresos mensuales totales como una línea con marcadores, superponga una media móvil de 3 meses y sombree el área bajo la línea real. Anote los meses de máximo y mínimo con flechas y texto mediante ax.annotate(). Esto comunica la historia de inmediato: cuándo fueron más altos los ingresos, cuándo descendieron y si la tendencia a largo plazo es positiva. Use colores que distingan los valores reales de los suavizados sin que desentonen entre sí.
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()Panel 2: mapa de calor de retención de cohortes
Visualice la matriz de retención de cohortes como un mapa de calor codificado por colores con Seaborn. Normalice los valores para que el 100 % (periodo 0) corresponda al color más brillante y la disminución de la retención se represente con colores progresivamente más oscuros. Oculte las celdas NaN (periodos futuros que aún no han ocurrido) para mantener el gráfico limpio. Anote cada celda con el valor porcentual para facilitar su lectura. Este gráfico es una de las herramientas más valiosas para comprender los patrones de fidelidad de los 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()Panel 3: gráfico de barras horizontales de las principales regiones
Un gráfico de barras horizontales es ideal para comparar los nombres de las regiones (etiquetas de texto en el eje y) según sus ingresos. Ordene las barras de forma descendente para que la mejor región aparezca arriba. Añada etiquetas con los valores de ingresos al final de cada barra mediante ax.text(). Use una paleta de colores divergente basada en la proporción de los ingresos; la región principal debe tener el color más intenso. Este gráfico comunica de inmediato la concentración geográfica y el rendimiento 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()Guardado de la figura con varios paneles
Exporte la figura terminada en dos formatos: PNG para insertarla en presentaciones e informes web, y PDF para impresión en alta resolución. Use dpi=150 o un valor superior para PNG a fin de garantizar que la figura se vea nítida en pantalla. Pase bbox_inches='tight' para evitar que las etiquetas queden recortadas en el borde de la figura. Guarde el archivo en el directorio de salida establecido durante la fase de configuración del proyecto.
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')Redacción del informe markdown estructurado
Genere el informe de texto escribiendo mediante código un archivo markdown estructurado. Incluya un encabezado, un resumen ejecutivo con los KPI principales, los hallazgos clave de cada sección del análisis y referencias a los archivos de figuras guardados. Al generar el informe mediante código en lugar de redactarlo manualmente, cada ejecución produce un informe nuevo y preciso que refleja los valores calculados reales. Use f-strings de Python para insertar directamente los números calculados en el 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

'''
with open('output/report.md', 'w') as f:
f.write(report)
print('Report written to output/report.md')Adición de anotaciones a los gráficos
Los gráficos eficaces cuentan una historia mediante anotaciones. Use ax.axvline() para marcar eventos importantes (el lanzamiento de un producto o un cambio de precios), ax.axhspan() para sombrear periodos de recesión y ax.annotate() para destacar puntos de datos relevantes con texto y flechas. Etiquete los ejes con sus unidades (ax.set_ylabel('Revenue ($)')), añada un título descriptivo, incluya una leyenda cuando se muestren varias series y dé formato a las etiquetas de las marcas para facilitar la lectura mediante 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()Exportación de tablas de datos a Excel
Algunas partes interesadas prefieren Excel a los informes markdown. Use pd.ExcelWriter para exportar varios DataFrames a distintas hojas dentro de un único libro de Excel. Este es un entregable profesional para las partes interesadas del negocio que desean explorar los datos por su cuenta. Use startrow y startcol para organizar las tablas dentro de una hoja y añada una hoja «Summary» con los valores principales como primera pestaña.
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')Automatización de la generación de informes
Integre toda la canalización —ingesta, limpieza, cálculo de KPI, visualización y exportación del informe— en una función main() que pueda ejecutarse desde la línea de comandos. Use el módulo logging de Python para registrar las horas de inicio y finalización, el número de filas en cada etapa y cualquier anomalía detectada. Una canalización que se ejecuta de principio a fin con un único comando python pipeline.py está lista para la automatización programada mediante cron, Airflow o un programador en la nube.
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()Finalización del curso y próximos pasos
Ha completado el itinerario Data Analysis: Pandas & NumPy. Ahora puede: crear y transformar matrices de NumPy mediante broadcasting y álgebra lineal; crear y manipular DataFrames de Pandas a partir de cualquier fuente de datos; limpiar, reestructurar y agregar conjuntos de datos del mundo real; crear visualizaciones con calidad de publicación mediante Matplotlib y Seaborn; aplicar pruebas estadísticas con SciPy; trabajar con conjuntos de datos grandes mediante fragmentación y Dask; integrar Pandas con bases de datos SQL; y diseñar canalizaciones de datos reproducibles de principio a fin. Estas habilidades son la base de cualquier función profesional orientada a los datos.
Comprobación rápida
Ponga a prueba su comprensión de los conceptos de análisis de datos de esta lección.
Resumen de la lección
En esta lección final ha aprendido que las figuras de Matplotlib con varios paneles y GridSpec permiten crear diseños profesionales de informes que combinan varios tipos de gráficos; las anotaciones (axvline, annotate, text) aportan contexto narrativo a los gráficos; y la generación automatizada de informes (markdown, Excel, PNG y PDF) dentro de una función main() hace que la canalización pueda programarse y reproducirse. ¡Enhorabuena por completar el itinerario de Pandas y NumPy! Ya está preparado para afrontar desafíos reales de análisis de datos.
Aprende Python con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Visualización final y exportación del informe» es gratis?
Sí — el texto completo de «Visualización final y exportación del informe» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Visualización final y exportación del informe»?
Cree una figura de Matplotlib con varios paneles y gráficos anotados, expórtela a PNG y PDF, y escriba un resumen estructurado en un archivo Markdown. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Visualización final y exportación del informe»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Configuración del proyecto e ingestión de datos
- Limpieza de datos e ingeniería de características
- Análisis y cálculo de KPI
- Visualización final y exportación del informe