Proč právě NumPy, Pandas a Matplotlib
Ekosystém jazyka Python pro práci s daty stojí na třech pilířích: NumPy (numerické výpočty a pole), Pandas (tabulková data a datové rámce) a Matplotlib (vizualizace). Společně pokrývají cestu od načtení a čištění dat přes agregace a vektorové výpočty až po přehledné grafy a reporting. V praxi jsou často doplněny o Jupyter, SciPy, Seaborn či Plotly, avšak zvládnutí trojice NumPy–Pandas–Matplotlib je minimem pro efektivní datovou analytiku i výrobní datové aplikace.
NumPy: vektorové výpočty a paměťově efektivní pole
ndarray je homogenní vícerozměrné pole s definovaným dtype (např. float64, int32). Vektorové operace jsou implementovány v C a Fortranu, což přináší řádově vyšší výkon než iterace v čistém Pythonu.
- Vytváření polí:
np.array([1,2,3]),np.zeros((n,m)),np.arange(0, 10, 0.5),np.linspace(0,1,100). - Vektorizace:
y = a*x + bpro celé vektory bez smyček; broadcasting zarovná tvary podle pravidel (přidání rozměrů o jednotkové délce). - Agregace:
x.mean(axis=0),x.std(ddof=1),np.percentile(x, [5,95]). - Indexace a výřezy: booleovská maska
x[x > 0], pokročilé indexováníx[np.ix_(rows, cols)]. - U-Funcs: univerzální funkce (
np.log,np.exp,np.where) běžící element-wise s podporou out parametrů a where masek.
Pandas: datové rámce jako páteř analytiky
DataFrame (tabulka) a Series (sloupec) přidávají nad NumPy index, pojmenované sloupce a bohatou sadu operací pro manipulaci s heterogenními daty. Pandas umí pracovat s časem, kategoriemi, chybějícími hodnotami a je ideální pro přípravu datasetů před modelováním či vizualizací.
- Načtení dat:
pd.read_csv("data.csv"),read_parquet,read_sql,read_excel,read_json. - Výběr a filtrování:
df[["col1","col2"]],df.loc[mask, "col"],df.iloc[:, :3]. - Transformace:
assign()pro nové sloupce,rename(),astype(),clip(),fillna(). - Agregace:
groupby(["k1","k2"]).agg({"x":"mean","y":"sum"}),pivot_table(values="v", index="i", columns="c", aggfunc="mean"). - Join/Merge:
pd.merge(left, right, on="id", how="left"),concatpro skládání tabulek nad sebou či vedle sebe.
Datové typy, chybějící hodnoty a kategorické proměnné
Správná práce s dtype výrazně ovlivňuje výkon i paměť:
- Číselné typy: preferujte
Int32/Int64(nullable) pro integer s NaN,Float32pro úsporu paměti (pozor na přesnost). - Řetězce:
string(pandas dType) s podporou.stroperací a NA hodnot. - Kategorie:
astype("category")pro sloupce s málo unikátními hodnotami – úspora paměti, rychlejšígroupby. - Chybějící:
df.fillna({"col":0}),df.dropna(subset=["x"]),interpolate()u časových řad.
Index, třídění a znovuvzorkování
- Index: nastavte smysluplný klíč
df.set_index("id", inplace=True)– zrychlíloca joiny. - Třídění:
sort_values(["date","user"], ascending=[True,False]),sort_index()pro rychlé lookupy. - Čas:
pd.to_datetime(df["ts"]), resamplingdf.resample("5min").agg({"x":"mean"}), posunyshift(), oknarolling().
Skupinové operace a okna
groupby a rolling řeší agregace i pokročilé metriky:
- Agregace:
df.groupby("segment")["revenue"].sum(), více agregací najednou s.agg(). - Transform: normalizace v rámci skupiny:
df["z"] = df.groupby("segment")["x"].transform(lambda s: (s - s.mean())/s.std()). - Okna: klouzavé průměry a percentily
df["ma7"] = df["y"].rolling(7, min_periods=1).mean().
Výkon: vektorizace, apply vs. numba a paměť
- Preferujte vektorizaci: operace po sloupcích/řádcích jsou řádově rychlejší než smyčky v Pythonu.
- Vyhýbejte se
applyna řádcích:df.apply(f, axis=1)je pohodlné, ale pomalé. Lépe rozložit funkci na sloupcové operace nebo použítnp.where/np.select. - Numba: pro těžké numerické jádro lze použít
@njitnad NumPy poli a výsledky zpět promítnout do DataFrame. - Paměť:
df.memory_usage(deep=True), downcast typu (pd.to_numeric(x, downcast="integer")), filtrujte sloupce po načtení.
Čtení a zápis: CSV, Parquet, SQL
- CSV: univerzální, ale textové – pomalejší a paměťově náročnější. Používejte
dtypeausecolspro rychlost. - Parquet: sloupcový komprimovaný formát – rychlé čtení vybraných sloupců, zachování typů (doporučeno pro analytické workflow).
- SQL:
read_sql(query, conn),to_sqlsif_exists="append", batche přeschunksize.
Matplotlib: od rychlého náhledu k produkčnímu grafu
Matplotlib je nízkoúrovňová knihovna s explicitní kontrolou nad osami, měřítky i anotacemi. Pro rychlé náhledy často stačí DataFrame.plot() (interně Matplotlib), pro publikace je vhodné pracovat přímo s pyplot a objekty Figure/Axes.
- Základ:
import matplotlib.pyplot as plt,fig, ax = plt.subplots(),ax.plot(x, y),ax.set_title("…"),ax.set_xlabel("…"). - Typy grafů:
plot(časové řady),bar/barh(kategorizované hodnoty),hist(distribuce),scatter(korelace),boxplot/violinplot(rozptyl). - Osy a měřítka:
ax.set_yscale("log"),ax.grid(True),ax.legend(), formátování ticků pro datummatplotlib.dates. - Export:
plt.savefig("graf.png", dpi=200, bbox_inches="tight")pro tiskovou kvalitu.
Časté vizualizační vzory v praxi
- Time-series dashboard: více metrik nad sdílenou osou X; pozor na sekundární osy – používejte je střídmě.
- Distribuce a anomálie: histogram + KDE (v Matplotlib přes
hista ruční výpočet hustoty v NumPy), boxplot pro identifikaci outlierů. - Segmentace:
groupbyv Pandas a faceting přes více Axes pro srovnání kategorií.
Propojení: Pandas → NumPy → Matplotlib
Pandas stojí na NumPy, proto je konverze přímá: df["x"].to_numpy() předáte Matplotlibu či Numbě. Typický tok: načtení a čištění v Pandas → extrakce polí pro numeriku v NumPy → vizualizace v Matplotlib. To umožňuje oddělit datovou přípravu od numerického jádra a prezentace.
Praktické minirecepty
- Normalizace sloupců:
df[cols] = (df[cols] - df[cols].mean()) / df[cols].std(ddof=0). - Podmíněné přiřazení:
df["flag"] = np.where((df["x"]>10)&(df["y"].notna()), 1, 0). - Rolling metriky:
df["drawdown"] = (df["value"]/df["value"].cummax() - 1),df["ma20"] = df["value"].rolling(20).mean(). - Rychlé pivoty:
pd.crosstab(df["seg"], df["state"], values=df["revenue"], aggfunc="sum").
Testování, reprodukovatelnost a pipeline
- Determinismus: fixujte semínko
np.random.default_rng(42). - Validace: kontrolujte tvary a rozsahy,
df.describe(), custom asserty (assert df["x"].ge(0).all()). - Pipeline: modularizujte kroky (načtení → čištění → feature engineering → vizualizace) do funkcí či tříd, aby bylo snadné je nasadit do produkce (Airflow, Prefect, Dagster).
Škálování: větší než paměť a paralelizace
Pro data, která se nevejdou do RAM, zvažte out-of-core a distribuované nástroje (Dask, Polars, Spark). Matplotlib lze použít i v dávkových skriptech bez GUI (Agg backend). Vždy měřte a profilujte: I/O často limituje výpočet více než CPU.
Časté anti-patterny a jak se jim vyhnout
- Iterace po řádcích: nahraďte vektorizací; pokud nelze, použijte NumPy/Numba a až poté mapujte zpět.
- Nespolehlivé typy: implicitní
objectu čísel zpomalí vše – vždyastypena správný dtype. - Chybějící index: nepoužívejte defaultní při merge velkých tabulek – nastavte klíče, třídění a případně kategorizujte.
- Graf bez kontextu: vždy popište osy, jednotky, zdroj dat a uveďte nejistotu (např. intervaly spolehlivosti).
Checklist osvědčených postupů
- Po načtení dat opravte typy (
to_datetime,astype, kategorie) a odstraňte zbytečné sloupce. - Preferujte Parquet pro mezikroky a sdílení mezi týmy.
- V Pandas používejte
assign,pipea pojmenované kroky pro čitelnost. - V NumPy stavte na vektorizaci a broadcasting; vyhněte se Python smyčkám.
- V Matplotlib pracujte s Figure/Axes, pojmenovávejte osy, přidejte legendu a grid, ukládejte s
bbox_inches="tight".
Závěr
Trio NumPy–Pandas–Matplotlib poskytuje robustní a prověřený základ pro většinu datových úloh v Pythonu. NumPy nabízí rychlé numerické jádro, Pandas přidává ergonomii tabulek a bohaté transformace a Matplotlib zajišťuje univerzální vizualizace. Osvojení vektorového myšlení, správné práce s datovými typy a disciplína ve vizualizacích zvyšuje efektivitu i kvalitu výstupů – od průzkumné analýzy po produkční datové aplikace.