Skip to content

Commit 0bd78d0

Browse files
authored
pandas.read_csv() primo URL (#19)
Closes #14
1 parent 150cbae commit 0bd78d0

File tree

4 files changed

+29
-46
lines changed

4 files changed

+29
-46
lines changed

python-pro-data-1/agregace-a-spojovani/agregace-a-spojovani.md

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,14 @@ V předchozí lekci jsme si ukázali, jak v `pandas` vytváříme `DataFrame` a
66

77
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).
88

9-
Pomocí příkazů níže si můžeš soubory stáhnout s využitím modulu `requests`.
9+
Funkce `read_csv()` knihovny `pandas` umí stáhnout CSV soubor rovnou z internetu.
1010

1111
```pycon
12-
import requests
13-
14-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/assets/u202.csv")
15-
open("u202.csv", "wb").write(r.content)
16-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/assets/u203.csv")
17-
open("u203.csv", "wb").write(r.content)
18-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/assets/u302.csv")
19-
open("u302.csv", "wb").write(r.content)
12+
import pandas
2013

14+
u202 = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/u202.csv")
15+
u203 = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/u203.csv")
16+
u302 = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/u302.csv")
2117
```
2218

2319
|cisloStudenta |predmet |znamka|den|
@@ -44,7 +40,7 @@ V praxi se poměrně často setkáme s tím, že v datovém setu některé hodno
4440

4541
V `pandas`, ale i obecně v datové analýze, je možné se s chybějícími daty vypořádat různými způsoby:
4642

47-
1. Nejlepší je vždy ověření, proč údaje chybí (např. u poskytovatele dat) a pokud je to možné, zajistit jejich doplnění.
43+
1. Nejlepší je vždy ověření, proč údaje chybí (např. u poskytovatele dat) a pokud je to možné, zajistit jejich doplnění.
4844
1. Nahradit chybějící hodnoty jinými hodnotami.
4945
1. Odstranit všechny řádky s chybějícími daty z datového setu.
5046
1. Vyčlenit je do separátního datasetu a zpracovat je zvlášť.
@@ -55,20 +51,20 @@ Důležité je mít na paměti, že vyřazením některých řádků může doj
5551

5652
Předpokládejme, že jsme si ověřili, že data chybí skutečně pouze u studentů, kteří z daného předmětu nematurovali. Protože nás budou zajímat především statistiky jednotlivých předmětů, můžeme prázdné řádky vynechat, protože označují zkoušky, které ve skutečnosti neproběhly.
5753

58-
Načtěme si nejprve naši první tabulku jako DataFrame.
54+
Pokud jsme tak ještě neučinili, načteme si naši první tabulku jako DataFrame.
5955

6056
```pycon
6157
import pandas
6258
u202 = pandas.read_csv('u202.csv')
6359
```
6460

65-
Pokud Pandas narazí na prázdnou buňku, vloží místo ní do tabulky speciální hodnotu `NaN`, se kterou už jsme se setkali.
61+
Pokud `pandas` narazí na prázdnou buňku, vloží místo ní do tabulky speciální hodnotu `NaN`, se kterou už jsme se setkali.
6662

6763
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í.
6864

