Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions python-pro-data-1/agregace/agregace-a-razeni.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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)
```
2 changes: 1 addition & 1 deletion python-pro-data-1/agregace/excs/tuky.md
Original file line number Diff line number Diff line change
Expand Up @@ -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ě.
2 changes: 1 addition & 1 deletion python-pro-data-1/agregace/excs/vyrobci.md
Original file line number Diff line number Diff line change
Expand Up @@ -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ě.
35 changes: 14 additions & 21 deletions python-pro-data-1/vizualizace/vizualizace.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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:
Expand All @@ -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")
```
Expand Down Expand Up @@ -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")
```
Expand All @@ -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])
```