Skip to content

Commit 3f3c6a0

Browse files
committed
Úpravy kapitoly Základní dotazy
1 parent cf9abac commit 3f3c6a0

File tree

5 files changed

+191
-186
lines changed

5 files changed

+191
-186
lines changed

python-pro-data-1/zakladni-dotazy/cteni-na-doma.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## Převody dat na DataFrame a zpět
1+
## Čtení na doma
22

33
`DataFrame` nejsou uzavřeným světem, ale umožňují snadný převod na seznamy, případně můžeme naopak převést seznam na `DataFrame`.
44

python-pro-data-1/zakladni-dotazy/entry.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ title: Základní dotazy
22
lead: Vyzkoušíme si základní dotazy, které pandas umí
33
sections:
44
- zakladni-dotazy
5-
- excs
5+
- podmineny-vyber
66
- cteni-na-doma

python-pro-data-1/zakladni-dotazy/excs/ceska-jmena-2/exercise.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
---
2-
title: Česká jména
2+
title: Česká jména 2
33
demand: 3
44
---
55

6-
Stáhni si soubor [jmena.csv](assets/jmena.csv) se jmény a načti ho tak, aby Pandas vyrobil číselný index. Proveď následující dotazy:
6+
Použij stejný soubor [jmena.csv](assets/jmena.csv) se jmény jako v předchozím cvičení a načti ho tak, aby Pandas vyrobil číselný index. Proveď následující dotazy:
77

