Endelig visualisering og rapporteksport
Byg en Matplotlib-figur med flere paneler og annoterede diagrammer, eksportér den til PNG og PDF, og skriv et struktureret resumé til en markdown-fil.
Endelig visualisering og rapporteksport er en gratis Pandas & NumPy Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Pandas & NumPy Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Det endelige resultat
Sidste fase af afslutningsprojektet omdanner de beregnede KPI'er til et gennemarbejdet resultat, der kan deles: en Matplotlib-figur med flere paneler og kommenterede diagrammer samt en struktureret markdown-rapport med indlejrede referencer til visualiseringer. Det er det, interessenterne faktisk modtager — tydelige visualiseringer og en sammenfattende fortælling. God visualisering omdanner tal til indsigter; en god rapportstruktur gør disse indsigter handlingsanvisende. Denne lektion gennemgår figurarkitektur, annotering, eksport til PNG/PDF og generering af struktureret markdown.
Opsætning af figuren med flere paneler
Brug plt.subplots() sammen med figsize og gridspec_kw til at oprette en figur med paneler i forskellige størrelser. Et almindeligt layout til en ledelsesrapport er et bredt trenddiagram øverst samt et varmekort over fastholdelse og et søjlediagram over regioner på den nederste række. Angiv en ensartet typografi på forhånd med plt.style.use('seaborn-v0_8-whitegrid') for at få rene, professionelle diagrammer uden manuel formatering af hvert element.
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: Linjediagram over månedlig omsætning
Vis den samlede månedlige omsætning som en linje med markører, læg et glidende gennemsnit over 3 måneder ovenpå, og udfyld området under den faktiske linje. Annotér månederne med højeste og laveste værdi med pile og tekst ved hjælp af ax.annotate(). Det fortæller historien med det samme: hvornår omsætningen var stærkest, hvornår den faldt, og om den langsigtede tendens er positiv. Brug farver, der adskiller de faktiske værdier fra de udjævnede uden at kollidere.
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: Varmekort over kohortefastholdelse
Visualisér matrixen over kohortefastholdelse som et farvekodet varmekort ved hjælp af Seaborn. Normalisér værdierne, så 100 % (periode 0) får den klareste farve, mens faldende fastholdelse gradvist bliver mørkere. Maskér NaN-celler (fremtidige perioder, der endnu ikke er indtruffet) for at holde diagrammet overskueligt. Annotér hver celle med procentværdien, så den er nem at aflæse. Dette diagram er et af de mest værdifulde værktøjer til at forstå mønstre i kundeloyalitet.
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: Vandret søjlediagram over de bedste regioner
Et vandret søjlediagram er ideelt til at sammenligne regionsnavne (tekstetiketter på y-aksen) efter omsætning. Sortér søjlerne i faldende rækkefølge, så den bedste region står øverst. Tilføj etiketter med omsætningsværdier i slutningen af hver søjle ved hjælp af ax.text(). Brug en divergerende farvepalet baseret på omsætningsandelen — den bedste region får den dybeste farve. Diagrammet kommunikerer straks geografisk koncentration og regional præstation.
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()Lagring af figuren med flere paneler
Eksportér den færdige figur i to formater: PNG til indlejring i præsentationer og webbaserede rapporter samt PDF til udskrivning i høj opløsning. Brug dpi=150 eller højere til PNG for at sikre, at figuren står skarpt på skærmen. Angiv bbox_inches='tight' for at undgå, at etiketter klippes ved figurens kant. Gem i outputmappen, der blev oprettet under projektets opsætningsfase.
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')Skrivning af den strukturerede markdown-rapport
Generér tekstrapporten ved programmatisk at skrive en struktureret markdown-fil. Medtag en overskrift, et resumé til ledelsen med de vigtigste KPI'er, centrale resultater fra hver analyseafdeling og referencer til de gemte figur-filer. Når rapporten genereres fra kode i stedet for at blive skrevet manuelt, giver hver kørsel en ny og nøjagtig rapport, der afspejler de faktisk beregnede værdier. Brug Pythons f-strenge til at indsætte beregnede tal direkte i teksten.
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')Tilføjelse af annoteringer til diagrammer
Effektive diagrammer fortæller en historie gennem annoteringer. Brug ax.axvline() til at markere vigtige hændelser (en produktlancering, en prisændring), ax.axhspan() til at skygge perioder med recession og ax.annotate() til at fremhæve bemærkelsesværdige datapunkter med tekst og pile. Mærk akserne med enheder (ax.set_ylabel('Revenue ($)')), tilføj en beskrivende titel, medtag en signaturforklaring, når der vises flere serier, og formatér akseetiketterne, så de er nemme at læse, ved hjælp af 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()Eksport af datatabeller til Excel
Nogle interessenter foretrækker Excel frem for markdown-rapporter. Brug pd.ExcelWriter til at eksportere flere DataFrames til forskellige ark i én Excel-projektmappe. Det er et professionelt resultat til forretningsinteressenter, der selv vil udforske dataene. Brug startrow og startcol til at placere tabeller i et ark, og tilføj et ark med navnet 'Summary' med hovedtal som den første fane.
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')Automatisering af rapportgenerering
Pak hele datapipelinen — indlæsning, oprydning, beregning af KPI'er, visualisering og eksport af rapporten — ind i en main()-funktion, der kan køres fra kommandolinjen. Brug Pythons modul logging til at registrere start- og sluttidspunkter, antal rækker på hvert trin og eventuelle registrerede anomalier. En datapipeline, der kører fra ende til anden med én enkelt kommando, python pipeline.py, er klar til planlagt automatisering via cron, Airflow eller en skeduleringstjeneste i skyen.
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()Gennemførelse af kurset og næste skridt
Du har gennemført sporet Data Analysis: Pandas & NumPy. Du kan nu: oprette og transformere NumPy-arrays med broadcasting og lineær algebra, opbygge og manipulere Pandas DataFrames fra enhver datakilde, rense, omforme og aggregere datasæt fra den virkelige verden, oprette visualiseringer i publikationskvalitet med Matplotlib og Seaborn, anvende statistiske test med SciPy, skalere til store datasæt med chunking og Dask, integrere Pandas med SQL-databaser og designe reproducerbare datapipelines fra ende til anden. Disse færdigheder er grundlaget for alle datadrevne roller i industrien.
Hurtigt tjek
Test din forståelse af begreberne inden for dataanalyse fra denne lektion.
Opsummering af lektionen
I denne sidste lektion lærte du, at Matplotlib-figurer med flere paneler og GridSpec muliggør professionelle rapportlayouts, der kombinerer flere diagramtyper, at annoteringer (axvline, annotate, text) tilføjer fortællende kontekst til diagrammer, og at automatisk rapportgenerering (markdown, Excel, PNG, PDF) i en main()-funktion gør datapipelinen mulig at skedulere og reproducere. Tillykke med at have gennemført Pandas- og NumPy-sporet — du er klar til at løse dataanalyseudfordringer fra den virkelige verden!
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Endelig visualisering og rapporteksport” gratis?
Ja — hele teksten til “Endelig visualisering og rapporteksport” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Pandas & NumPy Academy-kurset, skal du opgradere til CoddyKit PRO. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Endelig visualisering og rapporteksport”?
Byg en Matplotlib-figur med flere paneler og annoterede diagrammer, eksportér den til PNG og PDF, og skriv et struktureret resumé til en markdown-fil. Du øver dig i Pandas & NumPy Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Pandas & NumPy Academy?
Der kræves ingen tidligere erfaring. Pandas & NumPy Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Endelig visualisering og rapporteksport”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Pandas & NumPy Academy-lektion?
Ja. Alle Pandas & NumPy Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Projektopsætning og dataindlæsning
- Datarensning og feature engineering
- Analyse og beregning af KPI'er
- Endelig visualisering og rapporteksport