Datové rámce v Pythonu - pandas, geopandas a polars

Programování v GIS 2

Jan Caha

2025-04-14

Datové rámce

  • efektivně tabulka - řádky, sloupce
  • sloupce mají jednotný datový typ (číslo, text, datum, …)
  • řádky mají stejnou strukturu
  • každý řádek představuje jeden objekt (např. jeden záznam o měření)
  • sloupce mají jména (např. název měření, datum, …)
  • geodata - sloupce se specifickým datovým typem (geometrie)
  • efektivně se jedná o komplikovanou strukturu s mnoha funkcemi a metodami, které umožňují práci s daty

Datové rámce v Pythonu

  • Python tento koncept přímo v sobě neobsahuje (na rozdíl třeba od R)
  • nejstarší podobná implementace je numpy - což jsou obecně multidimenzionální struktury, ale spíše ve smyslu matic a dalších numerických dat
  • pro práci s tabulkovými daty se používá knihovna pandas a chceme-li pracovat s geografickými daty, tak geopandas
  • v poslední době se objevují i nové knihovny, které se snaží být efektivnější a rychlejší, např. polars

Pandas

  • závisí na řadě knihoven, poměrně “těžké”
  • z historických důvodů zde existuje na řadu problémů několik různých přístupů k řešení stejného problému může být zmatečné a komplikované na pochopení
  • chybí zcela ujednocující koncepce
  • nesmírně široké možnosti práce s daty a podpora pro mnoho formátů (platí i pro geodata)
  • práci občas stěžuje koncept indexů a jejich správa a absence jednotného přístupu k práci s daty
  • hlavní třída DataFrame - na ní řada funkcí
  • Pandas cookbook, Getting started tutorials, Pandas Tutorial: DataFrames in Python

Geopandas

  • rozšíření pandas pro prostorová data
  • třída GeoDataFrame, rozšíření DataFrame (nové funkce)
  • postaveno nad GDAL/OGR, respektive shapely a pygrio

Polars

  • modernější iterace na téma datových rámců, značně inspirovaná dplyr (balík pro R)
  • napsáno primárně pro Rust a následně portováno do mnoha dalších jazyků (včetně Pythonu)
  • mnohem rychlejší, bezpečnější a efektivnější než pandas
  • podporuje méně formátů než pandas, zejména s ohledem na udržení lehkosti (co se týká závislostí)
  • kód je mnohem čitelnější a obvykle jednodušší na pochopení v porovnání s pandas
  • user guide , Modern Polars - porovnání s pandas a polars
  • absence podpory prostrorových dat

Ukázka - selekce

import pandas as pd

df_pd = pd.read_csv(extracted)

df_pd.loc[12:15, ["Dest", "Tail_Number"]]

df_pd
    .set_index("IATA_CODE_Reporting_Airline")
    .loc[['AA', 'DL'], ["Dest", "Tail_Number"]]
import polars as pl

df_pl = pl.read_csv(extracted, truncate_ragged_lines=True)

df_pl.select(["Dest", "Tail_Number"]).head(16).tail(4)

df_pl
    .filter(pl.col("IATA_CODE_Reporting_Airline").is_in(['AA', 'DL']))
    .select(["IATA_CODE_Reporting_Airline", "Dest", "Tail_Number"])

Ukázka - tvorba sloupce

df_pd["novy_sloupec"] = False
df_pd["novy_sloupec"] = df_pd["novy_sloupec"].mask(df_pd["sloupec_hodnota"] <= 3, True)
df_pl.with_columns(
    pl.when(pl.col("sloupec_hodnota") <= 10)
    .then(True)
    .otherwise(False)
    .alias("novy_sloupec")
)

Dotazy?