Końcowa wizualizacja i eksport raportu
Utwórz wielopanelowy wykres Matplotlib z opisanymi wykresami, wyeksportuj go do PNG i PDF oraz zapisz uporządkowane podsumowanie w pliku Markdown.
Końcowa wizualizacja i eksport raportu to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Końcowy rezultat
Ostatni etap projektu capstone przekształca obliczone KPI w dopracowany, łatwy do udostępniania rezultat: wielopanelową figurę Matplotlib z opisanymi wykresami oraz ustrukturyzowany raport markdown z odwołaniami do osadzonych wizualizacji. To właśnie otrzymują interesariusze — czytelne wizualizacje i podsumowanie narracyjne. Dobra wizualizacja przekształca liczby w spostrzeżenia, a dobra struktura raportu pomaga przełożyć te spostrzeżenia na działania. W tej lekcji omówiono architekturę figury, dodawanie adnotacji, eksport do PNG/PDF oraz generowanie ustrukturyzowanego kodu markdown.
Konfigurowanie wielopanelowej figury
Użyj plt.subplots() wraz z parametrami figsize i gridspec_kw, aby utworzyć figurę z panelami o różnych rozmiarach. Typowy układ raportu dla kadry kierowniczej obejmuje szeroki wykres trendu u góry oraz mapę cieplną retencji i wykres słupkowy regionów w dolnym wierszu. Ustaw spójny styl na początku za pomocą plt.style.use('seaborn-v0_8-whitegrid'), aby uzyskać przejrzyste, profesjonalnie wyglądające wykresy bez ręcznego formatowania każdego elementu.
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: Liniowy wykres miesięcznego trendu przychodów
Przedstaw łączny miesięczny przychód jako linię ze znacznikami, nałóż 3-miesięczną średnią kroczącą i zacieniuj obszar pod rzeczywistą linią. Dodaj adnotacje wskazujące miesiące szczytowe i najsłabsze, używając strzałek i tekstu za pomocą ax.annotate(). Dzięki temu historia jest od razu czytelna: widać, kiedy przychód był najwyższy, kiedy spadł oraz czy długoterminowy trend jest dodatni. Użyj kolorów, które odróżniają dane rzeczywiste od wygładzonych, a jednocześnie nie kolidują ze sobą.
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 cieplna retencji kohort
Zwizualizuj macierz retencji kohort jako mapę cieplną kodowaną kolorami za pomocą Seaborn. Znormalizuj wartości tak, aby 100% (okres 0) miało najjaśniejszy kolor, a malejąca retencja była oznaczana coraz ciemniejszymi kolorami. Zamaskuj komórki NaN (przyszłe okresy, które jeszcze nie nastąpiły), aby zachować przejrzystość wykresu. Dodaj w każdej komórce adnotację z wartością procentową, co ułatwi szybki odczyt. Ten wykres jest jednym z najcenniejszych narzędzi do badania wzorców lojalności klientów.
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: Poziomy wykres słupkowy najlepszych regionów
Poziomy wykres słupkowy doskonale nadaje się do porównywania nazw regionów (etykiety tekstowe na osi y) według przychodów. Posortuj słupki malejąco, aby najlepszy region znalazł się na górze. Dodaj wartości przychodów na końcach słupków za pomocą ax.text(). Użyj rozbieżnej palety kolorów opartej na udziale w przychodach — najlepszy region powinien otrzymać najciemniejszy kolor. Ten wykres natychmiast pokazuje koncentrację geograficzną i wyniki poszczególnych regionów.
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()Zapisywanie wielopanelowej figury
Wyeksportuj ukończoną figurę w dwóch formatach: PNG do osadzania w prezentacjach i raportach internetowych oraz PDF do druku w wysokiej rozdzielczości. Użyj wartości dpi=150 lub wyższej dla PNG, aby figura była ostra na ekranie. Przekaż bbox_inches='tight', aby uniknąć obcinania etykiet przy krawędzi figury. Zapisz plik w katalogu wyjściowym ustalonym na etapie konfiguracji projektu.
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')Pisanie ustrukturyzowanego raportu Markdown
Wygeneruj raport tekstowy, programowo zapisując ustrukturyzowany plik markdown. Uwzględnij nagłówek, podsumowanie dla kadry kierowniczej z najważniejszymi KPI, kluczowe wnioski z każdej sekcji analizy oraz odwołania do zapisanych plików z figurami. Generowanie raportu z kodu zamiast ręcznego pisania sprawia, że każde uruchomienie tworzy aktualny i dokładny raport odzwierciedlający faktycznie obliczone wartości. Użyj f-stringów Pythona, aby bezpośrednio osadzać obliczone liczby w tekście.
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')Dodawanie adnotacji do wykresów
Skuteczne wykresy opowiadają historię za pomocą adnotacji. Użyj ax.axvline(), aby zaznaczyć ważne wydarzenia (wprowadzenie produktu, zmianę cen), ax.axhspan(), aby zacieniować okresy recesji, oraz ax.annotate(), aby wyróżnić tekstem i strzałkami istotne punkty danych. Opisz osie za pomocą jednostek (ax.set_ylabel('Revenue ($)')), dodaj opisowy tytuł, dołącz legendę, gdy prezentowanych jest wiele serii, oraz sformatuj etykiety podziałki tak, aby były czytelne, używając 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()Eksportowanie tabel danych do programu Excel
Niektórzy interesariusze wolą program Excel od raportów markdown. Użyj pd.ExcelWriter, aby wyeksportować wiele obiektów DataFrame do różnych arkuszy w jednym skoroszycie programu Excel. To profesjonalny rezultat dla interesariuszy biznesowych, którzy chcą samodzielnie analizować dane. Użyj startrow i startcol, aby rozmieścić tabele w arkuszu, oraz dodaj arkusz „Summary” z najważniejszymi liczbami jako pierwszą kartę.
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')Automatyzowanie generowania raportów
Umieść cały potok — wczytywanie, czyszczenie, obliczanie KPI, wizualizację i eksport raportu — w funkcji main(), którą można uruchamiać z wiersza poleceń. Użyj modułu logging języka Python do rejestrowania czasu rozpoczęcia i zakończenia, liczby wierszy na każdym etapie oraz wykrytych anomalii. Potok uruchamiany od początku do końca za pomocą pojedynczego polecenia python pipeline.py jest gotowy do automatyzacji według harmonogramu za pomocą cron, Airflow lub harmonogramu w chmurze.
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()Ukończenie kursu i dalsze kroki
Ukończyłeś ścieżkę Data Analysis: Pandas & NumPy. Potrafisz teraz: tworzyć i przekształcać tablice NumPy z użyciem broadcastingu i algebry liniowej, budować obiekty DataFrame biblioteki Pandas z dowolnego źródła danych i nimi zarządzać, czyścić dane z rzeczywistych zbiorów, zmieniać ich kształt i agregować je, tworzyć wizualizacje o jakości publikacyjnej za pomocą Matplotlib i Seaborn, stosować testy statystyczne z użyciem SciPy, skalować pracę do dużych zbiorów danych za pomocą fragmentowania i Dask, integrować Pandas z bazami danych SQL oraz projektować odtwarzalne potoki danych od początku do końca. Umiejętności te stanowią podstawę każdej opartej na danych roli w branży.
Szybki sprawdzian
Sprawdź swoją wiedzę na temat koncepcji analizy danych z tej lekcji.
Podsumowanie lekcji
W tej końcowej lekcji nauczyłeś się, że: wielopanelowe figury Matplotlib z GridSpec umożliwiają tworzenie profesjonalnych układów raportów łączących wiele typów wykresów, adnotacje (axvline, annotate, text) dodają wykresom kontekst narracyjny, a automatyczne generowanie raportów (markdown, Excel, PNG, PDF) w funkcji main() sprawia, że potok można uruchamiać według harmonogramu i odtwarzać. Gratulacje z okazji ukończenia ścieżki Pandas i NumPy — możesz teraz podejmować się rzeczywistych wyzwań związanych z analizą danych!
Często zadawane pytania
Czy lekcja „Końcowa wizualizacja i eksport raportu” jest bezpłatna?
Tak — pełny tekst „Końcowa wizualizacja i eksport raportu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Końcowa wizualizacja i eksport raportu”?
Utwórz wielopanelowy wykres Matplotlib z opisanymi wykresami, wyeksportuj go do PNG i PDF oraz zapisz uporządkowane podsumowanie w pliku Markdown. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Końcowa wizualizacja i eksport raportu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Konfiguracja projektu i wczytywanie danych
- Czyszczenie danych i inżynieria cech
- Analiza i obliczanie KPI
- Końcowa wizualizacja i eksport raportu