88
1. Vypiš všechny řádky se jmény, jejichž nositelé mají průměrný věk vyšší než 60.
99
1. Vypiš pouze jména z těch řádků, kde četnost je mezi 80 000 a 100 000.
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
## Podmíněný výběr
2+
3+
Nyní si vyzkoušíme jednu z hlavních prací datového analytika, a to je **psaní dotazů**. 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.
4+
5+
### Výběr sloupců
6+
7+
Již jsme si říkali, že ne vždy nás zajímají všechna data. Řádky již umíme vybrat pomocí funkce `loc`. Funkce `loc` je praktická, pokud vybíráme konkrétní řádky a k nim nějaké konkrétní sloupce. Dále si zopakujme, že pokud chceme vybrat jen sloupec a zachovat všechny řádky, zpravidla použijeme výběr sloupců pomocí hranatých závorek.
8+
9+
```py
10+
print(staty["population"])
11+
```
12+
13+
Pokud nás zajímá více sloupců, můžeme opět použít seznam, do kterého sloupce vepíšeme.
14+
15+
```py
16+
print(staty[["population", "area"]])
17+
```
18+
19+
### Co vlastně umí série
20+
21+
Asi se teď říkáš, k čemu je to vlastně dobré. Zkusme si jednoduchý příklad: Chceme zjistit, kolik lidí žije ve všech státech světa. Bude nás tedy zajímat pouze sloupec `population`, kde máme sérii s počty obyvatel jednotlivých států. Série sama o sobě umí zajímavé věci, například umí sama spočítat svůj součet a vrátit výsledek jako číslo. K tomu slouží funkce `sum`. K jejímu volání opět použijeme tečkovou notaci.
22+
23+
```py
24+
populace = staty["population"]
25+
print(populace.sum())
26+
```
27+
28+
```shell
29+
7349137231
30+
```
31+
32+
Oba kroky můžeme spojit do jednoho.
33+
34+
```py
35+
print(staty["population"].sum())
36+
```
37+
38+
Série umí spočítat řadu dalších věcí, jako třeba průměr (funkce `mean`), minimum a maximum (funkce `min` a `max`) nebo medián (funkce `median`). Přehled všech funkcí najdeš [v dokumentaci](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html).
39+
40+
### Podmínky (ano, už zase)
41+
42+
V datové analýze 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í.
43+
44+
- 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.
45+
- Často chceme zpracovat jen část dat. Pokud máme například firmu s obchůdky v několika městech, můžeme chtít zpracovat jen data z jednoho města, pro nějaké konkrétní zboží nebo časové období.
46+
47+
V jazyce SQL píšeme podmínky za klíčové slovo `WHERE`, v Excelu můžeme použít funkce Filtr atd. V `pandas` používáme funkci `query`. Název této funkce si ale pamatovat nemusíš, protože namísto ní opět můžeme použít hranaté závorky.
48+
49+
Začněme s tím, že se podíváme na nejmenší státy, které na světě jsou. Nechme si například vypsat státy, které mají méně než 1000 obyvatel. Postup si vysvětlíme ve dvou krocích.
50+
51+
Nejprve potřebujeme formulovat podmínku. Ta bude vypadat takto `staty["population"] < 1000`. V podmínce máme sloupec, na který se ptáme, a porovnání s číselnou hodnotou. Používáme nám již známý operátor menší než (`<`). Zkusme si zadat samotnou podmínku do terminálu a podívejme se na výsledek.
52+
53+
```py
54+
print(staty["population"] < 1000)
55+
```
56+
57+
```shell
58+
name
59+
Afghanistan False
60+
Åland Islands False
61+
Albania False
62+
Algeria False
63+
American Samoa False
64+
...
65+
Wallis and Futuna False
66+
Western Sahara False
67+
Yemen False
68+
Zambia False
69+
Zimbabwe False
70+
Name: population, Length: 250, dtype: bool
71+
```
72+
73+
Pokud si vzpomeneš na hodnoty typu `bool`, víš, že ty mohly nabývat pouze dvou hodnot: `True` a `False`. Při použití operátorů pro porovnávání vždy získáme hodnotu typu `bool`. Pokud bychom například měli proměnnou `znamka` a napsali do terminálu `znamka < 3`, získáme jednu hodnotu `True` nebo `False`, a to podle toho, jakou hodnotu v proměnné `znamka` máme.
74+
75+
My v naší tabulce ale máme 250 států s různými počty obyvatel, proto nám náš dotaz vrací 250 hodnot, z nichž některé jsou `True` a některé `False`. Vytvořili jsme tedy jakýsi polotovar. My nyní chceme vidět jen ty řádku, kde máme hodnotu `True`, což nám dá státy s počtem obyvatel menší než 1000. K tomu využijeme poměrně zvláštní zápis - naši podmínku vložíme do hranatých závorek.
76+
77+
```py
78+
pidistaty = staty[staty["population"] < 1000]
79+
print(pidistaty[["population", "area"]])
80+
```
81+
82+
```shell
83+
population area
84+
name
85+
Bouvet Island 0 49.00
86+
United States Minor Outlying Islands 300 NaN
87+
Cocos (Keeling) Islands 550 14.00
88+
French Southern Territories 140 7747.00
89+
Heard Island and McDonald Islands 0 412.00
90+
Holy See 451 0.44
91+
Pitcairn 56 47.00
92+
South Georgia and the South Sandwich Islands 30 NaN
93+
```
94+
95+
Tento podivný zápis má ve skutečnosti svoji logiku. My jsme v našem polotovaru získali sloupec, kde máme 250 hodnot typu `bool`. `pandas` teď jednoduše udělají to, že vypíšou ty řádky řádky, kde má náš polotovar hodnotu `True` a ty, které mají hodnotu `False`, před námi skryjí.
96+
97+
V tabulce vidíme několik států a kromě Holy See (tj. Vatikánu) jsme o nich asi ani nikdy neslyšeli. V některých řádcích vidíme hodnotu `NaN`. To značí, že pro daný řádek hodnotu nemáme, pro některé státy tedy nemáme zadanou rozlohu. Měli bychom si tedy rozmyslet, zda s takovými státy v nějaké analýze vůbec pracovat.
98+
99+
### Spojení více podmínek
100+
101+
Často narazíme na případ, kdy chceme zkombinovat více podmínek, například chceme tržby v jedné prodejně a pro letošní rok. Při kombinaci se musíme rozhodnout, zda chceme, aby ke zobrazení řádku byly splněné obě, nebo zda stačí, aby byla splněna pouze jedna z nich.
102+
103+
Pokud chceme, aby musely být splněny obě podmínky, vložíme mezi ně symbol `&`. Uvažujme dvě podmínky:
104+
105+
- Stát musí mít alespoň 20 milionů obyvatel: `(staty["population"] > 20000000)`
106+
- Stát se musí nacházet v Evropě: `staty["region"] == "Europe")`
107+
108+
Obě tyto podmínky napíšeme do závorek a vložíme mezi ně symbol `&`. Následně použijeme již známé hranaté závorky, které přidáme hned za proměnnou `staty`.
109+
110+
```py
111+
lidnate_evropske_staty = staty[(staty["population"] > 20000000) & (staty["region"] == "Europe")]
112+
print(lidnate_evropske_staty["population"])
113+
```
114+
115+
```shell
116+
name
117+
France 66710000
118+
Germany 81770900
119+
Italy 60665551
120+
Poland 38437239
121+
Russian Federation 146599183
122+
Spain 46438422
123+
Ukraine 42692393
124+
United Kingdom of Great Britain and Northern Ireland 65110000
125+
Name: population, dtype: int64
126+
```
127+
128+
Pokud chceme, aby stačilo splnění jedné podmínky, použijeme symbol `|`. Zde vypisujeme státy, které mají buď více než miliardu obyvatel nebo rozlohu větší než 3 miliony kilometrů čtverečních.
129+
130+
```py
131+
print(staty[(staty["population"] > 10_000_000_000) | (staty["area"] > 3_000_000)])
132+
```
133+
134+
```shell
135+
alpha2Code alpha3Code capital region subregion population area gini
136+
name
137+
Antarctica AQ ATA Polar 1000 14000000.0 NaN
138+
Australia AU AUS Canberra Oceania Australia and New Zealand 24117360 7692024.0 30.5
139+
Brazil BR BRA Brasília Americas South America 206135893 8515767.0 54.7
140+
Canada CA CAN Ottawa Americas Northern America 36155487 9984670.0 32.6
141+
China CN CHN Beijing Asia Eastern Asia 1377422166 9640011.0 47.0
142+
India IN IND New Delhi Asia Southern Asia 1295210000 3287590.0 33.4
143+
Russian Federation RU RUS Moscow Europe Eastern Europe 146599183 17124442.0 40.1
144+
United States of America US USA Washington, D.C. Americas Northern America 323947000 9629091.0 48.0
145+
```
146+
147+
**Poznámka:** Abychom zpřehlednili zápis velkých čísel, použili jsme podtržítko.
148+
149+
### Použití seznamu v podmínce
150+
151+
Uvažujme, že bychom chtěli vypsat všechny státy, které leží v západní nebo východní Evropě. Na to bychom mohli použít operátor `|`, ale při dotazu na tři nebo čtyři hodnoty by se takový zápis extrémně protáhl.
152+
153+
V seznamu operátorů na porovnávání jsme měli ještě operátor `in`, kterým jsme ověřovali, jestli je nějaký prvek přítomný v kolekci. Tento operátor nám v `pandas` supluje funkce `isin()`. Pokud tuto funkci aplikujeme na jeden konkrétní sloupec, vrátí ním `True` pro všechny řádky, pro které je hodnota přítomná v seznamu. Náš dotaz na země východní a západní Evropy bychom tedy napsali jako `isin(["Western Europe", "Eastern Europe"])`.
154+
155+
```py
156+
print(staty[staty["subregion"].isin(["Western Europe", "Eastern Europe"])])
157+
```
158+
159+
```shell
160+
alpha2Code alpha3Code capital region subregion population area gini
161+
name
162+
Austria AT AUT Vienna Europe Western Europe 8725931 83871.00 26.0
163+
Belarus BY BLR Minsk Europe Eastern Europe 9498700 207600.00 26.5
164+
Belgium BE BEL Brussels Europe Western Europe 11319511 30528.00 33.0
165+
Bulgaria BG BGR Sofia Europe Eastern Europe 7153784 110879.00 28.2
166+
Czech Republic CZ CZE Prague Europe Eastern Europe 10558524 78865.00 26.0
167+
France FR FRA Paris Europe Western Europe 66710000 640679.00 32.7
168+
Germany DE DEU Berlin Europe Western Europe 81770900 357114.00 28.3
169+
Hungary HU HUN Budapest Europe Eastern Europe 9823000 93028.00 31.2
170+
Liechtenstein LI LIE Vaduz Europe Western Europe 37623 160.00 NaN
171+
Luxembourg LU LUX Luxembourg Europe Western Europe 576200 2586.00 30.8
172+
Moldova (Republic of) MD MDA Chișinău Europe Eastern Europe 3553100 33846.00 33.0
173+
Monaco MC MCO Monaco Europe Western Europe 38400 2.02 NaN
174+
Netherlands NL NLD Amsterdam Europe Western Europe 17019800 41850.00 30.9
175+
Poland PL POL Warsaw Europe Eastern Europe 38437239 312679.00 34.1
176+
Republic of Kosovo XK KOS Pristina Europe Eastern Europe 1733842 10908.00 NaN
177+
Romania RO ROU Bucharest Europe Eastern Europe 19861408 238391.00 30.0
178+
Russian Federation RU RUS Moscow Europe Eastern Europe 146599183 17124442.00 40.1
179+
Slovakia SK SVK Bratislava Europe Eastern Europe 5426252 49037.00 26.0
180+
Switzerland CH CHE Bern Europe Western Europe 8341600 41284.00 33.7
181+
Ukraine UA UKR Kiev Europe Eastern Europe 42692393 603700.00 26.4
182+
```
183+
184+
## Cvičení
185+
::exc[excs>ceska-jmena-2]

0 commit comments

Comments
 (0)