Před jakoukoli složitější analýzou je třeba naučit se základy práce se zpracovávanými daty - v našem případě půjde o tabulky.
Při běžném programování se snažíme aliasům vyhýbat, protože snižují čitelnost kódu pro další programátory. U datové analytiky je to jinak, protože použití jednoho aliasu, který je navíc velmi běžný, nám ušetří spoustu psaní. Mimoto výsledkem našich analýz budou spíše tabulky a grafy než kód.
import pandas as pd
Pro čtení dat má Pandas celou řadu funkcí read_*
, díky kterým si poradí s celou řadou různých formátů. Nejběžnějším je ale pořád formát CSV, ve kterém jsou jednotlivé hodnoty oddělené čárkami.
Pokud budeš tímto notebookem experimentovat, stáhni si nejdříve soubor s daty z tohoto odkazu. Data pro pokusy jsou vytvořena z komplexního Pokedexu na Githubu.
data = pd.read_csv("static/pokemon.csv")
Po načtení dat dává smysl se na ně hned podívat, abychom zjistili, že je vše v pořádku. Může se stát, že v CSV souboru bude chybět první řádek s názvy sloupců, hodnoty budou oddělené jiným znakem než čárkou a spousta dalších eventualit. Náš CSV soubor je však precizně připraven a tak, když si jej zobrazíme v notebooku, uvidíme kompletní tabulku, kde je vše jak má být.
data
Základní zobrazení v notebooku nám ukáže prvních pět a posledních pět řádků v tabulce společně s informací o celkovém počtu řádků a sloupců. Naše tabulka je úmyslně dostatečně malá, aby se s ní pohodlně pracovalo, což ale většinou není ten případ. Proto se podíváme na to, jak si z tabulky vybrat jen to, co nás zajímá.
Sloupce i řádky mají tzv. index, s jehož pomocí se dá k jednotlivým částem tabulky přistoupit. V našem případě má každý řádek automaticky doplněný unikátní číselný index (ten bezejmenný sloupec nalevo) a jako index pro sloupce nám poslouží prvni řádek CSV souboru s názvy sloupců.
Později se naučíme indexy měnit a vkládat do nich i více než jednu hodnotu.
Sloupce lze vybrat stejně jako se vybírají hodnoty ze slovníku - do hranatých závorek stačí napsat název sloupce.
data['name']
Pokud potřebujeme více sloupců najednou, vložíme do hranatých závorek za proměnnou s tabulkou jejich seznam.
data[['name', 'color']]
Pokud název sloupce neobsahuje mezeru a nekoliduje s názvem existující metody, dá se k němu přistoupit i pomocí tečkové notace, což je velmi užitečné především při psaní složitějších podmínek.
data.name
Pro sloupec shape
je tento přístup nepoužitelný, protože koliduje s atributem, ve kterém je uložen počet řádků a slupců tabulky.
data.shape
Pro řádky se používá tzv. indexer loc
, který nám dokáže obstarat jeden či více řádků.
Můžeme si například říci o jeden řádek jeho indexem:
data.loc[1]
O více řádků seznamem jejich indexů:
data.loc[[1, 2, 3]]
Nebo třeba stejně jako i seznamů o několik řádků pomocí rozsahu indexů:
data.loc[100:105]
Indexer loc
je vhodný i pro získání konkrétní hodnoty, jen se při indexaci použijí oba indexy (pro řádek i sloupec) najednou ve formě ntice.
data.loc[101, 'name']
Velmi často se hodí získat část tabulky, ve kteté hodnoty splňují určitá kritéria. Toho lze docílit tak, že napíšeme do hranatých závorek podmínku a dostaneme jen ty řádky, které danou podmínku splňují.
Například nás budou zajímat jen červení pokémoni.
data[data['color'] == "red"]
Podmínky se dají i kombinovat, ale musí se dodržet jistá pravidla. První z nich je, že každá podmínka musí být samostatně uzavřena v kulatých závorkách. Dále pak logické spojky and
a or
jsou zde nahrazeny znaky &
a |
.
Co třeba červení pokémoni, jejichž síla útoku je vyšší nebo rovna 130?
data[(data['attack'] >= 130) & (data['color'] == "red")]
Podmínka zapsaná v hranatých závorkách ve skutečnosti není jen tak obyčejnou podmínkou. Jedná se totiž o hromadnou operaci napříč celým sloupcem, která pro každý řádek vrátí True
nebo False
, což v případě použití k filtraci rozhodne o jeho zobrazení.
data.speed >= 65
I další známé operátory lze použít stejným způsobem a aplikovat je na sloupec a jednu hodnotu či na více sloupců najednou.
data["speed"] / 10
data.hp * data.defense
Výsledek takové operace lze velmi snadno přidat zpět k původní tabulce jako nový sloupec.
data["fast"] = data.speed >= 65
data
K řazení podle hodnot slouží metoda sort_values
, podle indexu pak řadí metoda sort_index
. Prvních několik řádků získáme metodou head
a naopak poslední nám poskytne metoda tail
.
Pět nejrychlejších pokémonů tedy získáme snadno sestupným seřazením podle jejich rychlosti a omezením na prvních pět řádků.
data.sort_values(by="speed", ascending=False).head()
Před změnou indexu je dobrý nápad se přesvědčit, zda sloupec s budoucím indexem obsahuje jen unikátní hodnoty.
data.shape
data.name.nunique()
Protože počet unikátních hodnot ve sloupci se jménem pokémona je stejný jako celkový počet řádků, můžeme jméno použít jako index. To lze udělat buď nastavením atributu index
nebo pomocí metody set_index
, která toho umí i daleko více.
data.set_index("name")
Celá řada metod vrátí po úpravě tabulky její kopii s provedenou změnou. Protože bychom v tomto případě raději upravili tabulku přímo, uložíme výsledek nastavení indexu zpět do proměnné data
.
data = data.set_index("name")
Nyní si můžeme vyzkoušet řazení s upraveným indexem a také získávání konkrétních řádků s jeho pomocí.
data.sort_index()
data.loc["pikachu"]
Tohle nejsou ani zdaleka všechny možnosti manipulace s daty, které Pandas umožňuje, ale pro začátek to bude stačit. Další si ukážeme během explorační datové analýzy v následujících kapitolách.
Pokud si chceš výsledky svých experimentů uložit do souboru, stačí použít metodu to_csv()
.
data.to_csv("vysledky_pokusu.csv")
Před další lekcí je důležité se s Pandasem trošku sžít a základní operace s daty dostat pod kůži. V dalších lekcích si budeme ukazovat pokročilejší metody pro práci s daty, které budou na těchto základech stavět. Po každé lekci bude také více než vhodné si nově získané znalosti zkusit a k tomu bude potřeba pro začátek sehnat nějaká data.
Lepších či horších zdrojů dat je na internetu nepřeberné množství, takže si každý jistě vybere. Na začátku doporučujeme si vybrat data, kterým rozumíš, protože se pak při analýze budeš moci soustředit na řešení pokročilejších úloh a nebudeš muset bazírovat nad významem krkolomně pojmenovaných sloupců.
Pro začátek se můžeš podívat třeba sem:
Zkus si nějakou datovou sadu stáhnout a prozkoumat. Když se ti zalíbí, tak si ji nech, budeš si s ní moci hrát čím dál sofistikovaněji po absolvování dalších lekcích.