Podmíněný výběr
Nyní si vyzkoušíme jeden z hlavních nástrojů zpracování dat, a to je psaní querydotazů. Logika psaní dotazů je v různých prostředích stejná, liší se pouze to, jak ji provádíme. Podívejme se na konkrétní příklady.
Budeme se dále věnovat potravinám, tentokrát jejich výživovým hodnotám. Data jsou uložena v souboru food_nutrient.csv. Níže je stručný popis sloupců tabulky.
id
: Identifikační číslo záznamu.fdc_id
: Identifikační číslo potraviny, ke které se vztahuje živina.nutrient_id
: Identifikační číslo živiny.amount
: Množství živiny v potravině.data_points
: Počet datových bodů použitých pro výpočet průměru.derivation_id
: Identifikační číslo metody, kterou byla hodnota živiny odvozena.standard_error
: Standardní chyba měření množství živiny.min
: Minimální hodnota množství živiny nalezlá v potravině.max
: Maximální hodnota množství živiny nalezlá v potravině.median
: Medián hodnot množství živiny v potravině.footnote
: Poznámka nebo dodatečné informace o živině.name
: Název živiny.unit_name
: Název jednotky, ve které se měří živina.nutrient_nbr
: Unikátní číslo identifikující živinu nebo potravinovou složku.
Všimni si, že nevíme název potraviny, pouze její identifikační číslo. To je stejné jako v předchozí tabulce. Abychom ve výstupu viděli i názvy potravin, je potřeba obě tabulky propojit, což si ukážeme v další lekci.
Co vlastně umí série
Již jsme si říkali, že ne vždy nás zajímají všechna data. Zopakujme si, že pokud chceme vybrat jen sloupec a zachovat všechny řádky, zpravidla použijeme výběr sloupců pomocí hranatých závorek.
import pandas as pd
food_nutrient = pd.read_csv("food_nutrient.csv")
food_nutrient.head()
Podívejme se na sloupec name
, který obsahuje názvy jednotlivých výživných látek.
food_nutrient["name"]
Nás by mohlo zajímat, jaké všechny výživné látky v datech jsou. K tomu nám snaží vidět každý název jenom jednou. Jinak řečeno, potřebujeme unikátní hodnoty. K tomu můžeme využít metodu .unique()
.
food_nutrient["name"].unique()
Též může být zajímavé, kolikrát máme o některé z výživných látek informaci. K tomu můžeme použít metodu .value_counts()
. Ta nám pro každou výživnou hodnotu zobrazí, kolikrát se v tabulce vyskytuje.
food_nutrient["name"].value_counts()
Podmíněný výběr
Při zpracovávání dat podmínkám rozhodně neutečeš. Podmínky jsou velmi užitečné, protože bez nich bychom museli pracovat se všemi daty, co jsme dostali, což není vždy žádoucí.
- Data často obsahují chyby, která vzniknou třeba špatným nastavením stroje nebo překlepem pracovníka, který je zadával. Pokud bychom chyby nechali v datech a dále s nimi pracovali, udělaly by nám tam pěknou paseku.
- Často chceme zpracovat jen část dat. Například u výživných látek nás můžou zajímat jen ty, které jsou zdraví prospěšné (chceme jich konzumovat nějaké doporučené množství), nebo naopak ty zdraví škodlivé (chceme jich konzumovat co nejméně).
V jazyce SQL píšeme podmínky za klíčové slovo WHERE
, v Excelu můžeme použít funkce Filtr atd. V pandas
můžeme použít metodu query
nebo zápis s využitím hranatých závorek.
Uvažujme například, že nám jde o obsah hořčíku (Magnesium
), protože naším úkolem je doporučit potraviny lidem s nedostatkem hořčíku. Nejprve potřebujeme formulovat podmínku. Ta bude vypadat takto food_nutrient["Magnesium"] == "Magnesium, Mg"
. V podmínce máme sloupec, na který se ptáme, a porovnání s řetězcem. Používáme operátor na kontrolu rovnosti (==
). Zkusme si zadat samotnou podmínku a podívejme se na výsledek.
Název zadáváme včetně chemické značky, protože tak je to v původních datech.
food_nutrient["name"] == "Magnesium, Mg"
Pokud si vzpomeneš na hodnoty typu bool
, víš, že můžou nabývat pouze dvou hodnot: True
(pravda) a False
(nepravda). Při použití operátorů pro porovnávání vždy získáme hodnotu typu bool
. Nyní použijeme poměrně svérázný zápis pomocí hranatých závorek. Podmínku, kterou jsme formulovali v předchozím kroku, vložíme do hranatých závorek, před kterou vložíme název tabulky food_nutrient
. Tento zápis provede následující:
- Z původní tabulky
food_nutrient
vybere ty řádky, které vyhovují podmínce, tj. ty, které měly při předchozím zápisu hodnotuTrue
. - Výsledek uloží do nové tabulky
magnesium
. Výsledná tabulka bude obsahovat všechny sloupce z původní tabulky, ale pouze ty řádky, které vyhovují podmínce.
magnesium = food_nutrient[food_nutrient["name"] == "Magnesium, Mg"]
Popisná statistika
Pokud pracujeme s číselnými ukazateli, je dobré podívat se na ukazatele popisné statistiky. Ač to může znít hrozivě, jsou to hodnoty, se kterými se setkáváme poměrně běžně. Zjistíme je pomocí metody describe()
. Metodu je možné použít pro více sloupců, ale ne vždy dávají smysl. Například pro sloupec fdc_id
nemá smysl hodnoty počítat, protože to jsou číslá označení ("pojmenování") jednotlivých potravin.
Též by nemělo smysl použít metodu .describe()
pro všechny řádky najednou, protože by došlo k promíchání dat o různých živinách, navíš měřených v odlišných jednotkách.
magnesium["amount"].describe()
V datech se zobrazují tyto hodnoty:
count
: Počet hodnot.mean
: Aritmetický průměr hodnot.std
: standard deviationSměrodatná odchylka. Pomocí ní měříme variabilityrůznorodost dat.min
: Nejmenší hodnota.25%
: Toto číslo rozděluje data na 25 % menších hodnot a 75 % větších hodnot.50%
: Medián. Jde o číslo, které by leželo přesně uprostřed seřazených hodnot, tj. rozděluje data na 50 % menších hodnot a 50 % větších hodnot.75%
: Toto číslo rozděluje data na 75 % menších hodnot a 25 % větších hodnot.max
: Největší hodnota.
Naším úkolem je vybrat potraviny, které mají vyšší množství hořčíku. K tomu opět využijeme dotaz. Uvažujeme, že nás zajímají potraviny, které mají více než 100 gramů hořčíku.
magnesium_limit = magnesium[magnesium["amount"] > 100]
Spojení více podmínek
Nyní uvažujme, že chceme spojit více podmínek dohromady. U některých živin může být například vhodné nekonzumovat jich příliš malé, ale ani příliš velké množství. Uvažujme například vápník. Nejprve si vytvoříme tabulku, která bude obsahovat data pouze o vápníku. Postup je stejný jako v předchozí části.
calcium = food_nutrient[food_nutrient["name"] == "Calcium, Ca"]
Naším úkolem bude vybrat potraviny, které mají mezi 30 a 500 mg vápníku. Vepíšeme do hranatých závorek obě podmínky. Každou z podmínek vložíme do kulatých závorek. V našem případě chceme, aby byly splněné obě podmínky, proto mezi ně vložíme symbol &
.
calcium_limit = calcium[(calcium["amount"] > 30) & (calcium["amount"] < 500)]
Podmínek můžeme zkombinovat i více, například tři. Předchozí dva kroky můžeme díky tomu spojit do jednoho, tj. z původní tabulky food_nutrient
vybereme řádky, které:
- mají ve sloupci
name
hodnotu"Calcium, Ca"
, - mají ve sloupci
amount
hodnotu větší než 30, - mají ve sloupci
amount
hodnotu menší než 500.
Mezi každou dvojici podmínek vložíme symbol &
, tento symbol tedy použijeme dvakrát.
calcium_limit = food_nutrient[(food_nutrient["name"] == "Calcium, Ca") & (food_nutrient["amount"] > 30) & (food_nutrient["amount"] < 500)]
Pokud chceme, aby stačilo splnění jedné podmínky, použijeme symbol |
.