Pandas, NumPy, Matplotlib

Pandas, NumPy, Matplotlib

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 + b pro 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"), concat pro 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, Float32 pro úsporu paměti (pozor na přesnost).
  • Řetězce: string (pandas dType) s podporou .str operací 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í loc a joiny.
  • Třídění: sort_values(["date","user"], ascending=[True,False]), sort_index() pro rychlé lookupy.
  • Čas: pd.to_datetime(df["ts"]), resampling df.resample("5min").agg({"x":"mean"}), posuny shift(), okna rolling().

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 apply na řádcích: df.apply(f, axis=1) je pohodlné, ale pomalé. Lépe rozložit funkci na sloupcové operace nebo použít np.where/np.select.
  • Numba: pro těžké numerické jádro lze použít @njit nad 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 dtype a usecols pro 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_sql s if_exists="append", batche přes chunksize.

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 datum matplotlib.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 hist a ruční výpočet hustoty v NumPy), boxplot pro identifikaci outlierů.
  • Segmentace: groupby v 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í object u čísel zpomalí vše – vždy astype na 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, pipe a 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.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *