Skip to content
This repository was archived by the owner on Feb 15, 2023. It is now read-only.
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
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/maturita.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,předmět,známka,den,místnost
jmeno,predmet,znamka,den,mistnost
Lukáš Jurčík,Dějepis,3.0,pá,u202
Pavel Horák,Matematika,2.0,út,u202
Lukáš Jurčík,Společenské vědy,2.0,pá,u202
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/maturita2.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,předmět,známka,den,místnost,datum,předs
jmeno,predmet,znamka,den,mistnost,datum,preds
Lukáš Jurčík,Dějepis,3.0,pá,u202,24.5.2019,Alena Pniáčková
Lukáš Jurčík,Společenské vědy,2.0,pá,u202,24.5.2019,Alena Pniáčková
Pavel Kysilka,Biologie,1.0,pá,u202,24.5.2019,Alena Pniáčková
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/predsedajici.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
den,datum,jméno
den,datum,jmeno
po,20.5.2019,Marie Zuzaňáková
út,21.5.2019,Marie Zuzaňáková
st,22.5.2019,Petr Ortinský
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/u202.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,předmět,známka,den
jmeno,predmet,znamka,den
Jana Zbořilová,Chemie,,pá
Lukáš Jurčík,Dějepis,3,pá
Pavel Horák,Matematika,2,út
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/u203.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,předmět,známka,den
jmeno,predmet,znamka,den
Kateřina Novotná,Společenské vědy,3,po
Arnošt Sas,Matematika,5,po
Vasil Lácha,Informatika,3,po
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/u302.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,předmět,známka,den
jmeno,predmet,znamka,den
Petr Tábor,Informatika,1,po
Petr Tábor,Společenské vědy,1,po
Marie Krejcárková,Matematika,5,čt
Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-agregace/assets/vaha.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
den váha běh týden
den vaha beh tyden
pá 3. 75,6 kg 3 km 1
so 4. 75,3 kh pauza 1
ne 5. 75,9kg pauza 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,četnost,věk,pohlaví,svátek,původ
jmeno,cetnost,vek,pohlavi,svatek,puvod
Jiří,296090,49,m,24.4,řecký
Jan,293938,40,m,24.6. a 6.7,hebrejský
Petr,272135,42,m,22.2. a 29.6,řecký
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,příjmení,obor,ročník,kruh,prospěch
jmeno,prijmeni,obor,rocnik,kruh,prospech
Ludmila,Šindlerová,informatika a management,4,11,2.49
Jan,Pekárek,softwarové inženýrství,1,7,1.05
Milan,Weiss,počítačová grafika,5,11,2.62
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,příjmení,obor,ročník,kruh,prospěch
jmeno,prijmeni,obor,rocnik,kruh,prospech
Petr,Vanžura,správa IT systémů,3,3,2.24
Josef,Pícha,webové inženýrství,2,9,2.52
Michal,Steiner,informatika a management,2,2,2.33
Expand Down
44 changes: 22 additions & 22 deletions datova-analyza/pandas-agregace/pandas-agregace.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ V předchozí lekci jsme si ukázali, jak se v Pandas vytvoří DataFrame a jak

Abychom měli nějaký praktický příklad k procvičování, použijeme fiktivní data z výsledků maturitních zkoušek během jednoho týdne na nějakém menším gymnáziu. Maturita se odehrává ve třech místnostech: U202, U203 a U302. Máme tedy tři tabulky dat, z každé místnosti jednu. Níže si můžete prohlédnout příklad tabulky z místnosti U202. Všechny tabulky jsou ke stažení zde: [u202.csv](assets/u202.csv), [u203.csv](assets/u203.csv), [u302.csv](assets/u302.csv).

| jméno | předmět | známka | den |
| jmeno | predmet | znamka | den |
| ----------------- | ---------------- | ------ | --- |
| Jana Zbořilová | Chemie | | pá |
| Lukáš Jurčík | Dějepis | 3 | pá |
Expand Down Expand Up @@ -44,7 +44,7 @@ Pokud Pandas narazí na prázdnou buňku, vloží místo ní do tabulky speciál
Série obsahují metodu `isnull`, která vrátí pravdivostní sérii s hodnotou `True` všude tam, kde v původní sérii chybí hodnota. Metoda `notnull` pracuje přesně opačně. Vrátí pravdivostní sérii s hodnotami `True` všude tam, kde v původní sérii hodnota nechybí.

```pycon
>>> u202['známka'].isnull()
>>> u202['znamka'].isnull()
0 True
1 False
2 False
Expand All @@ -60,14 +60,14 @@ Série obsahují metodu `isnull`, která vrátí pravdivostní sérii s hodnotou
12 False
13 False
14 False
Name: známka, dtype: bool
Name: znamka, dtype: bool
```

Tyto metody můžeme využít například k tomu, abychom získali všechna data, kde chybí hodnota ve sloupečku <i>známka</i>.
Tyto metody můžeme využít například k tomu, abychom získali všechna data, kde chybí hodnota ve sloupečku <i>znamka</i>.

```pycon
>>> u202[u202['známka'].isnull()]
jméno předmět známka den
>>> u202[u202['znamka'].isnull()]
jmeno predmet znamka den
0 Jana Zbořilová Chemie NaN pá
9 Petr Valenta Dějepis NaN pá
```
Expand Down Expand Up @@ -103,9 +103,9 @@ Pozor ale na to, že v takto vzniklém DataFrame se nám rozbije index, protože
To už je lepší. Stále nám však zůstává jeden problém. Po spojení tabulek do jedné už nevíme, kdo maturoval v jaké místnosti. Tuto informaci si proto doplníme do původních tří tabulek jako nový sloupeček. Až poté tabulky spojíme do jedné.

```pycon
>>> u202['místnost'] = 'u202'
>>> u203['místnost'] = 'u203'
>>> u302['místnost'] = 'u302'
>>> u202['mistnost'] = 'u202'
>>> u203['mistnost'] = 'u203'
>>> u302['mistnost'] = 'u302'
>>> maturita = pandas.concat([u202, u203, u302], ignore_index=True)
```

Expand All @@ -121,7 +121,7 @@ Výslednou tabulku si můžete stáhnout jako soubor [maturita.csv](assets/matur

Už jsme si ukázali, jak v Pandas spojovat tabulky za sebe, což v SQL odpovídá příkazu UNION. Pandas však umí DataFrame také mergovat, což odpovídá SQL příkazu JOIN. Abychom si tento postup mohli předvést, nečteme si tabulku, která uvádí, kdo v který den předsedal maturitní zkoušecí komisi.

| den | datum | jméno |
| den | datum | jmeno |
| --- | --------- | ---------------- |
| po | 20.5.2019 | Marie Zuzaňáková |
| út | 21.5.2019 | Marie Zuzaňáková |
Expand All @@ -141,7 +141,7 @@ Join tabulek se v Pandas dělá pomocí funkce `merge`. Nejprve ji otestujme pou
>>> test = pandas.merge(u202, preds)
```

Takto na poprvé se však s úspěchem nesetkáme, neboť výsledkem příkazu bude prázdný DataFrame. Důvod je ten, že metoda `merge` dělá ve výchozím nastavení INNER JOIN podle všech sloupečků, které mají stejná jména. Naše dvě tabulky se tedy spojí podle sloupečků <i>jméno</i> a <i>den</i>. Tyto dva sloupečky ale nemají pro žádný řádek v obou tabulkách stejnou hodnotu, takže nám ve výsledku žádný řádek nezbude.
Takto na poprvé se však s úspěchem nesetkáme, neboť výsledkem příkazu bude prázdný DataFrame. Důvod je ten, že metoda `merge` dělá ve výchozím nastavení INNER JOIN podle všech sloupečků, které mají stejná jména. Naše dvě tabulky se tedy spojí podle sloupečků <i>jmeno</i> a <i>den</i>. Tyto dva sloupečky ale nemají pro žádný řádek v obou tabulkách stejnou hodnotu, takže nám ve výsledku žádný řádek nezbude.

Můžeme být neoblomná a zaexperimentovat s OUTER JOIN

Expand All @@ -154,45 +154,45 @@ Takto nám ale ve výsledku vznikne ohromné množství nedefinovaných hodnot.
```pycon
>>> test = pandas.merge(u202, preds, on=['den'])
>>> test.head()
jméno_x předmět známka den mistnost datum jméno_y
jmeno_x predmet znamka den mistnost datum jmeno_y
0 Lukáš Jurčík Dějepis 3.0 pá u202 24.5.2019 Alena Pniáčková
1 Lukáš Jurčík Společenské vědy 2.0 pá u202 24.5.2019 Alena Pniáčková
2 Pavel Kysilka Biologie 1.0 pá u202 24.5.2019 Alena Pniáčková
3 Pavel Horák Matematika 2.0 út u202 21.5.2019 Marie Zuzaňáková
4 Pavel Horák Chemie 5.0 út u202 21.5.2019 Marie Zuzaňáková
```

Potíž je v tom, že se teď oba sloupečky <i>jméno</i> automaticky přejmenovaly, aby neměly v tabulce stejný název. Zde můžeme použít metodu `rename`, abychom sloupečky přejmenovali na něco smysluplného.
Potíž je v tom, že se teď oba sloupečky <i>jmeno</i> automaticky přejmenovaly, aby neměly v tabulce stejný název. Zde můžeme použít metodu `rename`, abychom sloupečky přejmenovali na něco smysluplného.

```pycon
test = test.rename(columns={'jméno_x': 'jméno', 'jméno_y': 'předs'})
test = test.rename(columns={'jmeno_x': 'jmeno', 'jmeno_y': 'preds'})
```

Nyní už tabulka vypadá hezky. Proveďme tedy totéž pro celý náš maturitní dataset a opět si jej uložme do souboru, ať jej máme vždy po ruce.

```pycon
>>> maturita2 = pandas.merge(maturita, preds, on=['den'])
>>> maturita2 = maturita2.rename(columns={'jméno_x': 'jméno', 'jméno_y': 'předs'})
>>> maturita2 = maturita2.rename(columns={'jmeno_x': 'jmeno', 'jmeno_y': 'preds'})
>>> maturita2.to_csv('maturita2.csv', index=False)
```

Výslednou tabulku si opět můžete stáhnout jako soubor [maturita2.csv](assets/maturita2.csv).

## Grupování

Z databází známe kromě UNION a JOIN také operaci GROUP BY. V Pandas ji provedeme tak, že pomocí metody <i>groupby</i> vyrobíme z DataFrame speciální objekt `DataFrameGroupBy`. Dejme tomu, že chceme grupovat podle sloupečku <i>místnost</i>.
Z databází známe kromě UNION a JOIN také operaci GROUP BY. V Pandas ji provedeme tak, že pomocí metody <i>groupby</i> vyrobíme z DataFrame speciální objekt `DataFrameGroupBy`. Dejme tomu, že chceme grupovat podle sloupečku <i>mistnost</i>.

```pycon
>>> maturita2.groupby('místnost')
>>> maturita2.groupby('mistnost')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f96153a1cf8>
```

Na tomto speciálním objektu pak můžeme používat různé agregační funkce. Nejjednodušší je funkce `count`

```pycon
>>> maturita2.groupby('místnost').count()
jméno předmět známka den datum předs
místnost
>>> maturita2.groupby('mistnost').count()
jmeno predmet znamka den datum preds
mistnost
u202 13 13 13 13 13 13
u203 13 13 13 13 13 13
u302 12 12 12 12 12 12
Expand All @@ -215,13 +215,13 @@ Další užitečné agregační funkce jsou například
Nemusíme samozřejmě grupovat přes všechny sloupečky. Vybereme si pouze ty, které nás zajímají. Zkusme například spočítat průměrnou známku z jednotlivých předmětů.

```pycon
>>> maturita2.groupby('předmět')['známka'].mean()
>>> maturita2.groupby('predmet')['znamka'].mean()
```

Všimněte si, že takto obdržíme sérii, nikoliv DataFrame. Pozornější z vás možná tuší, že abychom získali DataFrame, musíme psát

```pycon
>>> maturita2.groupby('předmět')[['známka']].mean()
>>> maturita2.groupby('predmet')[['znamka']].mean()
```

## Cvičení
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno,četnost,věk,pohlaví,svátek,původ
jmeno,cetnost,vek,pohlavi,svatek,puvod
Jiří,296090,49,m,24.4,řecký
Jan,293938,40,m,24.6. a 6.7,hebrejský
Petr,272135,42,m,22.2. a 29.6,řecký
Expand Down
14 changes: 7 additions & 7 deletions datova-analyza/pandas-dotazy/excs/ceska-jmena/exercise.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ title: Česká jména
demand: 2
---

Stáhněte si soubor [jmena100.csv](assets/jmena100.csv), který obsahuje tabulku 100 nejpoužívanějších českých křestních jmen seřazených od nejpoužívanějšího k nejméně používanému. Otevřete Python konzoli a pomocí Pandas načtěte tuto tabulku jako DataFrame. Jako index zvolte sloupec s názvem 'jméno'.
Stáhněte si soubor [jmena100.csv](assets/jmena100.csv), který obsahuje tabulku 100 nejpoužívanějších českých křestních jmen seřazených od nejpoužívanějšího k nejméně používanému. Otevřete Python konzoli a pomocí Pandas načtěte tuto tabulku jako DataFrame. Jako index zvolte sloupec s názvem 'jmeno'.

Datový soubor obsahuje následující sloupečky

- **jméno** \- křestní jméno
- **četnost** \- počet obyvatel ČR mající toto jméno
- **věk** \- průměrný věk nositelů jména
- **pohlaví** \- zda je jméno mužské či ženské
- **svátek** \- datum, kdy má dané jméno svátek
- **původ** \- původ jména
- **jmeno** \- křestní jméno
- **cetnost** \- počet obyvatel ČR mající toto jméno
- **vek** \- průměrný věk nositelů jména
- **pohlavi** \- zda je jméno mužské či ženské
- **svatek** \- datum, kdy má dané jméno svátek
- **puvod** \- původ jména

Vyřešte následující úkoly.

Expand Down
2 changes: 1 addition & 1 deletion datova-analyza/pandas-transformace/assets/vaha.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
den váha běh týden
den vaha beh tyden
pá 3. 75,6 kg 3 km 1
so 4. 75,3 kh pauza 1
ne 5. 75,9kg pauza 1
Expand Down
22 changes: 11 additions & 11 deletions datova-analyza/pandas-transformace/pandas-transformace.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Vytváření vlastních funkcí jsme si nevysvětlovali jen tak nazdařbůh. Na

Uvažme jakéhosi Kristiána, jenž se snaží o zhubnutí do svého obleku, který má ještě z tanečních na střední škole. Náš Kristián se rozhodl po 14 dní zdravěji jíst a chodit pravidelně běhat. Své úsilí si poctivě zaznamenával do následující tabulky.

| den | váha | běh | týden |
| den | vaha | beh | tyden |
| ------ | ------- | ----- | ----- |
| pá 3. | 75,6 kg | 3 km | 1 |
| so 4. | 75,3 kh | pauza | 1 |
Expand Down Expand Up @@ -176,7 +176,7 @@ print(vaha)
```

```pycon
den váha běh týden číslo dne
den vaha beh tyden číslo dne
0 pá 75,6 kg 3 km 1 3
1 so 75,3 kh pauza 1 4
2 ne 75,9kg pauza 1 5
Expand Down Expand Up @@ -215,12 +215,12 @@ def kilogramy(vstup):
Nyní jsme připravení tuto funkci vypustit na naše data. K tomu použijeme metodu na sériích s názvem `apply`. Tato metoda očekává jako vstup nějakou funkci. Tuto funkci pak spustí na každou jednotlivou položku série a ze získaných výsledků vyrobí novou sérii. Pokud vám tento postup připomíná chroustání seznamů, trefili jste do černého. Pojďme si tento postup vyzkoušet s naší novou funkcí.

```pycon
vaha['váha'] = vaha['váha'].apply(kilogramy)
vaha['vaha'] = vaha['vaha'].apply(kilogramy)
print(vaha)
```

```pycon
den váha běh týden číslo dne
den vaha beh tyden číslo dne
0 pá 75.6 3 km 1 3
1 so 75.3 pauza 1 4
2 ne 75.9 pauza 1 5
Expand All @@ -244,15 +244,15 @@ Nádhera! Naše data jsou nyní mnohem učesanější a můžeme je začít vyho
Naše dnešní povídání o Pandas završíme tím, že si vytvoříme vlastní agregační funkci. Agregace pomocí vestavěných funkcí jako je součet, průměr, rozptyl apod. už jsme viděli. Takto bychom například mohli spočítat průměr váhy za každý týden zvlášť.

```py
print(vaha.groupby('týden')['váha'].mean())
print(vaha.groupby('tyden')['vaha'].mean())
```

```pycon
Name: den, dtype: object
týden
tyden
1 75.457143
2 74.414286
Name: váha, dtype: float64
Name: vaha, dtype: float64
```

V reálném světě tam venku se nám však snadno může stát, že budeme potřebovat agregovat data nějakým složitějším způsobem nebo prostě způsobem, který v sobě Pandas nemá přímo zabudovaný. Uvažme například situaci, kdy chceme spočítat takzvané rozpětí váhy za každý týden. Rozpětí je rozdíl mezi minimální a maximální hodnotou. Takovouto agregační funkci Pandas přímo nenabízí. Musíme si ji napsat sami.
Expand All @@ -267,7 +267,7 @@ def spread(serie):
Nyní stačí tuto funkci předat metodě `agg`. Tuto metodu můžeme volat na jednotlivých sériích. Zjistěme například rozpětí všech vah za celých 14 dní.

```py
print(vaha['váha'].agg(spread))
print(vaha['vaha'].agg(spread))
```

```pycon
Expand All @@ -277,12 +277,12 @@ print(vaha['váha'].agg(spread))
Mnohem mocnější jsou však agregace při grupování. Naše funkce `spread` se tak zavolá na každou skupinu, která grupováním vznikne. Můžeme tedy rovnou spočítat rozpětí váhy v jednotlivých týdnech.

```py
print(vaha.groupby('týden')['váha'].agg(spread))
print(vaha.groupby('tyden')['vaha'].agg(spread))
```

```pycon
týden
tyden
1 1.2
2 1.4
Name: váha, dtype: float64
Name: vaha, dtype: float64
```
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Průměrní teploty
title: Průměrné teploty
demand: 2
---

Expand Down
2 changes: 1 addition & 1 deletion zaklady-programovani/opakovani/assets/studenti.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
jméno příjmení rodné číslo
jmeno prijmeni rodne cislo
Květoslava Příbrská 895203/6093
Jindřich Linhart 940720/2024
Josef Hurta 880705/7017
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ title: Teploty jako program
demand: 1
---

Minulý týden jsme dělali [cvičení na zpracování teplot](text-chroustani#excs>seznam-teplot). Udělejte toto cvičení znovu, tentokrát jako program, který všechny požadované informace vypíše hezky přehledně na obrazovku.
Minule jsme dělali [cvičení na zpracování teplot](text-chroustani#excs>seznam-teplot). Udělejte toto cvičení znovu, tentokrát jako program, který všechny požadované informace vypíše hezky přehledně na obrazovku.
3 changes: 1 addition & 2 deletions zaklady-programovani/text-chroustani/text-chroustani.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,7 @@ Pokud se pak rozhodneme, že bychom chtěli jen celé kilometry bez desetinných
## Seznamy seznamů

Ještě zajímavější situace nastane, budeme-li chtít zchroustat seznam seznamů.
Minulý týden jsme vyráběli seznam známek ze čtyř písemek pro šest účastníků
kurzu. Mohl by vypadat například takto:
Zkusme se podívat na seznam známek ze čtyř písemek od šesti účastníků kurzu. Mohl by vypadat například takto:

```py
pisemky = [
Expand Down