diff --git a/python-pro-data-1/agregace/agregace-a-razeni.md b/python-pro-data-1/agregace/agregace-a-razeni.md index 0add0cf..567d9f9 100644 --- a/python-pro-data-1/agregace/agregace-a-razeni.md +++ b/python-pro-data-1/agregace/agregace-a-razeni.md @@ -9,7 +9,7 @@ food_other = pd.read_csv("food_other.csv") # Sjednotíme tabulky o potravinách do jedné tabulky food food = pd.concat([food_sample_100, food_other], ignore_index=True) # Načteme data o výživných látkách -food_other = pd.read_csv("food_nutrient.csv") +food_nutrient = pd.read_csv("food_nutrient.csv") # Propojíme tabulky o potravinách a výživných látkách food_merged = pd.merge(food, food_nutrient, on="fdc_id") # Načteme tabulku o značkách potravin @@ -35,7 +35,7 @@ food_merged_brands_protein = food_merged_brands[food_merged_brands["nutrient_nam Při agregaci se musíme nejprve rozhodnout, podle jakého sloupce chceme řádky sloučit. V našem případě to bude `branded_food_category`. Poté vybereme sloupec, jehož hodnoty mají být sloučeny, a početní operaci, která k tomu bude použita. Vybereme si sloupec `amount` (množství výživné látky) a operaci výpočtu aritmetického průměru (`.mean()`). Zápis je uvedený v řádku níže. ```py -food_merged_brands_protein.groupby("branded_food_category")["amount"].mean() +food_merged_brands_protein_agg = food_merged_brands_protein.groupby("branded_food_category")["amount"].mean() ``` Ve výsledné tabulce vidíme průměrné množství proteintů v jednotlivých kategoriích potravin. @@ -64,5 +64,5 @@ Dále se pojďme podívat, které kategorie potravin obsahuje v průměru nejví Při řazení dat v původní tabulce je třeba uvést, podle jakého sloupečku chceme data seřadit. Název sloupce nebo sloupců zadáváme jako první parametr. Pokud chceme řadit podle více sloupců, vložíme jejich názvy do seznamu. ```py -food_merged_brands_protein_agg.sort_values("amount", ascending=False) +food_merged_brands_protein_agg.sort_values(ascending=False) ``` diff --git a/python-pro-data-1/agregace/excs/tuky.md b/python-pro-data-1/agregace/excs/tuky.md index 20ee675..d2c44db 100644 --- a/python-pro-data-1/agregace/excs/tuky.md +++ b/python-pro-data-1/agregace/excs/tuky.md @@ -3,4 +3,4 @@ title: Lipidy a tuky demand: 3 --- -Podívej se nyní na to, které kategorie potravin obsahují nejvíce lipidů (tuků). Nejprve pomocí dotazu vytvořit novou tabulku `food_merged_brands_lipid`, do které pomocí dotazu vlož pouze řádky, které mají jako název výživné látky hodnotu `Total lipid (fat)`. Poté proveď agregaci podle návu kategorie a seřaď výslednou tabulku tak, aby nahoře byly vidět kategorie s největším počtem tuků. Porovnej si výslednou tabulku s tabulkou `food_merged_brands_protein_agg`, kterou jsme vytvořili v rámci lekce. Podívej se, zda se některé kategorie objevují v obou tabulkách. +Podívej se nyní na to, které kategorie potravin mají nejvyšší průměrné množství tuků. Nejprve pomocí dotazu vytvořit novou tabulku `food_merged_brands_lipid`, do které pomocí dotazu vlož pouze řádky, které mají jako název výživné látky hodnotu `Total lipid (fat)`. Poté proveď agregaci podle návu kategorie s tím, že vypočítej průměrné množství tuků. Výslednou tabulku seřaď sestupně. diff --git a/python-pro-data-1/agregace/excs/vyrobci.md b/python-pro-data-1/agregace/excs/vyrobci.md index bf4af48..0583745 100644 --- a/python-pro-data-1/agregace/excs/vyrobci.md +++ b/python-pro-data-1/agregace/excs/vyrobci.md @@ -3,4 +3,4 @@ title: Výrobci a kategorie demand: 3 --- -Nyní uvažuj, že si chceme udělat přehled o tom, jaký výrobce produkuje jaké typy potravin. Proveď agregaci tabulky `food_merged_brands` podle dvou sloupců: `brand_owner` a `branded_food_category`. Sloupce musíš metodě `food_merged_brands` zadat jako seznam, tj. musíš použít hranaté závorky. Dále vyber sloupec `fdc_id` pro provedení agregace a použij agregaci `nunique()`, který vrátí počet unikátních hodnot. Nakonec použij metodu `sort_values` s tím, že chceš data seřadit sestupně. +Nyní uvažuj, že si chceme udělat přehled o tom, jaký výrobce produkuje jaké typy potravin. Proveď agregaci tabulky `food_merged_brands` podle dvou sloupců: `brand_owner` a `branded_food_category`. Sloupce musíš metodě `groupby` zadat jako seznam, tj. musíš použít hranaté závorky. Dále vyber sloupec `fdc_id` pro provedení agregace a použij agregaci `nunique()`, která vrátí počet unikátních hodnot. Nakonec použij metodu `sort_values` s tím, že chceš data seřadit sestupně. diff --git a/python-pro-data-1/vizualizace/vizualizace.md b/python-pro-data-1/vizualizace/vizualizace.md index 736d210..0eacdef 100644 --- a/python-pro-data-1/vizualizace/vizualizace.md +++ b/python-pro-data-1/vizualizace/vizualizace.md @@ -17,17 +17,23 @@ food = pd.concat([food_sample_100, food_other]) food_brands = pd.merge(food, branded_food, on="fdc_id") top_cat_list = ['Candy', 'Popcorn, Peanuts, Seeds & Related Snacks', 'Cheese', 'Ice Cream & Frozen Yogurt', 'Chips, Pretzels & Snacks', 'Cookies & Biscuits', 'Pickles, Olives, Peppers & Relishes', 'Breads & Buns', 'Fruit & Vegetable Juice, Nectars & Fruit Drinks', 'Snack, Energy & Granola Bars', 'Chocolate', 'Other Snacks'] -food_top_cat = food_brands[food_brands["branded_food_category"].isin(top_cat_list)] +food_brands = food_brands[food_brands["branded_food_category"].isin(top_cat_list)] ``` Graf vytvoříme pomocí funkce `countplot`. Jako první hodnotu zadáme název tabulku s daty a jako parametr `x` název sloupce, podle kterého se vygenerují sloupce grafu. V předchozí lekci to odpovídalo sloupci, který jsme zadávali do metody `groupby()`. Výsledek uložíme do proměnné `ax`. Jde o zkratku slova axis, která obsahuje odkaz na vytvořený graf. Pomocí metody `tick_params()` otočíme popisky osy *x* o 90 stupňů, protože jinak by se popisy vzájemně překrývaly. ```py -ax = sns.countplot(food_top_cat, x="branded_food_category") +ax = sns.countplot(food_brands, x="branded_food_category") ax.tick_params(axis='x', rotation=90) ``` -Pokud píšeme program jako skript, je nutné ještě přidat řádek `plt.show()`. Ten zajistí, že se graf zobrazí v samostatném okně. Pozor ale na to, že program se pozastaví, dokud okno s grafem neuzavřeme. Pokud používáme Jupyter notebook, tento řádek přidávat nemusíme. +Alternativní možností je zobrazení grafu "naležato". + +```py +ax = sns.countplot(food_brands, y="branded_food_category") +``` + +Pokud píšeme program jako skript, je nutné ještě přidat řádek `plt.show()` a do importů přidat `import matplotlib.pyplot as plt`. Ten zajistí, že se graf zobrazí v samostatném okně. Pozor ale na to, že program se pozastaví, dokud okno s grafem neuzavřeme. Pokud používáme Jupyter notebook, tento řádek přidávat nemusíme. Vygenerovaný graf je poměrně špatně čitelný. Můžeme ale zkusit názvy kategorií zkrátit. V rámci toho rovnou provedeme překlad do češtiny. K přejmenování použijeme metodu `.replace()`. Hodnoty můžeme vložit jako slovník. Vložíme do něj původní hodnotu a jejích náhradu, obojí opět oddělíme dvojtečkou. Protože chceme přejmenovat více hodnot, vložíme více dvojic, které oddělíme čárkou. @@ -46,15 +52,12 @@ food_brands["branded_food_category"] = food_brands["branded_food_category"].repl "Chocolate": "Čokoláda", "Other Snacks": "Další snacky" }) -food_list = ["Cukrovinky", "Slané snacky", "Sýry", "Zmrzlina", "Chipsy", "Sušenky", "Nakl. zelenina", "Pečivo", "Džusy", "En. tyčinky", "Čokoláda", "Další snacky"] -food_top_cat = food_brands[food_brands["branded_food_category"].isin(top_cat_list)] ``` Po přejmenování kategorií stačí otočit popisky o 45 stupňů, takže budou lépe čitelné. ```py -ax = sns.countplot(food_top_cat, x="branded_food_category") -ax.tick_params(axis='x', rotation=45) +sns.countplot(food_brands, y="branded_food_category") ``` Pokud bychom chtěli graf zveřejnit například v nějakém článku, je vhodné jej doplnit o popisky. K tomu využijeme metodu `set`, které nastavíme následující parametry: @@ -64,7 +67,7 @@ Pokud bychom chtěli graf zveřejnit například v nějakém článku, je vhodn - `title` nastaví titulek grafu. ```py -ax = sns.countplot(food_top_cat, x="branded_food_category") +ax = sns.countplot(food_brands, x="branded_food_category") ax.tick_params(axis='x', rotation=45) ax.set(xlabel="Kategorie", ylabel="Počet potravin", title="Počty potravin ve 12 nejpočetnějších kategoriích") ``` @@ -95,8 +98,7 @@ ax.set(xlabel="Množství proteinu (g)", ylabel="Počet potravin", title="Množs Dále se můžeme podívat, jak se liší průměrné množství proteinu pro jednotlivé kategorie potravin. K tomu slouží `barplot`. Ten vypočte průměrné hodnoty dle sloupce, který zadáme jako parametr `x`. Parametr `y` udává, ze kterého sloupce se vypočítá průměr, který udává výšku sloupců. Černá čára v grafu je označovaná jako `errorbar`. Vychází z předpokladu, že v datech máme vždy jen vzorek dat, například v našich datech je jen část potravin, které jsou na trhu k dostání. Sloupec, který udává výšku sloupce, je tedy v podstatě jen odhadem hodnoty, kterou bychom zjistili, pokud bychom analyzovali všechny dostupné potraviny na trhu. Černá čára pak udává tzv. interval spolehlivosti, tedy interval, ve kterém by se ten průměr nacházel s pravděpodobností 95 %. ```py -food_brands_nut = pd.merge(food_brands, food_nutrient, on="fdc_id") -ax = sns.barplot(food_brands_nut, x="branded_food_category", y="amount") +ax = sns.barplot(food_merged_brands_protein, y="branded_food_category", x="amount") ax.tick_params(axis='x', rotation=45) ax.set(xlabel="Kategorie", ylabel="Množství proteinu (g)", title="Průměrné množství proteinů v potravinách") ``` @@ -105,20 +107,11 @@ Další z oblíbených grafů je krabicový graf :term{cs="krabicový graf" en=" - Černá čára uprostřed udává průměr. Průměrná hodnota pro obě látky je tedy přibližně stejná. - Modré obdélníky udávají rozsah, ve kterém se nachází 50 % hodnot. Dolní hrana obdélníku odděluje 25 % nejmenších hodnot od zbývajících 75 %. Horní hrana obdélníku odděluje 75 % nejmenších hodnot od zbývajících 25 %. Tento obdélník ukazuje různorodost dat. Na našem příkladu vidíme, že z pohledu množství proteinů jsou jednotlivé energetické tyčinky více různorodé než z pohledu množství lipidů (tuků). -- Černé čáry jsou označované jako *whisker* (kočičí vousy). V našem případě fungují podobně jako obdélník, ale oddělují vždy 5 % nejmenších a největších hodnot od zbývajících 90 %. +- Černé čáry jsou označované jako *whisker* (kočičí vousy). V našem případě fungují podobně jako obdélník, ale oddělují vždy 5 % nejmenších a největších hodnot od zbývajících 90 % (tj. od 95 % výše). - Zbývajících 10 % hodnot je vykresleno pomocí černých teček. Aby byl graf celý v jednom jazyce, pojďme nejprve přejmenovat názvy výživných látek do češtiny ```py -food_merged_brands["nutrient_name"] = food_merged_brands["nutrient_name"].replace({ - "Total lipid (fat)": "Lipid (tuk)", - "Protein": "Protein" - }) -``` - -```py -food_merged_brands_box = food_merged_brands[(food_merged_brands["nutrient_name"].isin(["Proteiny", "Lipidy (tuky)"])) & (food_merged_brands["branded_food_category"] == "Snack, Energy & Granola Bars")] -ax = sns.boxplot(food_merged_brands_box, x="nutrient_name", y="amount", whis=[5, 95]) -ax.set(xlabel="Kategorie", ylabel="Množství v gramech", title="Množství proteinů a lipidů (tuků) v potravinách") +ax = sns.boxplot(food_merged_brands_protein, y="branded_food_category", x="amount", whis=[5, 95]) ```