6965
```pycon
7066
print(u202['znamka'].isnull())
71-
67+
7268
0 True
7369
1 False
7470
2 False
@@ -121,7 +117,7 @@ Pokud chceme tyto tři DataFrame spojit do jednoho, můžeme použít funkci `co
121117
maturita = pandas.concat([u202, u203, u302])
122118
```
123119

124-
Pozor ale na to, že v takto vzniklém DataFrame se nám **rozbije index**, protože se prostě spojí za sebe indexy jednotlivých tabulek. Pokud chceme, aby Pandas při spojování index přepočítal, musíme nastavit hodnotu parametru `ignore_index` na `True`.
120+
Pozor ale na to, že v takto vzniklém DataFrame se nám **rozbije index**, protože se prostě spojí za sebe indexy jednotlivých tabulek. Pokud chceme, aby `pandas` při spojování index přepočítal, musíme nastavit hodnotu parametru `ignore_index` na `True`.
125121

126122
```pycon
127123
maturita = pandas.concat([u202, u203, u302], ignore_index=True)
@@ -146,15 +142,12 @@ Výslednou tabulku si můžete stáhnout jako soubor [maturita.csv](assets/matur
146142

147143
### Propojení dat
148144

149-
Pandas však umí `DataFrame` také propojit, což odpovídá SQL příkazu `JOIN`. Nyní si ukážeme, jak na to. U výsledné tabulky je důležité, že bude mít **více sloupců**, počet řádků závisí na konkrétním typu operace a na samotných datech, jak ještě uvidíme.
145+
`pandas` však umí `DataFrame` také propojit, což odpovídá SQL příkazu `JOIN`. Nyní si ukážeme, jak na to. U výsledné tabulky je důležité, že bude mít **více sloupců**, počet řádků závisí na konkrétním typu operace a na samotných datech, jak ještě uvidíme.
150146

151147
Naše výsledky byly anonymní. Pokud bychom ale chtěli vytisknout maturitní vysvědčení, potřebujeme k číslům studenta zjistit jejich jména. Jména najdeme v samostatné tabulce [studenti.csv](assets/studenti.csv). Načtěme si jej jako `DataFrame`.
152148

153149
```pycon
154-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/assets/studenti.csv")
155-
open("studenti.csv", "wb").write(r.content)
156-
157-
studenti = pandas.read_csv('studenti.csv')
150+
studenti = pandas.read_csv('https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/studenti.csv')
158151
studenti.head()
159152

160153
cisloStudenta jméno
@@ -170,9 +163,9 @@ U operace `JOIN` jsou důležité dvě věci:
170163
- **Podle jakého sloupce** (nebo jakých sloupců) dvě různé tabulky propojujeme.
171164
- Co udělat v případě, že pro nějaké řádky **nemám ve druhé tabulce odpovídající hodnotu**.
172165

173-
Propojení tabulek se v Pandas dělá pomocí funkce `merge` (dokumentaci k ní je [zde](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html)). Ve výchozím nastavení funkce `merge` provádí spojení podle sloupců, které mají shodný název. V našem případě mají oba `DataFrame` sloupec `cisloStudenta`, je tedy použit tento sloupec. Je to přesně ten sloupec, podle kterého bychom je chtěli spojit.
166+
Propojení tabulek se v `pandas` dělá pomocí funkce `merge` (dokumentaci k ní je [zde](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html)). Ve výchozím nastavení funkce `merge` provádí spojení podle sloupců, které mají shodný název. V našem případě mají oba `DataFrame` sloupec `cisloStudenta`, je tedy použit tento sloupec. Je to přesně ten sloupec, podle kterého bychom je chtěli spojit.
174167

175-
Ve výchozím nastavení funkce `merge()` ponechá pouze řádky, které mají záznamy v obou tabulkách. V SQL bychom tuto operaci označili jako `INNER JOIN`.
168+
Ve výchozím nastavení funkce `merge()` ponechá pouze řádky, které mají záznamy v obou tabulkách. V SQL bychom tuto operaci označili jako `INNER JOIN`.
176169

177170
```pycon
178171
propojeny_df = pandas.merge(u202, studenti)
@@ -200,10 +193,7 @@ Zde vidíme, že data jsou zřejmě v pořádku.
200193
Dále připojíme tabulku [predsedajici.csv](assets/predsedajici.csv), kde máme vypsané předsedy maturitních komisí. Tu si opět načteme jako `DataFrame`.
201194

202195
```pycon
203-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/assets/predsedajici.csv")
204-
open("predsedajici.csv", "wb").write(r.content)
205-
206-
preds = pandas.read_csv('predsedajici.csv')
196+
preds = pandas.read_csv('https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/predsedajici.csv')
207197
```
208198

209199
Zkusme tabulky spojit jako předtím.
@@ -235,14 +225,14 @@ Zatím to vypadá dobře. Pokud se ovšem podíváme na `shape`, něco nám tady
235225

236226
```pycon
237227
print(novy_propojeny_df.shape)
238-
228+
239229
(10, 8)
240230
```
241231

242232
Najednou máme v tabulce pouze 12 řádků, některé tedy zmizely. To znamená, že funkce `merge()` nenašla pro všechna zkoušení odpovídajícího předsedu. Jak je to možné? Zkusme nyní říct funkci `merge()`, aby nám zachovala v prvním `DataFrame` ty řádky, pro které nenajde odpovídající záznam. Této operaci se v jazyce SQL říká LEFT OUTER JOIN. My ho provede tak, že funkci `merge()` jako parametr `how` zadáme hodnotu `left`.
243233

244234
```pycon
245-
novy_propojeny_df = pandas.merge(propojeny_df, preds, on=['den'], how="outer")
235+
novy_propojeny_df = pandas.merge(propojeny_df, preds, on=['den'], how="outer")
246236
print(novy_propojeny_df.shape)
247237

248238
(14, 8)
@@ -278,7 +268,7 @@ novy_propojeny_df = novy_propojeny_df.rename(columns={'jmeno_x': 'jmeno', 'jmeno
278268
```
279269
### Agregace
280270

281-
Z databází známe kromě UNION a JOIN také operaci GROUP BY. V Pandas ji provedeme tak, že pomocí metody `groupby` vyrobíme z `DataFrame` speciální objekt `DataFrameGroupBy`. Dejme tomu, že chceme grupovat podle sloupečku `mistnost`.
271+
Z databází známe kromě UNION a JOIN také operaci GROUP BY. V `pandas` ji provedeme tak, že pomocí metody `groupby` vyrobíme z `DataFrame` speciální objekt `DataFrameGroupBy`. Dejme tomu, že chceme grupovat podle sloupečku `mistnost`.
282272

283273
```pycon
284274
maturita.groupby('mistnost')
@@ -320,7 +310,7 @@ Pomocí agregací můžeme vyřešit i náš problém s nákupy. Pokud máme st
320310

321311
```pycon
322312
nakupy = pandas.read_csv('nakupy.csv')
323-
nakupy_celkem = nakupy.groupby("Jméno")["Částka v korunách"].sum()
313+
nakupy_celkem = nakupy.groupby("Jméno")["Částka v korunách"].sum()
324314
print(nakupy_celkem)
325315

326316
Jméno

python-pro-data-1/agregace-a-spojovani/excs/studenti/exercise.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ demand: 3
66
Stáhni si datové sety, se kterými budeme pracovat v tomto cvičení: [jmena.csv](assets/jmena.csv), [studenti1.csv](assets/studenti1.csv), [studenti2.csv](assets/studenti2.csv).
77

88
```pycon
9-
import requests
9+
import pandas
1010

11-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/excs/studenti/assets/jmena.csv")
12-
open("jmena.csv", "wb").write(r.content)
13-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/excs/studenti/assets/studenti1.csv")
14-
open("studenti1.csv", "wb").write(r.content)
15-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/agregace-a-spojovani/excs/studenti/assets/studenti2.csv")
16-
open("studenti2.csv", "wb").write(r.content)
11+
jmena = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/excs/excs>studenti/jmena.csv")
12+
s1 = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/excs/excs>studenti/studenti1.csv")
13+
s2 = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/agregace-a-spojovani/excs/excs>studenti/studenti2.csv")
1714
```
1815

1916
První set už známe z minulé lekce. Druhé dva sety obsahují seznam studentů na nějaké menší IT fakultě. Pozor, tato data nemají žádnou souvislost s výsledky maturity, které jsme procházeli během lekce.

python-pro-data-1/vizualizace/excs/call-centrum/exercise.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@ demand: 2
44
---
55

66

7-
V souboru [callcentrum.txt](assets/callcentrum.csv) najdete několik tisíc záznamů pro call centrum, které udávají časy mezi jednotlivými příchozími hovory v minutách a vteřinách. Načtěte tato data do série v Pythonu. Časy převeďte na vteřiny a zobrazte jejich histogram a boxplot. Co lze z těchto dvou grafů vyčíst?
7+
V souboru [callcentrum.csv](assets/callcentrum.csv) najdete několik tisíc záznamů pro call centrum, které udávají časy mezi jednotlivými příchozími hovory v minutách a vteřinách. Načtěte tato data do série v Pythonu. Časy převeďte na vteřiny a zobrazte jejich histogram a boxplot. Co lze z těchto dvou grafů vyčíst?
88

9-
K převodu na vteřiny můžeš použít metodu `str.split()`. Pomocí ní rozdělíš hodnoty minut a vteřit do samostatných sloupců. Pomocí metody `astype(int)` převedeš hodnoty na čísla. Poté pomocí počítaných sloupců můžeš spočítat celkový počet vteřin.
9+
K převodu na vteřiny můžeš použít metodu `str.split()`. Pomocí ní rozdělíš hodnoty minut a vteřin do samostatných sloupců. Pomocí metody `astype(int)` převedeš hodnoty na čísla. Poté pomocí počítaných sloupců můžeš spočítat celkový počet vteřin.
1010

1111
```pycon
12-
import requests
12+
import pandas
1313

14-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/vizualizace/excs/call-centrum/assets/callcentrum.csv")
15-
open("callcentrum.csv", "wb").write(r.content)
16-
17-
callcentrum = pandas.read_csv("callcentrum.csv")
14+
callcentrum = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/vizualizace/excs/excs>call-centrum/callcentrum.csv")
1815
callcentrum = callcentrum["hodnota"].str.split(':', expand=True).astype(int)
1916
```

python-pro-data-1/vizualizace/excs/hazeni-kostkami/exercise.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ Načtěte tato data do tabulky a zobrazte histogram hodů. Zvolte vhodné rozlo
1111
1. Je větší šance, že padne hodnota 12 než že padne hodnota 2?
1212

1313
```pycon
14-
import requests
14+
import pandas
1515

16-
r = requests.get("https://kodim.cz/czechitas/progr2-python/python-pro-data-1/vizualizace/excs/hazeni-kostkami/assets/kostky.csv")
17-
open("kostky.csv", "wb").write(r.content)
16+
kostky = pandas.read_csv("https://kodim.cz/cms/assets/kurzy/python-data-1/python-pro-data-1/vizualizace/excs/excs>hazeni-kostkami/kostky.csv")
1817
```

0 commit comments

Comments
 (0)