Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky. Můžete použít prostředí z lekce o NumPy.
$ python -m pip install --upgrade pip
$ python -m pip install notebook pandas matplotlib
Pro případ, že by vaše verze pip
-u neuměla wheels nebo na PyPI nebyly příslušné wheel balíčky, je dobré mít na systému nainstalovaný překladač C a Fortranu (např. gcc
, gcc-gfortran
) a hlavičkové soubory Pythonu (např. python3-devel
). Jestli je ale nemáte, zkuste instalaci přímo – wheels pro většinu operačních systémů existují – a až kdyby to nefungovalo, instalujte překladače a hlavičky.
Mezitím co se instaluje, stáhněte si do adresáře static
potřebné soubory:
actors.csv a
spouses.csv.
A až bude nainstalováno, spusťte si nový Notebook. (Viz lekce o Notebooku.)
Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?
Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.
Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.
Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.
Práce datového analytika se většinou drží následujícího postupu:
*(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*
S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: json
, csv
, případně doinstalovat requests
, lxml
pro XML či xlwt
/openpyxl
na excelové soubory.
Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.
Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)
Jak bylo řečeno u NumPy, analytici – cílová skupina této knihovny – mají rádi zkratky. Ve spoustě materiálů na Webu proto najdete import pandas as pd
, případně rovnou (a bez vysvětlení) použité pd
jako zkratku pro pandas
. Tento návod ale používá plné jméno.
import pandas
Základní datový typ, který Pandas nabízí, je DataFrame
, neboli lidově „tabulka”. Jednotlivé záznamy jsou v ní uvedeny jako řádky a části těchto záznamů jsou úhledně srovnány ve sloupcích.
Nejpoužívanější způsob, jak naplnit první DataFrame, je načtení ze souboru. Na to má Pandas sadu funkcí začínající read_
. (Některé z nich potřebují další knihovny, viz dokumentace.)
Jeden z nejpříjemnějších formátů je CSV:
actors = pandas.read_csv('static/actors.csv', index_col=None)
actors
Případně lze tabulku vytvořit ze seznamu seznamů:
items = pandas.DataFrame([
["Book", 123],
["Computer", 2185],
])
items
…nebo seznamu slovníků:
items = pandas.DataFrame([
{"name": "Book", "price": 123},
{"name": "Computer", "price": 2185},
])
items
V Jupyter Notebooku se tabulka vykreslí „graficky”. V konzoli se vypíše textově, ale data v ní jsou stejná:
print(actors)
Základní informace o tabulce se dají získat metodou info
:
actors.info()
Vidíme, že je to tabulka (DataFrame
), má 6 řádků indexovaných
(pomocí automaticky vygenerovaného indexu) od 0 do 5
a 3 sloupce: jeden s objekty, jeden s int64
a jeden s bool
.
Tyto datové typy (dtypes
) se doplnily automaticky podle zadaných
hodnot. Pandas je používá hlavně pro šetření pamětí: pythonní objekt
typu bool
zabírá v paměti desítky bytů, ale v bool
sloupci
si každá hodnota vystačí s jedním bytem.
Na rozdíl od NumPy jsou typy dynamické: když do sloupce zapíšeme „nekompatibilní”
hodnotu, kterou Pandas neumí převést na daný typ, typ sloupce
se automaticky zobecní.
Některé automatické převody ovšem nemusí být úplně intuitivní, např. None
na NaN
.
Sloupec, neboli Series
, je druhý základní datový typ v Pandas. Obsahuje sérii hodnot, jako seznam, ale navíc má jméno, datový typ a „index”, který jednotlivé hodnoty pojmenovává. Sloupce se dají získat vybráním z tabulky:
birth_years = actors['birth']
birth_years
type(birth_years)
birth_years.name
birth_years.index
birth_years.dtype
S informacemi ve sloupcích se dá počítat. Základní aritmetické operace (jako sčítání či dělení) se sloupcem a skalární hodnotou (číslem, řetězcem, ...) provedou danou operaci nad každou hodnotou ve sloupci. Výsledek je nový sloupec:
ages = 2016 - birth_years
ages
century = birth_years // 100 + 1
century
To platí jak pro aritmetické operace (+
, -
, *
, /
, //
, %
, **
), tak pro porovnávání:
birth_years > 1940
birth_years == 1940
Když sloupec nesečteme se skalární hodnotou (číslem) ale sekvencí, např. seznamem nebo dalším sloupcem, operace se provede na odpovídajících prvcích. Sloupec a druhá sekvence musí mít stejnou délku.
actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
Řetězcové operace se u řetězcových sloupců schovávají pod jmenným prostorem str
:
actors['name'].str.upper()
... a operace s daty a časy (datetime) najdeme pod dt
.
Ze slupců jdou vybírat prvky či podsekvence podobně jako třeba ze seznamů:
birth_years[2]
birth_years[2:-2]
A navíc je lze vybírat pomocí sloupce typu bool
, což vybere ty záznamy, u kterých je odpovídající hodnota true. Tak lze rychle vybrat hodnoty, které odpovídají nějaké podmínce:
# Roky narození po roce 1940
birth_years[birth_years > 1940]
Protože Python neumožňuje předefinovat chování operátorů and
a or
, logické spojení operací se tradičně dělá přes bitové operátory &
(a) a |
(nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:
# Roky narození v daném rozmezí
birth_years[(birth_years > 1940) & (birth_years < 1943)]
Sloupce mají zabudovanou celou řadu operací, od základních (např. column.sum()
, která bývá rychlejší než vestavěná funkce sum()
) po roztodivné statistické specialitky. Kompletní seznam hledejte v dokumentaci. Povědomí o operacích, které sloupce umožňují, je základní znalost datového analytika.
print('Součet: ', birth_years.sum())
print('Průměr: ', birth_years.mean())
print('Medián: ', birth_years.median())
print('Počet unikátních hodnot: ', birth_years.nunique())
print('Koeficient špičatosti: ', birth_years.kurtosis())
Zvláště mocná je metoda apply
, která nám dovoluje aplikovat jakoukoli funkci na všechny hodnoty sloupce:
actors['name'].apply(lambda x: ''.join(reversed(x)))
actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
Prvky ze sloupců jdou vybírat jako u seznamů. Ale z tabulek v Pandas jde vybírat spoustou různých způsobů. Tradiční hranaté závorky plní několik funkcí najednou, takže někdy není na první pohled jasné, co jaké indexování znamená:
actors['name'] # Jméno sloupce
actors[1:-1] # Interval řádků
actors[['name', 'alive']] # Seznam sloupců
Toto je příklad nejednoznačného chování, které zjednodušuje život datovým analytikům, pro které je knihovna Pandas primárně určena.
My, coby programátoři píšící robustní kód, budeme čisté indexování ([]
) používat jen pro výběr sloupců podle jména.
Pro ostatní přístup použijeme tzv. indexery, jako loc
a iloc
.
loc
Indexer loc
zprostředkovává primárně řádky, a to podle indexu, tedy hlaviček tabulky. V našem příkladu jsou řádky očíslované a sloupce pojmenované, ale dále uvidíme, že v obou indexech můžou být jakékoli hodnoty.
actors
actors.loc[2]
Všimněte si, že loc
není metoda: používají se s ním hranaté závorky.
Použijeme-li k indexování n-tici, prvním prvkem se indexují řádky a druhým sloupce – podobně jako u NumPy:
actors.loc[2, 'birth']
Na obou pozicích může být „interval”, ale na rozdíl od klasického Pythonu jsou ve výsledku obsaženy obě koncové hodnoty. (S indexem, který nemusí být vždy číselný, to dává smysl.)
actors.loc[2:4, 'birth':'alive']
Když uvedeme jen jednu hodnotu, sníží se dimenzionalita – z tabulky na sloupec (případně řádek – taky Series), ze sloupce na skalární hodnotu. Porovnejte:
actors.loc[2:4, 'name']
actors.loc[2:4, 'name':'name']
Chcete-li vybrat sloupec, na místě řádků uveďte dvojtečku – t.j. kompletní interval.
actors.loc[:, 'alive']
Další možnost indexování je seznamem hodnot. Tím se dají řádky či sloupce vybírat, přeskupovat, nebo i duplikovat:
actors.loc[:, ['name', 'alive']]
actors.loc[[3, 2, 4, 4], :]
iloc
Druhý indexer, který si v krátkosti ukážeme, je iloc
. Umí to samé co loc
, jen nepracuje s klíčem, ale s pozicemi řádků či sloupců. Funguje tedy jako indexování v NumPy.
actors
actors.iloc[0, 0]
Protože iloc
pracuje s čísly, záporná čísla a intervaly fungují jako ve standardním Pythonu:
actors.iloc[-1, 1]
actors.iloc[:, 0:1]
Indexování seznamem ale funguje jako u loc
:
actors.iloc[[0, -1, 3], [-1, 1, 0]]
Jak loc
tak iloc
fungují i na sloupcích (Series), takže se dají kombinovat:
actors.iloc[-1].loc['name']
V minulé sekci jsme naťukli indexy – jména jednotlivých sloupců nebo řádků. Teď se podívejme, co všechno s nimi lze dělat. Načtěte si znovu stejnou tabulku:
actors = pandas.read_csv('static/actors.csv', index_col=None)
actors
Tato tabulka má dva klíče: jeden pro řádky, index
, a druhý pro sloupce, který se jmenuje columns
.
actors.index
actors.columns
Klíč se dá změnit tím, že do něj přiřadíme sloupec (nebo jinou sekvenci):
actors.index = actors['name']
actors
actors.index
Potom jde pomocí tohoto klíče vyhledávat. Chceme-li vyhledávat efektivně (což dává smysl, pokud by řádků byly miliony), je dobré nejdřív tabulku podle indexu seřadit:
actors = actors.sort_index()
actors
actors.loc[['Eric', 'Graham']]
Pozor ale na situaci, kdy hodnoty v klíči nejsou unikátní. To Pandas podporuje, ale chování nemusí být podle vašich představ:
actors.loc['Terry']
Trochu pokročilejší možnost, jak klíč nastavit, je metoda set_index
. Nejčastěji se používá k přesunutí sloupců do klíče, ale v dokumentaci se dočtete i o dalších možnostech.
Přesuňte teď do klíče dva sloupce najednou:
indexed_actors = actors.set_index(['name', 'birth'])
indexed_actors
Vznikl tím víceúrovňový klíč:
indexed_actors.index
Řádky z tabulky s víceúrovňovým klíčem se dají vybírat buď postupně po jednotlivých úrovních, nebo n-ticí:
indexed_actors.loc['Terry']
indexed_actors.loc['Terry'].loc[1940]
indexed_actors.loc[('Terry', 1942)]
Kromě výběru dat mají klíče i jinou vlastnost: přidáme-li do tabulky nový sloupec s klíčem, jednotlivé řádky se seřadí podle něj:
indexed_actors
last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
last_names
indexed_actors['last_name'] = last_names
indexed_actors
V posledním příkladu vidíme, že Pandas doplňuje za neznámé hodnoty NaN
, tedy "Not a Number" – hodnotu, která plní podobnou funkci jako NULL
v SQL nebo None
v Pythonu. Znamená, že daná informace chybí, není k dispozici nebo ani nedává smysl ji mít. Naprostá většina operací s NaN
dává opět NaN
:
'(' + indexed_actors['last_name'] + ')'
NaN se chová divně i při porovnávání; (NaN == NaN)
je nepravda. Pro zjištění chybějících hodnot máme metodu isnull()
:
indexed_actors['last_name'].isnull()
Abychom se NaN
zbavili, máme dvě možnosti. Buď je zaplníme pomocí metody fillna
hodnotou jako 0
, False
nebo, pro přehlednější výpis, prázdným řetězcem:
indexed_actors.fillna('')
Nebo se můžeme zbavit všech řádků, které nějaký NaN
obsahují:
indexed_actors.dropna()
Bohužel existuje jistá nekonzistence mezi NaN
a slovy null
či na
v názvech funkcí. C'est la vie.
Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame
metodu merge()
, která umí podobné operace jako JOIN
v SQL.
actors = pandas.read_csv('static/actors.csv', index_col=None)
actors
spouses = pandas.read_csv('static/spouses.csv', index_col=None)
spouses
actors.merge(spouses)
Mají-li spojované tabulky sloupce stejných jmen, Pandas je spojí podle těchto sloupců. V dokumentaci se dá zjistit, jak explicitně určit podle kterých klíčů spojovat, co udělat když v jedné z tabulek chybí odpovídající hodnoty apod.
Fanoušky SQL ještě odkážu na porovnání mezi SQL a Pandas.
Dostáváme se do bodu, kdy nám jednoduchá tabulka přestává stačit. Pojďme si vytvořit tabulku větší: fiktivních prodejů v e-shopu, ve formátu jaký bychom mohli dostat z SQL databáze nebo datového souboru.
Použijeme k tomu mimo jiné date_range
, která vytváří kalendářní intervaly. Zde, i v jiných případech, kdy je jasné, že se má nějaká hodnota interpretovat jako datum, nám Pandas dovolí místo objektů datetime
zadávat data řetězcem:
import itertools
import random
random.seed(0)
months = pandas.date_range('2015-01', '2016-12', freq='M')
categories = ['Electronics', 'Power Tools', 'Clothing']
data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)}
for a, b in itertools.product(months, categories)
if random.randrange(20) > 0])
Tabulka je celkem dlouhá (i když v analýze dat bývají ještě delší). Podívejme se na několik obecných informací:
# Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
data.head()
# Celkový počet řádků
len(data)
data['sales'].describe()
Pomocí set_index
nastavíme, které sloupce budeme brát jako hlavičky:
indexed = data.set_index(['category', 'month'])
indexed.head()
Budeme-li chtít z těchto dat vytvořit tabulku, která má v řádcích kategorie a ve sloupcích měsíce, můžeme využít metodu unstack
, která "přesune" vnitřní úroveň indexu řádků do sloupců a uspořádá podle toho i data.
Můžeme samozřejmě použít kteroukoli úroveň klíče; viz dokumentace k unstack
a reverzní operaci stack
.
unstacked = indexed.unstack('month')
unstacked
Teď je sloupcový klíč dvouúrovňový, ale úroveň sales
je zbytečná. Můžeme se jí zbavit pomocí MultiIndex.droplevel
.
unstacked.columns = unstacked.columns.droplevel()
unstacked
A teď můžeme data analyzovat. Kolik se celkem utratilo za elektroniku?
unstacked.loc['Electronics'].sum()
Jak to vypadalo se všemi elektrickými zařízeními v třech konkrétních měsících?
unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
A jak se prodávalo oblečení?
unstacked.loc['Clothing']
Metody stack
a unstack
jsou sice asi nejužitečnější, ale stále jen jeden ze způsobů jak v Pandas tabulky přeskládávat. Náročnější studenti najdou další možnosti v dokumentaci.
Je-li nainstalována knihovna matplotlib
, Pandas ji umí využít k tomu, aby kreslil grafy. Nastavení je trochu jiné pro Jupyter Notebook a pro příkazovou řádku.
Používáte-li Jupyter Notebook, zapněte integraci pro kreslení grafů pomocí:
import matplotlib
# Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):
%matplotlib inline
a pak můžete přímo použít metodu plot()
, která bez dalších argumentů vynese data z tabulky proti indexu:
unstacked.loc['Clothing'].dropna().plot()
Jste-li v příkazové řádce, napřed použij plot()
a potom se na graf buď podívete, nebo ho uložte:
# Setup
import matplotlib.pyplot
# Plot
unstacked.loc['Clothing'].plot()
matplotlib.pyplot.show()
matplotlib.pyplot.savefig('graph.png')
Funkce show
a savefig
pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce savefig
aktuální graf zahodí; před dalším show
nebo savefig
je potřeba ho vykreslit znovu.
V kombinaci s dalšími funkcemi Series
a DataFrame
umožňují grafy získat o datech rychlý přehled:
# Jak se postupně vyvíjely zisky z oblečení?
# `.T` udělá transpozici tabulky (vymění řádky a sloupce)
# `cumsum()` spočítá průběžný součet po sloupcích
unstacked.T.fillna(0).cumsum().plot()
# Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
Další informace jsou, jak už to bývá, v dokumentaci.
Často používaná operace pro zjednodušení tabulky je groupby
, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.
data.head()
Samotný výsledek groupby()
je jen objekt:
data.groupby('category')
... na který musíme zavolat příslušnou agregující funkci. Tady je například součet částek podle kategorie:
data.groupby('category').sum()
Nebo počet záznamů:
data.groupby('category').count()
Groupby umí agregovat podle více sloupců najednou (i když u našeho příkladu nedává velký smysl):
data.groupby(['category', 'month']).sum().head()
Chceme-li aplikovat více funkcí najednou, předáme jejich seznam metodě agg
. Časté funkce lze předat jen jménem, jinak předáme funkci či metodu přímo:
data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
Případně použijeme zkratku pro základní analýzu:
g = data.groupby('month')
g.describe()
A perlička nakonec – agregovat se dá i podle sloupců, které nejsou v tabulce. Následující kód rozloží data na slabé, průměrné a silné měsíce podle toho, kolik jsme v daném měsíci vydělali celých tisícikorun, a zjistí celkový zisk ze slabých, průměrných a silných měsíců:
bin_size = 10000
by_month = data.groupby('month').sum()
by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
by_thousands
by_thousands[('sales', 'sum')].plot()
{ "data": { "sessionMaterial": { "id": "session-material:2018/mipyt-zima:pandas:1", "title": "Pandas", "html": "\n \n \n\n <div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky.\nMůžete použít prostředí z lekce o NumPy.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python -m pip install --upgrade pip\n<span class=\"gp\">$ </span>python -m pip install notebook pandas matplotlib\n</pre></div><p>Pro případ, že by vaše verze <code>pip</code>-u neuměla <em>wheels</em> nebo na PyPI nebyly příslušné <em>wheel</em> balíčky, je dobré mít na systému nainstalovaný překladač C a Fortranu (např. <code>gcc</code>, <code>gcc-gfortran</code>) a hlavičkové soubory Pythonu (např. <code>python3-devel</code>). Jestli je ale nemáte, zkuste instalaci přímo – <em>wheels</em> pro většinu operačních systémů existují – a až kdyby to nefungovalo, instalujte překladače a hlavičky.</p>\n<p>Mezitím co se instaluje, stáhněte si do adresáře <code>static</code> potřebné soubory:\n<a href=\"/2018/mipyt-zima/intro/pandas/static/actors.csv\">actors.csv</a> a\n<a href=\"/2018/mipyt-zima/intro/pandas/static/spouses.csv\">spouses.csv</a>.</p>\n<p>A až bude nainstalováno, spusťte si nový Notebook. (Viz <a href=\"/2018/mipyt-zima/intro/notebook/\">lekce o Notebooku</a>.)</p>\n<hr>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h1>Analýza dat v Pythonu</h1>\n<p>Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?</p>\n<p>Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.</p>\n<p>Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.</p>\n<p>Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.</p>\n<h2>Proces analýzy dat</h2>\n<p>Práce datového analytika se většinou drží následujícího postupu:</p>\n<ul>\n<li>Formulace otázky, kterou chceme zodpovědět</li>\n<li>Identifikace dat, která můžeme použít</li>\n<li>Získání dat (stažení, převod do použitelného formátu)</li>\n<li>Uložení dat</li>\n<li>Zkoumání dat</li>\n<li>Publikace výsledků</li>\n</ul>\n<p><small>*(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*</small></p>\n<p>S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: <code>json</code>, <code>csv</code>, případně doinstalovat <code>requests</code>, <code>lxml</code> pro XML či <code>xlwt</code>/<code>openpyxl</code> na excelové soubory.</p>\n<p>Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h1>Pandas</h1>\n<p>Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Jak bylo řečeno u <a href=\"/2018/mipyt-zima/intro/numpy/\">NumPy</a>, analytici – cílová skupina této knihovny – mají rádi zkratky. Ve spoustě materiálů na Webu proto najdete <code>import pandas as pd</code>, případně rovnou (a bez vysvětlení) použité <code>pd</code> jako zkratku pro <code>pandas</code>. Tento návod ale používá plné jméno.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [1]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">pandas</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Tabulky</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Základní datový typ, který Pandas nabízí, je <code>DataFrame</code>, neboli lidově „tabulka”. Jednotlivé záznamy jsou v ní uvedeny jako řádky a části těchto záznamů jsou úhledně srovnány ve sloupcích.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Nejpoužívanější způsob, jak naplnit první DataFrame, je načtení ze souboru. Na to má Pandas sadu funkcí začínající <code>read_</code>. (Některé z nich potřebují další knihovny, viz dokumentace.)</p>\n<p>Jeden z nejpříjemnějších formátů je CSV:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [2]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">read_csv</span><span class=\"p\">(</span><span class=\"s1\">'static/actors.csv'</span><span class=\"p\">,</span> <span class=\"n\">index_col</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[2]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Případně lze tabulku vytvořit ze seznamu seznamů:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [3]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">items</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">DataFrame</span><span class=\"p\">([</span>\n <span class=\"p\">[</span><span class=\"s2\">"Book"</span><span class=\"p\">,</span> <span class=\"mi\">123</span><span class=\"p\">],</span>\n <span class=\"p\">[</span><span class=\"s2\">"Computer"</span><span class=\"p\">,</span> <span class=\"mi\">2185</span><span class=\"p\">],</span>\n<span class=\"p\">])</span>\n<span class=\"n\">items</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[3]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n <th>1</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Book</td>\n <td>123</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Computer</td>\n <td>2185</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>…nebo seznamu slovníků:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [4]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">items</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">DataFrame</span><span class=\"p\">([</span>\n <span class=\"p\">{</span><span class=\"s2\">"name"</span><span class=\"p\">:</span> <span class=\"s2\">"Book"</span><span class=\"p\">,</span> <span class=\"s2\">"price"</span><span class=\"p\">:</span> <span class=\"mi\">123</span><span class=\"p\">},</span>\n <span class=\"p\">{</span><span class=\"s2\">"name"</span><span class=\"p\">:</span> <span class=\"s2\">"Computer"</span><span class=\"p\">,</span> <span class=\"s2\">"price"</span><span class=\"p\">:</span> <span class=\"mi\">2185</span><span class=\"p\">},</span>\n<span class=\"p\">])</span>\n<span class=\"n\">items</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[4]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>price</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Book</td>\n <td>123</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Computer</td>\n <td>2185</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>V Jupyter Notebooku se tabulka vykreslí „graficky”.\nV konzoli se vypíše textově, ale data v ní jsou stejná:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [5]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">actors</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre> name birth alive\n0 Terry 1942 True\n1 Michael 1943 True\n2 Eric 1943 True\n3 Graham 1941 False\n4 Terry 1940 True\n5 John 1939 True\n</pre>\n</div>\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Základní informace o tabulce se dají získat metodou <code>info</code>:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [6]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre><class 'pandas.core.frame.DataFrame'>\nRangeIndex: 6 entries, 0 to 5\nData columns (total 3 columns):\nname 6 non-null object\nbirth 6 non-null int64\nalive 6 non-null bool\ndtypes: bool(1), int64(1), object(1)\nmemory usage: 182.0+ bytes\n</pre>\n</div>\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Vidíme, že je to tabulka (<code>DataFrame</code>), má 6 řádků indexovaných\n(pomocí automaticky vygenerovaného indexu) od 0 do 5\na 3 sloupce: jeden s objekty, jeden s <code>int64</code> a jeden s <code>bool</code>.</p>\n<p>Tyto datové typy (<code>dtypes</code>) se doplnily automaticky podle zadaných\nhodnot. Pandas je používá hlavně pro šetření pamětí: pythonní objekt\ntypu <code>bool</code> zabírá v paměti desítky bytů, ale v <code>bool</code> sloupci\nsi každá hodnota vystačí s jedním bytem.</p>\n<p>Na rozdíl od NumPy jsou typy dynamické: když do sloupce zapíšeme „nekompatibilní”\nhodnotu, kterou Pandas neumí převést na daný typ, typ sloupce\nse automaticky zobecní.\nNěkteré automatické převody ovšem nemusí být úplně intuitivní, např. <code>None</code> na <code>NaN</code>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Sloupce</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Sloupec, neboli <code>Series</code>, je druhý základní datový typ v Pandas. Obsahuje sérii hodnot, jako seznam, ale navíc má jméno, datový typ a „index”, který jednotlivé hodnoty pojmenovává. Sloupce se dají získat vybráním z tabulky:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [7]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span> <span class=\"o\">=</span> <span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'birth'</span><span class=\"p\">]</span>\n<span class=\"n\">birth_years</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[7]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 1942\n1 1943\n2 1943\n3 1941\n4 1940\n5 1939\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [8]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">birth_years</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[8]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>pandas.core.series.Series</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [9]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">name</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[9]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>'birth'</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [10]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">index</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[10]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>RangeIndex(start=0, stop=6, step=1)</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [11]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">dtype</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[11]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>dtype('int64')</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>S informacemi ve sloupcích se dá počítat.\nZákladní aritmetické operace (jako sčítání či dělení) se sloupcem a skalární hodnotou (číslem, řetězcem, ...) provedou danou operaci nad každou hodnotou ve sloupci. Výsledek je nový sloupec:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [12]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">ages</span> <span class=\"o\">=</span> <span class=\"mi\">2016</span> <span class=\"o\">-</span> <span class=\"n\">birth_years</span>\n<span class=\"n\">ages</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[12]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 74\n1 73\n2 73\n3 75\n4 76\n5 77\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [13]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">century</span> <span class=\"o\">=</span> <span class=\"n\">birth_years</span> <span class=\"o\">//</span> <span class=\"mi\">100</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n<span class=\"n\">century</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[13]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 20\n1 20\n2 20\n3 20\n4 20\n5 20\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>To platí jak pro aritmetické operace (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>//</code>, <code>%</code>, <code>**</code>), tak pro porovnávání:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [14]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span> <span class=\"o\">></span> <span class=\"mi\">1940</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[14]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 True\n1 True\n2 True\n3 True\n4 False\n5 False\nName: birth, dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [15]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span> <span class=\"o\">==</span> <span class=\"mi\">1940</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[15]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 False\n1 False\n2 False\n3 False\n4 True\n5 False\nName: birth, dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Když sloupec nesečteme se skalární hodnotou (číslem) ale sekvencí, např. seznamem nebo dalším sloupcem, operace se provede na odpovídajících prvcích. Sloupec a druhá sekvence musí mít stejnou délku.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [16]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s1\">' (1)'</span><span class=\"p\">,</span> <span class=\"s1\">' (2)'</span><span class=\"p\">,</span> <span class=\"s1\">' (3)'</span><span class=\"p\">,</span> <span class=\"s1\">' (4)'</span><span class=\"p\">,</span> <span class=\"s1\">' (5)'</span><span class=\"p\">,</span> <span class=\"s1\">' (6)'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[16]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 Terry (1)\n1 Michael (2)\n2 Eric (3)\n3 Graham (4)\n4 Terry (5)\n5 John (6)\nName: name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Řetězcové operace se u řetězcových sloupců schovávají pod jmenným prostorem <code>str</code>:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [17]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">str</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[17]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 TERRY\n1 MICHAEL\n2 ERIC\n3 GRAHAM\n4 TERRY\n5 JOHN\nName: name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>... a operace s daty a časy (<em>datetime</em>) najdeme pod <code>dt</code>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Ze slupců jdou vybírat prvky či podsekvence podobně jako třeba ze seznamů:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [18]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[18]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>1943</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [19]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">birth_years</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[19]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>2 1943\n3 1941\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A navíc je lze vybírat pomocí sloupce typu <code>bool</code>, což vybere ty záznamy, u kterých je odpovídající hodnota <em>true</em>. Tak lze rychle vybrat hodnoty, které odpovídají nějaké podmínce:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [20]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Roky narození po roce 1940</span>\n<span class=\"n\">birth_years</span><span class=\"p\">[</span><span class=\"n\">birth_years</span> <span class=\"o\">></span> <span class=\"mi\">1940</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[20]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 1942\n1 1943\n2 1943\n3 1941\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Protože Python neumožňuje předefinovat chování operátorů <code>and</code> a <code>or</code>, logické spojení operací se tradičně dělá přes bitové operátory <code>&</code> (a) a <code>|</code> (nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [21]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Roky narození v daném rozmezí</span>\n<span class=\"n\">birth_years</span><span class=\"p\">[(</span><span class=\"n\">birth_years</span> <span class=\"o\">></span> <span class=\"mi\">1940</span><span class=\"p\">)</span> <span class=\"o\">&</span> <span class=\"p\">(</span><span class=\"n\">birth_years</span> <span class=\"o\"><</span> <span class=\"mi\">1943</span><span class=\"p\">)]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[21]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 1942\n3 1941\nName: birth, dtype: int64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Sloupce mají zabudovanou celou řadu operací, od základních (např. <code>column.sum()</code>, která bývá rychlejší než vestavěná funkce <code>sum()</code>) po roztodivné statistické specialitky. Kompletní seznam hledejte v <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html\">dokumentaci</a>. Povědomí o operacích, které sloupce umožňují, je základní znalost datového analytika.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [22]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">'Součet: '</span><span class=\"p\">,</span> <span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">())</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">'Průměr: '</span><span class=\"p\">,</span> <span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">())</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">'Medián: '</span><span class=\"p\">,</span> <span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">median</span><span class=\"p\">())</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">'Počet unikátních hodnot: '</span><span class=\"p\">,</span> <span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">nunique</span><span class=\"p\">())</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">'Koeficient špičatosti: '</span><span class=\"p\">,</span> <span class=\"n\">birth_years</span><span class=\"o\">.</span><span class=\"n\">kurtosis</span><span class=\"p\">())</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre>Součet: 11648\nPrůměr: 1941.3333333333333\nMedián: 1941.5\nPočet unikátních hodnot: 5\nKoeficient špičatosti: -1.4812500000001654\n</pre>\n</div>\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Zvláště mocná je metoda <code>apply</code>, která nám dovoluje aplikovat jakoukoli funkci na všechny hodnoty sloupce:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [23]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"s1\">''</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"nb\">reversed</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)))</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[23]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 yrreT\n1 leahciM\n2 cirE\n3 maharG\n4 yrreT\n5 nhoJ\nName: name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [24]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'alive'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">({</span><span class=\"kc\">True</span><span class=\"p\">:</span> <span class=\"s1\">'alive'</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">:</span> <span class=\"s1\">'deceased'</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[24]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 alive\n1 alive\n2 alive\n3 deceased\n4 alive\n5 alive\nName: alive, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Tabulky a vybírání prvků</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Prvky ze sloupců jdou vybírat jako u seznamů. Ale z tabulek v Pandas jde vybírat spoustou různých způsobů. Tradiční hranaté závorky plní několik funkcí najednou, takže někdy není na první pohled jasné, co jaké indexování znamená:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [25]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span> <span class=\"c1\"># Jméno sloupce</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[25]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 Terry\n1 Michael\n2 Eric\n3 Graham\n4 Terry\n5 John\nName: name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [26]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"c1\"># Interval řádků</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[26]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [27]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"p\">[[</span><span class=\"s1\">'name'</span><span class=\"p\">,</span> <span class=\"s1\">'alive'</span><span class=\"p\">]]</span> <span class=\"c1\"># Seznam sloupců</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[27]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Toto je příklad nejednoznačného chování, které zjednodušuje život datovým analytikům, pro které je knihovna Pandas primárně určena.</p>\n<p>My, coby programátoři píšící robustní kód, budeme čisté indexování (<code>[]</code>) používat <em>jen</em> pro výběr sloupců podle jména.\nPro ostatní přístup použijeme tzv. <em>indexery</em>, jako <code>loc</code> a <code>iloc</code>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3>Indexer <code>loc</code></h3>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Indexer <code>loc</code> zprostředkovává primárně <em>řádky</em>, a to podle <em>indexu</em>, tedy hlaviček tabulky. V našem příkladu jsou řádky očíslované a sloupce pojmenované, ale dále uvidíme, že v obou indexech můžou být jakékoli hodnoty.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [28]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[28]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [29]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[29]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>name Eric\nbirth 1943\nalive True\nName: 2, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Všimněte si, že <code>loc</code> není metoda: používají se s ním hranaté závorky.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Použijeme-li k indexování <em>n</em>-tici, prvním prvkem se indexují řádky a druhým sloupce – podobně jako u NumPy:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [30]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">'birth'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[30]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>1943</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Na obou pozicích může být „interval”, ale na rozdíl od klasického Pythonu jsou ve výsledku obsaženy <em>obě koncové hodnoty</em>. (S indexem, který nemusí být vždy číselný, to dává smysl.)</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [31]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"s1\">'birth'</span><span class=\"p\">:</span><span class=\"s1\">'alive'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[31]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>1940</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Když uvedeme jen jednu hodnotu, sníží se dimenzionalita – z tabulky na sloupec (případně řádek – taky Series), ze sloupce na skalární hodnotu. Porovnejte:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [32]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"s1\">'name'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[32]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>2 Eric\n3 Graham\n4 Terry\nName: name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [33]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"s1\">'name'</span><span class=\"p\">:</span><span class=\"s1\">'name'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[33]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td>Eric</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Chcete-li vybrat sloupec, na místě řádků uveďte dvojtečku – t.j. kompletní interval.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [34]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[:,</span> <span class=\"s1\">'alive'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[34]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>0 True\n1 True\n2 True\n3 False\n4 True\n5 True\nName: alive, dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Další možnost indexování je seznamem hodnot. Tím se dají řádky či sloupce vybírat, přeskupovat, nebo i duplikovat:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [35]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[:,</span> <span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">,</span> <span class=\"s1\">'alive'</span><span class=\"p\">]]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[35]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [36]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[[</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">],</span> <span class=\"p\">:]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[36]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3>Indexer <code>iloc</code></h3>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Druhý indexer, který si v krátkosti ukážeme, je <code>iloc</code>. Umí to samé co <code>loc</code>, jen nepracuje s klíčem, ale s pozicemi řádků či sloupců. Funguje tedy jako indexování v NumPy.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [37]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[37]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [38]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">iloc</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[38]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>'Terry'</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Protože <code>iloc</code> pracuje s čísly, záporná čísla a intervaly fungují jako ve standardním Pythonu:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [39]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">iloc</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[39]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>1939</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [40]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">iloc</span><span class=\"p\">[:,</span> <span class=\"mi\">0</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[40]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Indexování seznamem ale funguje jako u <code>loc</code>:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [41]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">iloc</span><span class=\"p\">[[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">],</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[41]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>alive</th>\n <th>birth</th>\n <th>name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>True</td>\n <td>1942</td>\n <td>Terry</td>\n </tr>\n <tr>\n <th>5</th>\n <td>True</td>\n <td>1939</td>\n <td>John</td>\n </tr>\n <tr>\n <th>3</th>\n <td>False</td>\n <td>1941</td>\n <td>Graham</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Jak <code>loc</code> tak <code>iloc</code> fungují i na sloupcích (Series), takže se dají kombinovat:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [42]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">iloc</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[42]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>'John'</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Indexy</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>V minulé sekci jsme naťukli indexy – jména jednotlivých sloupců nebo řádků. Teď se podívejme, co všechno s nimi lze dělat.\nNačtěte si znovu stejnou tabulku:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [43]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">read_csv</span><span class=\"p\">(</span><span class=\"s1\">'static/actors.csv'</span><span class=\"p\">,</span> <span class=\"n\">index_col</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[43]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Tato tabulka má dva klíče: jeden pro řádky, <code>index</code>, a druhý pro sloupce, který se jmenuje <code>columns</code>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [44]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">index</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[44]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>RangeIndex(start=0, stop=6, step=1)</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [45]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">columns</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[45]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>Index(['name', 'birth', 'alive'], dtype='object')</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Klíč se dá změnit tím, že do něj přiřadíme sloupec (nebo jinou sekvenci):</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [46]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">index</span> <span class=\"o\">=</span> <span class=\"n\">actors</span><span class=\"p\">[</span><span class=\"s1\">'name'</span><span class=\"p\">]</span>\n<span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[46]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Michael</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Eric</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Graham</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>John</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [47]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">index</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[47]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Potom jde pomocí tohoto klíče vyhledávat. Chceme-li vyhledávat efektivně (což dává smysl, pokud by řádků byly miliony), je dobré nejdřív tabulku podle indexu seřadit:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [48]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span> <span class=\"o\">=</span> <span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">sort_index</span><span class=\"p\">()</span>\n<span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[48]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Graham</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>John</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Michael</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [49]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[[</span><span class=\"s1\">'Eric'</span><span class=\"p\">,</span> <span class=\"s1\">'Graham'</span><span class=\"p\">]]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[49]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Graham</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Pozor ale na situaci, kdy hodnoty v klíči nejsou unikátní. To Pandas podporuje, ale chování nemusí být podle vašich představ:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [50]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Terry'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[50]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>Terry</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Trochu pokročilejší možnost, jak klíč nastavit, je metoda <code>set_index</code>. Nejčastěji se používá k přesunutí sloupců do klíče, ale v <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html\">dokumentaci</a> se dočtete i o dalších možnostech.\nPřesuňte teď do klíče dva sloupce najednou:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [51]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span> <span class=\"o\">=</span> <span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">set_index</span><span class=\"p\">([</span><span class=\"s1\">'name'</span><span class=\"p\">,</span> <span class=\"s1\">'birth'</span><span class=\"p\">])</span>\n<span class=\"n\">indexed_actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[51]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th>birth</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <th>1943</th>\n <td>True</td>\n </tr>\n <tr>\n <th>Graham</th>\n <th>1941</th>\n <td>False</td>\n </tr>\n <tr>\n <th>John</th>\n <th>1939</th>\n <td>True</td>\n </tr>\n <tr>\n <th>Michael</th>\n <th>1943</th>\n <td>True</td>\n </tr>\n <tr>\n <th rowspan=\"2\" valign=\"top\">Terry</th>\n <th>1942</th>\n <td>True</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Vznikl tím víceúrovňový klíč:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [52]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">index</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[52]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],\n labels=[[0, 1, 2, 3, 4, 4], [4, 2, 0, 4, 3, 1]],\n names=['name', 'birth'])</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Řádky z tabulky s víceúrovňovým klíčem se dají vybírat buď postupně po jednotlivých úrovních, nebo <em>n</em>-ticí:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [53]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Terry'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[53]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>alive</th>\n </tr>\n <tr>\n <th>birth</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1942</th>\n <td>True</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [54]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Terry'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"mi\">1940</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[54]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>alive True\nName: 1940, dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [55]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[(</span><span class=\"s1\">'Terry'</span><span class=\"p\">,</span> <span class=\"mi\">1942</span><span class=\"p\">)]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[55]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>alive True\nName: (Terry, 1942), dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Kromě výběru dat mají klíče i jinou vlastnost: přidáme-li do tabulky nový sloupec s klíčem, jednotlivé řádky se seřadí podle něj:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [56]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[56]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>alive</th>\n </tr>\n <tr>\n <th>name</th>\n <th>birth</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <th>1943</th>\n <td>True</td>\n </tr>\n <tr>\n <th>Graham</th>\n <th>1941</th>\n <td>False</td>\n </tr>\n <tr>\n <th>John</th>\n <th>1939</th>\n <td>True</td>\n </tr>\n <tr>\n <th>Michael</th>\n <th>1943</th>\n <td>True</td>\n </tr>\n <tr>\n <th rowspan=\"2\" valign=\"top\">Terry</th>\n <th>1942</th>\n <td>True</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [57]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">last_names</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">Series</span><span class=\"p\">([</span><span class=\"s1\">'Gilliam'</span><span class=\"p\">,</span> <span class=\"s1\">'Jones'</span><span class=\"p\">,</span> <span class=\"s1\">'Cleveland'</span><span class=\"p\">],</span>\n <span class=\"n\">index</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">'Terry'</span><span class=\"p\">,</span> <span class=\"mi\">1940</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"s1\">'Terry'</span><span class=\"p\">,</span> <span class=\"mi\">1942</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"s1\">'Carol'</span><span class=\"p\">,</span> <span class=\"mi\">1942</span><span class=\"p\">)])</span>\n<span class=\"n\">last_names</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[57]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>(Terry, 1940) Gilliam\n(Terry, 1942) Jones\n(Carol, 1942) Cleveland\ndtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [58]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"p\">[</span><span class=\"s1\">'last_name'</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">last_names</span>\n<span class=\"n\">indexed_actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[58]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>alive</th>\n <th>last_name</th>\n </tr>\n <tr>\n <th>name</th>\n <th>birth</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <th>1943</th>\n <td>True</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>Graham</th>\n <th>1941</th>\n <td>False</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>John</th>\n <th>1939</th>\n <td>True</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>Michael</th>\n <th>1943</th>\n <td>True</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th rowspan=\"2\" valign=\"top\">Terry</th>\n <th>1942</th>\n <td>True</td>\n <td>Jones</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n <td>Gilliam</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>NaN neboli NULL či N/A</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>V posledním příkladu vidíme, že Pandas doplňuje za neznámé hodnoty <code>NaN</code>, tedy "Not a Number" – hodnotu, která plní podobnou funkci jako <code>NULL</code> v SQL nebo <code>None</code> v Pythonu. Znamená, že daná informace chybí, není k dispozici nebo ani nedává smysl ji mít. Naprostá většina operací s <code>NaN</code> dává opět <code>NaN</code>:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [59]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"s1\">'('</span> <span class=\"o\">+</span> <span class=\"n\">indexed_actors</span><span class=\"p\">[</span><span class=\"s1\">'last_name'</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"s1\">')'</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[59]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>name birth\nEric 1943 NaN\nGraham 1941 NaN\nJohn 1939 NaN\nMichael 1943 NaN\nTerry 1942 (Jones)\n 1940 (Gilliam)\nName: last_name, dtype: object</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>NaN se chová divně i při porovnávání; <code>(NaN == NaN)</code> je nepravda. Pro zjištění chybějících hodnot máme metodu <code>isnull()</code>:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [60]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"p\">[</span><span class=\"s1\">'last_name'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">isnull</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[60]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>name birth\nEric 1943 True\nGraham 1941 True\nJohn 1939 True\nMichael 1943 True\nTerry 1942 False\n 1940 False\nName: last_name, dtype: bool</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Abychom se <code>NaN</code> zbavili, máme dvě možnosti. Buď je zaplníme pomocí metody <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html\"><code>fillna</code></a> hodnotou jako <code>0</code>, <code>False</code> nebo, pro přehlednější výpis, prázdným řetězcem:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [61]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">fillna</span><span class=\"p\">(</span><span class=\"s1\">''</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[61]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>alive</th>\n <th>last_name</th>\n </tr>\n <tr>\n <th>name</th>\n <th>birth</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Eric</th>\n <th>1943</th>\n <td>True</td>\n <td></td>\n </tr>\n <tr>\n <th>Graham</th>\n <th>1941</th>\n <td>False</td>\n <td></td>\n </tr>\n <tr>\n <th>John</th>\n <th>1939</th>\n <td>True</td>\n <td></td>\n </tr>\n <tr>\n <th>Michael</th>\n <th>1943</th>\n <td>True</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan=\"2\" valign=\"top\">Terry</th>\n <th>1942</th>\n <td>True</td>\n <td>Jones</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n <td>Gilliam</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Nebo se můžeme zbavit všech řádků, které nějaký <code>NaN</code> obsahují:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [62]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed_actors</span><span class=\"o\">.</span><span class=\"n\">dropna</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[62]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>alive</th>\n <th>last_name</th>\n </tr>\n <tr>\n <th>name</th>\n <th>birth</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th rowspan=\"2\" valign=\"top\">Terry</th>\n <th>1942</th>\n <td>True</td>\n <td>Jones</td>\n </tr>\n <tr>\n <th>1940</th>\n <td>True</td>\n <td>Gilliam</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Bohužel existuje jistá nekonzistence mezi <code>NaN</code> a slovy <code>null</code> či <code>na</code> v názvech funkcí. <em>C'est la vie.</em></p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Merge</h2>\n<p>Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají <code>DataFrame</code> metodu <code>merge()</code>, která umí podobné operace jako <code>JOIN</code> v SQL.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [63]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">read_csv</span><span class=\"p\">(</span><span class=\"s1\">'static/actors.csv'</span><span class=\"p\">,</span> <span class=\"n\">index_col</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"n\">actors</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[63]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n </tr>\n <tr>\n <th>5</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [64]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">spouses</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">read_csv</span><span class=\"p\">(</span><span class=\"s1\">'static/spouses.csv'</span><span class=\"p\">,</span> <span class=\"n\">index_col</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"n\">spouses</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[64]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>spouse_name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Graham</td>\n <td>1941</td>\n <td>David Sherlock</td>\n </tr>\n <tr>\n <th>1</th>\n <td>John</td>\n <td>1939</td>\n <td>Connie Booth</td>\n </tr>\n <tr>\n <th>2</th>\n <td>John</td>\n <td>1939</td>\n <td>Barbara Trentham</td>\n </tr>\n <tr>\n <th>3</th>\n <td>John</td>\n <td>1939</td>\n <td>Alyce Eichelberger</td>\n </tr>\n <tr>\n <th>4</th>\n <td>John</td>\n <td>1939</td>\n <td>Jennifer Wade</td>\n </tr>\n <tr>\n <th>5</th>\n <td>Terry</td>\n <td>1940</td>\n <td>Maggie Westo</td>\n </tr>\n <tr>\n <th>6</th>\n <td>Eric</td>\n <td>1943</td>\n <td>Lyn Ashley</td>\n </tr>\n <tr>\n <th>7</th>\n <td>Eric</td>\n <td>1943</td>\n <td>Tania Kosevich</td>\n </tr>\n <tr>\n <th>8</th>\n <td>Terry</td>\n <td>1942</td>\n <td>Alison Telfer</td>\n </tr>\n <tr>\n <th>9</th>\n <td>Terry</td>\n <td>1942</td>\n <td>Anna Söderström</td>\n </tr>\n <tr>\n <th>10</th>\n <td>Michael</td>\n <td>1943</td>\n <td>Helen Gibbins</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [65]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">actors</span><span class=\"o\">.</span><span class=\"n\">merge</span><span class=\"p\">(</span><span class=\"n\">spouses</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[65]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>name</th>\n <th>birth</th>\n <th>alive</th>\n <th>spouse_name</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n <td>Alison Telfer</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Terry</td>\n <td>1942</td>\n <td>True</td>\n <td>Anna Söderström</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Michael</td>\n <td>1943</td>\n <td>True</td>\n <td>Helen Gibbins</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n <td>Lyn Ashley</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Eric</td>\n <td>1943</td>\n <td>True</td>\n <td>Tania Kosevich</td>\n </tr>\n <tr>\n <th>5</th>\n <td>Graham</td>\n <td>1941</td>\n <td>False</td>\n <td>David Sherlock</td>\n </tr>\n <tr>\n <th>6</th>\n <td>Terry</td>\n <td>1940</td>\n <td>True</td>\n <td>Maggie Westo</td>\n </tr>\n <tr>\n <th>7</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n <td>Connie Booth</td>\n </tr>\n <tr>\n <th>8</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n <td>Barbara Trentham</td>\n </tr>\n <tr>\n <th>9</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n <td>Alyce Eichelberger</td>\n </tr>\n <tr>\n <th>10</th>\n <td>John</td>\n <td>1939</td>\n <td>True</td>\n <td>Jennifer Wade</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Mají-li spojované tabulky sloupce stejných jmen, Pandas je spojí podle těchto sloupců. V <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html\">dokumentaci</a> se dá zjistit, jak explicitně určit podle kterých klíčů spojovat, co udělat když v jedné z tabulek chybí odpovídající hodnoty apod.</p>\n<p>Fanoušky SQL ještě odkážu na <a href=\"http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html\">porovnání mezi SQL a Pandas</a>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Přesýpání dat</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Dostáváme se do bodu, kdy nám jednoduchá tabulka přestává stačit. Pojďme si vytvořit tabulku větší: fiktivních prodejů v e-shopu, ve formátu jaký bychom mohli dostat z SQL databáze nebo datového souboru.</p>\n<p>Použijeme k tomu mimo jiné <code>date_range</code>, která vytváří kalendářní intervaly. Zde, i v jiných případech, kdy je jasné, že se má nějaká hodnota interpretovat jako datum, nám Pandas dovolí místo objektů <code>datetime</code> zadávat data řetězcem:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [66]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">itertools</span>\n<span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">seed</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n<span class=\"n\">months</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">date_range</span><span class=\"p\">(</span><span class=\"s1\">'2015-01'</span><span class=\"p\">,</span> <span class=\"s1\">'2016-12'</span><span class=\"p\">,</span> <span class=\"n\">freq</span><span class=\"o\">=</span><span class=\"s1\">'M'</span><span class=\"p\">)</span>\n<span class=\"n\">categories</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'Electronics'</span><span class=\"p\">,</span> <span class=\"s1\">'Power Tools'</span><span class=\"p\">,</span> <span class=\"s1\">'Clothing'</span><span class=\"p\">]</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">DataFrame</span><span class=\"p\">([{</span><span class=\"s1\">'month'</span><span class=\"p\">:</span> <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"s1\">'category'</span><span class=\"p\">:</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"s1\">'sales'</span><span class=\"p\">:</span> <span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1000</span><span class=\"p\">,</span> <span class=\"mi\">10000</span><span class=\"p\">)}</span>\n <span class=\"k\">for</span> <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span> <span class=\"ow\">in</span> <span class=\"n\">itertools</span><span class=\"o\">.</span><span class=\"n\">product</span><span class=\"p\">(</span><span class=\"n\">months</span><span class=\"p\">,</span> <span class=\"n\">categories</span><span class=\"p\">)</span>\n <span class=\"k\">if</span> <span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"mi\">20</span><span class=\"p\">)</span> <span class=\"o\">></span> <span class=\"mi\">0</span><span class=\"p\">])</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Tabulka je celkem dlouhá (i když v analýze dat bývají ještě delší). Podívejme se na několik obecných informací:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [67]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)</span>\n<span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">head</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[67]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>category</th>\n <th>month</th>\n <th>sales</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Electronics</td>\n <td>2015-01-31</td>\n <td>5890</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Power Tools</td>\n <td>2015-01-31</td>\n <td>3242</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Clothing</td>\n <td>2015-01-31</td>\n <td>6961</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Electronics</td>\n <td>2015-02-28</td>\n <td>3969</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Power Tools</td>\n <td>2015-02-28</td>\n <td>4866</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [68]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Celkový počet řádků</span>\n<span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[68]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>67</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [69]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"s1\">'sales'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">describe</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[69]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>count 67.000000\nmean 4795.552239\nstd 3101.026552\nmin -735.000000\n25% 2089.000000\n50% 4448.000000\n75% 7874.000000\nmax 9817.000000\nName: sales, dtype: float64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Pomocí <code>set_index</code> nastavíme, které sloupce budeme brát jako hlavičky:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [70]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">indexed</span> <span class=\"o\">=</span> <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">set_index</span><span class=\"p\">([</span><span class=\"s1\">'category'</span><span class=\"p\">,</span> <span class=\"s1\">'month'</span><span class=\"p\">])</span>\n<span class=\"n\">indexed</span><span class=\"o\">.</span><span class=\"n\">head</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[70]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>sales</th>\n </tr>\n <tr>\n <th>category</th>\n <th>month</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Electronics</th>\n <th>2015-01-31</th>\n <td>5890</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <th>2015-01-31</th>\n <td>3242</td>\n </tr>\n <tr>\n <th>Clothing</th>\n <th>2015-01-31</th>\n <td>6961</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <th>2015-02-28</th>\n <td>3969</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <th>2015-02-28</th>\n <td>4866</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Budeme-li chtít z těchto dat vytvořit tabulku, která má v řádcích kategorie a ve sloupcích měsíce, můžeme využít metodu <code>unstack</code>, která "přesune" vnitřní úroveň indexu řádků do sloupců a uspořádá podle toho i data.</p>\n<p>Můžeme samozřejmě použít kteroukoli úroveň klíče; viz <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.unstack.html\">dokumentace</a> k <code>unstack</code> a reverzní operaci <a href=\"http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.stack.html\"><code>stack</code></a>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [71]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span> <span class=\"o\">=</span> <span class=\"n\">indexed</span><span class=\"o\">.</span><span class=\"n\">unstack</span><span class=\"p\">(</span><span class=\"s1\">'month'</span><span class=\"p\">)</span>\n<span class=\"n\">unstacked</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[71]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead tr th {\n text-align: left\n }\n.lesson-content .dataframe thead tr:last-of-type th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th colspan=\"21\" halign=\"left\">sales</th>\n </tr>\n <tr>\n <th>month</th>\n <th>2015-01-31</th>\n <th>2015-02-28</th>\n <th>2015-03-31</th>\n <th>2015-04-30</th>\n <th>2015-05-31</th>\n <th>2015-06-30</th>\n <th>2015-07-31</th>\n <th>2015-08-31</th>\n <th>2015-09-30</th>\n <th>2015-10-31</th>\n <th>...</th>\n <th>2016-02-29</th>\n <th>2016-03-31</th>\n <th>2016-04-30</th>\n <th>2016-05-31</th>\n <th>2016-06-30</th>\n <th>2016-07-31</th>\n <th>2016-08-31</th>\n <th>2016-09-30</th>\n <th>2016-10-31</th>\n <th>2016-11-30</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Clothing</th>\n <td>6961.0</td>\n <td>2578.0</td>\n <td>9131.0</td>\n <td>618.0</td>\n <td>4796.0</td>\n <td>8052.0</td>\n <td>7989.0</td>\n <td>NaN</td>\n <td>31.0</td>\n <td>7896.0</td>\n <td>...</td>\n <td>4194.0</td>\n <td>2059.0</td>\n <td>471.0</td>\n <td>5410.0</td>\n <td>8663.0</td>\n <td>9817.0</td>\n <td>6969.0</td>\n <td>-735.0</td>\n <td>4448.0</td>\n <td>-259.0</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <td>5890.0</td>\n <td>3969.0</td>\n <td>1281.0</td>\n <td>7725.0</td>\n <td>4409.0</td>\n <td>4180.0</td>\n <td>6253.0</td>\n <td>NaN</td>\n <td>7086.0</td>\n <td>8298.0</td>\n <td>...</td>\n <td>6290.0</td>\n <td>2966.0</td>\n <td>9039.0</td>\n <td>1450.0</td>\n <td>3515.0</td>\n <td>8497.0</td>\n <td>349.0</td>\n <td>9324.0</td>\n <td>919.0</td>\n <td>18.0</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>3242.0</td>\n <td>4866.0</td>\n <td>1289.0</td>\n <td>1407.0</td>\n <td>8171.0</td>\n <td>9492.0</td>\n <td>3267.0</td>\n <td>5534.0</td>\n <td>2996.0</td>\n <td>2909.0</td>\n <td>...</td>\n <td>8769.0</td>\n <td>2012.0</td>\n <td>6807.0</td>\n <td>314.0</td>\n <td>2858.0</td>\n <td>6382.0</td>\n <td>9039.0</td>\n <td>2119.0</td>\n <td>5095.0</td>\n <td>1397.0</td>\n </tr>\n </tbody>\n</table>\n<p>3 rows × 23 columns</p>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Teď je sloupcový klíč dvouúrovňový, ale úroveň <code>sales</code> je zbytečná. Můžeme se jí zbavit pomocí <a href=\"http://pandas.pydata.org/pandas-docs/version/0.18.0/generated/pandas.MultiIndex.droplevel.html\"><code>MultiIndex.droplevel</code></a>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [72]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">columns</span> <span class=\"o\">=</span> <span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">columns</span><span class=\"o\">.</span><span class=\"n\">droplevel</span><span class=\"p\">()</span>\n<span class=\"n\">unstacked</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[72]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th>month</th>\n <th>2015-01-31 00:00:00</th>\n <th>2015-02-28 00:00:00</th>\n <th>2015-03-31 00:00:00</th>\n <th>2015-04-30 00:00:00</th>\n <th>2015-05-31 00:00:00</th>\n <th>2015-06-30 00:00:00</th>\n <th>2015-07-31 00:00:00</th>\n <th>2015-08-31 00:00:00</th>\n <th>2015-09-30 00:00:00</th>\n <th>2015-10-31 00:00:00</th>\n <th>...</th>\n <th>2016-02-29 00:00:00</th>\n <th>2016-03-31 00:00:00</th>\n <th>2016-04-30 00:00:00</th>\n <th>2016-05-31 00:00:00</th>\n <th>2016-06-30 00:00:00</th>\n <th>2016-07-31 00:00:00</th>\n <th>2016-08-31 00:00:00</th>\n <th>2016-09-30 00:00:00</th>\n <th>2016-10-31 00:00:00</th>\n <th>2016-11-30 00:00:00</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Clothing</th>\n <td>6961.0</td>\n <td>2578.0</td>\n <td>9131.0</td>\n <td>618.0</td>\n <td>4796.0</td>\n <td>8052.0</td>\n <td>7989.0</td>\n <td>NaN</td>\n <td>31.0</td>\n <td>7896.0</td>\n <td>...</td>\n <td>4194.0</td>\n <td>2059.0</td>\n <td>471.0</td>\n <td>5410.0</td>\n <td>8663.0</td>\n <td>9817.0</td>\n <td>6969.0</td>\n <td>-735.0</td>\n <td>4448.0</td>\n <td>-259.0</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <td>5890.0</td>\n <td>3969.0</td>\n <td>1281.0</td>\n <td>7725.0</td>\n <td>4409.0</td>\n <td>4180.0</td>\n <td>6253.0</td>\n <td>NaN</td>\n <td>7086.0</td>\n <td>8298.0</td>\n <td>...</td>\n <td>6290.0</td>\n <td>2966.0</td>\n <td>9039.0</td>\n <td>1450.0</td>\n <td>3515.0</td>\n <td>8497.0</td>\n <td>349.0</td>\n <td>9324.0</td>\n <td>919.0</td>\n <td>18.0</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>3242.0</td>\n <td>4866.0</td>\n <td>1289.0</td>\n <td>1407.0</td>\n <td>8171.0</td>\n <td>9492.0</td>\n <td>3267.0</td>\n <td>5534.0</td>\n <td>2996.0</td>\n <td>2909.0</td>\n <td>...</td>\n <td>8769.0</td>\n <td>2012.0</td>\n <td>6807.0</td>\n <td>314.0</td>\n <td>2858.0</td>\n <td>6382.0</td>\n <td>9039.0</td>\n <td>2119.0</td>\n <td>5095.0</td>\n <td>1397.0</td>\n </tr>\n </tbody>\n</table>\n<p>3 rows × 23 columns</p>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A teď můžeme data analyzovat. Kolik se celkem utratilo za elektroniku?</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [73]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Electronics'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[73]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>103742.0</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Jak to vypadalo se všemi elektrickými zařízeními v třech konkrétních měsících?</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [74]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[[</span><span class=\"s1\">'Electronics'</span><span class=\"p\">,</span> <span class=\"s1\">'Power Tools'</span><span class=\"p\">],</span> <span class=\"s1\">'2016-03'</span><span class=\"p\">:</span><span class=\"s1\">'2016-05'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[74]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th>month</th>\n <th>2016-03-31 00:00:00</th>\n <th>2016-04-30 00:00:00</th>\n <th>2016-05-31 00:00:00</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Electronics</th>\n <td>2966.0</td>\n <td>9039.0</td>\n <td>1450.0</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>2012.0</td>\n <td>6807.0</td>\n <td>314.0</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A jak se prodávalo oblečení?</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [75]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Clothing'</span><span class=\"p\">]</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[75]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>month\n2015-01-31 6961.0\n2015-02-28 2578.0\n2015-03-31 9131.0\n2015-04-30 618.0\n2015-05-31 4796.0\n2015-06-30 8052.0\n2015-07-31 7989.0\n2015-08-31 NaN\n2015-09-30 31.0\n2015-10-31 7896.0\n2015-11-30 7016.0\n2015-12-31 7969.0\n2016-01-31 8627.0\n2016-02-29 4194.0\n2016-03-31 2059.0\n2016-04-30 471.0\n2016-05-31 5410.0\n2016-06-30 8663.0\n2016-07-31 9817.0\n2016-08-31 6969.0\n2016-09-30 -735.0\n2016-10-31 4448.0\n2016-11-30 -259.0\nName: Clothing, dtype: float64</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Metody <code>stack</code> a <code>unstack</code> jsou sice asi nejužitečnější, ale stále jen jeden ze způsobů jak v Pandas tabulky přeskládávat. Náročnější studenti najdou další možnosti v <a href=\"http://pandas.pydata.org/pandas-docs/stable/reshaping.html\">dokumentaci</a>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Grafy</h2>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Je-li nainstalována knihovna <code>matplotlib</code>, Pandas ji umí využít k tomu, aby kreslil grafy. Nastavení je trochu jiné pro Jupyter Notebook a pro příkazovou řádku.</p>\n<p>Používáte-li Jupyter Notebook, zapněte integraci pro kreslení grafů pomocí:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [76]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">matplotlib</span>\n\n<span class=\"c1\"># Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):</span>\n<span class=\"o\">%</span><span class=\"k\">matplotlib</span> inline\n</pre></div>\n\n</div>\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>a pak můžete přímo použít metodu <code>plot()</code>, která bez dalších argumentů vynese data z tabulky proti indexu:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [77]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Clothing'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">dropna</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[77]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre><matplotlib.axes._subplots.AxesSubplot at 0x7f0a2809f9b0></pre>\n</div>\n\n</div>\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n\n\n<div class=\"output_png output_subarea \">\n<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYgAAAEICAYAAABF82P+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztnXl4W3eZ7z+vZFnyIsnxqsR2kmax0zZ1WpouUJYulGUGaJlhKcNAWYbOwzKslztlLlwYmIW5MwNchoGZMnRoGaBwyzodttKWYU2aNG3Tpm1sx0ljJ/Hu2JJt2Zb0u3+cc2zF8aLlSDqSfp/n8WPp6OjotXyk7/m9qyil0Gg0Go1mOa5CG6DRaDQaZ6IFQqPRaDQrogVCo9FoNCuiBUKj0Wg0K6IFQqPRaDQrogVCo9FoNCuiBUKj0Wg0K6IFQqPRaDQrogVCo9FoNCtSUWgDsqGxsVFt3bq10GZoNBpN0fDII4+MKqWaUtm3qAVi69atHDx4sNBmaDQaTdEgIs+muq92MWk0Go1mRVISCBG5U0SGReTJpG31InK/iPSYvzeY20VEPi8ivSJyWESek/ScW839e0Tk1qTtl4vIE+ZzPi8iYucfqdFoNJr0SXUF8VXgZcu23Q48oJTaCTxg3gd4ObDT/LkN+BIYggJ8HLgKuBL4uCUq5j7vSHre8tfSaDQaTZ5JSSCUUr8Expdtvgm4y7x9F3Bz0va7lcE+oE5ENgIvBe5XSo0rpSaA+4GXmY8FlFL7lNF7/O6kY2k0Go2mQGQTg2hRSp0xbw8CLebtVqA/ab8Bc9ta2wdW2L4iInKbiBwUkYMjIyNZmK/RaDSatbAlSG1e+edl8pBS6g6l1F6l1N6mppQytTQajUaTAdkIxJDpHsL8PWxuPwW0J+3XZm5ba3vbCts1Go0mIw6dnGByZqHQZhQ92QjEDwErE+lW4AdJ299sZjNdDUyarqifAi8RkQ1mcPolwE/Nx6ZE5Goze+nNScfSaDSatPhN7yh/+KXf8rkHugttStGTaprrN4HfAZ0iMiAibwc+DdwoIj3Ai837AD8C+oBe4MvAuwCUUuPAp4AD5s8nzW2Y+/yb+ZxjwI+z/9M0Gk25MRaZ4wPfegyl4IGnhzG835pMSamSWin1hlUeumGFfRXw7lWOcydw5wrbDwK7U7FFo9FoVkIpxYfvPczZmQX++OrN/Me+kxwbmWZHc22hTStadCW1RqMpCe767QkefGaYj/zeLt557Q4AHnpmeJ1nadZCC4RGoyl6njo9xd/86Bmu39XMW563lda6KnaF/DzwzFChTStqtEBoNJqiZnY+zp998xB11R7+/jVdWJ16rtvVzMETE0xFdTZTpmiB0Gg0Rc0n73uKvtFpPvO6S2mo9S5uv35XM7GE4lfdowW0rrjRAqHRaIqWHz1xhm8+fJI/feF2nr+z8ZzHLmuvI1jl4UEdh8gYLRAajaYoOXV2ltu/c5g9bUE+9JKO8x6vcLt4UUcT/909TCKh010zQQuERqMpOmLxBO+/51ESCj7/hsvwuFf+KrvhwmZGI/McPjWZZwtLAy0QGo2m6PjCQ70cODHBp26+mC0NNavu96KOJlyCdjNliBaIHKKU4i++9wSPPLu8U7pGo8mUh4+P8/kHeviDy1p59WVta+5bV13JczZv0PUQGaIFIoeMTc/zjf0n+dkRnYut0djB5MwC77/nUdrrq/nkzak1X7huVzNPnJpkeCqaY+tKDy0QOaR/fAaA4fBcgS3RaIofpRS3f/cww+E5Pn/LZdR6U+oUxPW7mgF46KheRaSLFogc0j8xC8CIFgiNJmvuOdDPj58c5H+8tJM97XUpP29XyM/GoE/HITJAC0QOGZgwVhBaIDSa7OgdDvOX/3mE5+9o5LYXbEvruSLCdbua+XXPKHOxeI4sLE20QOSQ/nFjBTEc1r5PjSZTogtx3vONR6murOAzr9uDyyVpH+P6zmam5+McOD6RAwtLFy0QOcRaQUzMLDAfSxTYGo2mOPn0j5/hmcEw//jaPTQHfBkd45odjXgrXNrNlCZaIHLIgBmDABib1m4mjSZdHnh6iK/+9gRvvWYr15nB5kyoqnTz3O0NOlCdJlogckQioTg1MctOc1jJ8JQWCM3aDIejTEzPF9oMxzA9F+PD9x7mwo0Bbn/5rqyPd/2uZo6PTtM3ErHBuvJAC0SOGApHmY8nuGyzkW2hA9WatfjBY6d40f/5Bf/zO4cLbYpjOHBinPHpeT7y8l14K9xZH++6TmMFot1MqaMFIkdY7qXLt2wAYCSiBUJzPgvxBJ+67yned89jLMQTPN5/ttAmOYZ9feN43MLerRtsOV57fTU7m2u1mykNtEDkCKtI7tJ24+TWLibNckbCc7zx3/bzlV8f5y3P28oHbuxgODzHuHYzAbD/+Bh72uqorkytIC4Vrt/VzMPHx4nMxWw7ZimjBSJHWCmuWxqq2VDtYSSiU101Szzy7ASv+KdfcXjgLJ97/aV84lUXs7s1CMAzg1MFtq7wTM/FODwwyVXb6m097nW7mlmIK37dM2LrcUsVLRA5YmBihpaAF5/HTZPfq2MQGsBoF/G1fc9yyx2/w1vh5rvvvIabL2sF4MKQH4Cjg+FCmugIDj47QTyhuHpbg63HvXzLBvy+Ch2HSBH71m6ac+ifmKF9QzUAzX6f7sekIboQ539970m+c2iA6zqb+NzrLyNY7Vl8vMnvZUO1RwsEsL9vjAqXLMbw7MJjDhF66OgIiYTKqOiunNAriBzRPz5L24YqAL2C0NA/PsMffum3fOfQAO+7YSdfufWKc8QBjJYQnSE/z2iBYF/fGF1tQVvjDxbX72pmJDzHkdPalbceWQuEiHxARI6IyJMi8k0R8YnIBSKyX0R6ReRbIlJp7us17/eaj29NOs5HzO1HReSl2dpVSGLxBINTUdrrjRWEJRBK6bGH5cgvu0d45Rd+zcnxGb5y614+cGPHqleuu0IBuofCZT0ic2beiD/Y7V6yeFFHE6KHCKVEVgIhIq3Ae4G9SqndgBu4Bfg74LNKqR3ABPB28ylvBybM7Z8190NELjKfdzHwMuCLIpJ94nOBODMZJZ5QSS4mL3OxBFNRnTlRTiil+OeHern13x+mxe/jP9/zfG64sGXN53SG/MzMx+k327SUI488O0EsB/EHi4ZaL5e21/HgM3pOy3rYsX6rAKpEZAGoBs4A1wN/ZD5+F/AJ4EvATeZtgHuBL4iImNvvUUrNAcdFpBe4EvidDfblHSvFNdnFBEZaY7DKs+rzCsVj/We57/HTBKs8bKipZEN1JRuqPdRVV1JfU0ldtQefp2j1uiCEowt86NuP87Onhnjlnk383R9ekpK7pNMMVD8zGF5zlGYps69vDHcO4g/JXN/ZzD/e381IeG7x86k5n6wEQil1SkT+ATgJzAI/Ax4BziqlrMvlAaDVvN0K9JvPjYnIJNBgbt+XdOjk5xQdVpHcooupdkkgdpitN5zEZ+7v5pfda6f9VXnci2Kxodr4XV9Tye7WIK/b254nS4uDnqEwf/q1R3h2fIaPveIi3nbNVozroPXpbFnKZHrpxaFcmulY9vWN09UWpCbFgUCZcN0uQyB+cXSY1+rzd1Wy+g+IyAaMq/8LgLPA/8NwEeUMEbkNuA1g8+bNuXypjOmfmMHtEjYGjc6TzQFDIJzY9nshnuDgiXHedPUWPvqKC5mcWWB8Zp6J6QXOzswzMbPAxMw8E9NJt2fmOXV2lpHwHHf/7lleelHovIBrudI7HOY1//I7PG7h639yVdpukhpvBZvrq8s2k8mIP5zlT9Kc+ZAuF28K0BLw8pAWiDXJVqJfDBxXSo0AiMh3gWuAOhGpMFcRbcApc/9TQDswICIVQBAYS9pukfycc1BK3QHcAbB3715HRvL6x2cIBXxUuI0QT1OtIRROzGR68tQkM/Nxrt7WgLfCTXPAnXJL5d/0jvLGf9vP4VNnecHOphxbmjlf+sUxftUzwh1v3pvymMpMGA5HufXOA3jcLr77zuexuaE6o+MYmUzlmWFz6NmzLMQVV11gb4HcckSE63c1c9/jZ1iIJ/C4dULnSmT7rpwErhaRajOWcAPwFPAQ8Bpzn1uBH5i3f2jex3z8QWWk9vwQuMXMcroA2Ak8nKVtBWNgYpb2+qrF+4GqCiorXI7sx7Svbxwgo4pVq/L38MCkrTbZza97R/jtsTFuu/tgziaKTc/FeNtXDzA+Pc+db9mbsTiAMSLzxNgM0YXym35mxR/2bs2tQIDRvC88F+PAifGcv1axkpVAKKX2YwSbDwFPmMe7A/hz4INmsLkB+Ir5lK8ADeb2DwK3m8c5AnwbQ1x+ArxbKVW0n47kIjkwrlaaar2MOLAf076+MXY019JYm36gLljlYVtjjeMbzA1ORmkJePntsTHef89jxG1OIY3FE7znG4d46vQUX/ijy+hqS31e8kp0hvzEE4re4fJrS73/+BiXtAZzutKzuGZHI5VuFw/pdNdVyXpdpZT6uFJql1Jqt1LqTUqpOaVUn1LqSqXUDqXUa83sJJRSUfP+DvPxvqTj/LVSartSqlMp9eNs7SoU0YU4Q1NztG049wqyye913AoiZsYfrs6i301XW9DxK4ihqTlevnsjH/39C/nxk4N89PtP2laTopTiYz84wkNHR/jUzbvXTWNNhV1JmUzlxOx8nMf6z9ref2k1arwVXLWtnge0QKyKdrzZzOmzVgZT1TnbnVhN/eTpKabn41x1Qeb55pe01TE4FWV4ynkBeDDSTSNzMTYGffzJC7bxrmu3882HT/IPPztqy/G/+ItjfPPhk7zz2u288aotthxza0MNlRUujpZZHOLQyQkW4rmrf1iJ63c10zcyzbNj03l7zWJCC4TN9C9LcbVo9nsd149pf98YkFn8wWJPmxGHeNyhq4ghU7hCZkbZh1/ayRuubOefHzrGV359PKtjf//RU/z9T49y06Wb+PBLOrO21aLC7WJnc23ZrSD2W/GHHNY/LOf6XXqI0FpogbCZ5UVyFk1+L+PT8yzEE4Uwa0X29Y2xvamGZn9mg+ABLt4UxO0SDg84Mw4xOGmIcouZmSUi/NXNl/Cyi0N86r6n+O6hgYyO+9tjo3z43se5els9/+c1XbY3fesM+csu1XVf3zi7NwXw+/KXMr2loYZtTTVaIFZBC4TNDEzMUul20bLsS9eq1hyLOGMYTCye4MCJCa7KcjlfVelmZ3OtY1cQg9YKIil11+0SPnfLpTxvewMfvvcwDzydXsuFo4NGIdzWhhr+9U17bRmHuZxdIT/D4bmymVEdXTDiD/l0L1lc39nM/r5xpvUQofPQAmEz/RMztG6oOu+K0rpKd0qx3FNnpojMxWz5QO5pq+PwwFlHNiNc7mKy8Hnc3PHmvVy0McC7vn4o5VTHoakob/33h6nyuPnq267MWeuUzlAAKJ9A9aGTE8zHE4URiAubmY8n+E3vaN5f2+logbCZgfGZ89xLcG4/Jiewz4w/XG1DQVJXe5CzMwuLLUacxJnJ2VV7SdV6K/jqW6+gta6Kt331AE+fWTsoHJmL8dZ/P8Dk7AJ3vsV4Xq5YymQqj0D1vr5xXIJt86fT4Yqt9fi9FXpW9QpogbCZgYnZ81JcwXkCsb9vnG2NNSlXTa/FHjPv/3EHxiEGJ+fOcS8tp6HWy91vv5KaygrefOfDnBxbuYvqQjzBu75+iKNDYf75jc9ZLBLMFc1+L3VlNDxof98Yu1uDeY0/WHjcLl7Q0ciDzww7chVcSLRA2Mj0XIyx6fnzUlwBGmsrARyRyRRPKB4+Pp51/MGiM+SnssLlyHqIoanoYoB6Ndo2VPO1t1/JQjzBH39l/3luQKUU/+t7T/DL7hH+5tW7ubazOZcmA0YwfVeZDA+KLsR5tEDxB4vrOpsZmtJDhJajBcJGLBfLSisIb4WbumqPI1YQT52eIjwXy6pALhmP28VFGwOOrKgenIquuYKw2Nni59/fcgWjkTluvdNwI1l8/oFevn1wgPdev4PXX5G/BpHlMjzo0ZNnmY8lct5/aS0s0ddV1eeiBcJGBswhL+0rxCDAaPvtBIHYf9ysf8iiQG45e9qCPHlq0vY2FtmwEE8wGpmjJZiaG+2yzRv4lz++nN7hMO+46yDRhTj3PjLAZ3/ezR88p5UP3NiRY4vPxRoe5MTYjp3sPz5mxh8KJxBNfi972oI8qOMQ56AFwkaWaiBWbtTWHPA6IotpX98YWxuqz8vsyYautjqm5+P0jTinf9BweA6lWGy7ngov7GjiM6+7lAPPjvNHX97H7d85zDU7Gvj0H3SlPNPBLjrLJFC9r2+MizcFCz5M67pdzTzWf5Yxh7XEKSRlKRCnzs6uGozMhv6JWao87sV4w3Kaagvfj8mKP9jt7+1yYEX14OT5NRCp8Mo9m/jkTbs5dPIsO5pr+dIfX05lRf4/Kh1Jw4NKlehCnEMnzxbUvWRx/a5mlIL/Xmd4VjlRlgLxun/5HZ+5355ePMkMTBgprqtdaVr9mAqZKfH0mSmmovbUPySzramWmkq3oyqqrRqI9YLUK/Gmq7fwjXdcxTfecTWBAmTWgJGG215fVdKB6sf7jfhDIQPUFrs3BamvqVxMAdfYM5O66OhoqeXokP2ukP7x2RVrICya/T6iCwnCc7GCfenss6H/0kq4XcLu1qAzVxAZutKet73RTnMyYlcoUNIupn1944jAFQ5YQbhcQnt9NWcmC+8GdgpluYLoCPk5NhyxvS9S/8TMeU36knFCLcT+4+NsaahmY9D+Iq897XU8fXqK+Zgz+k0NTkWprHCxoYjHoZb68KB9fWNctDFQ8PiDRSjgXVx5aspUIDpb/MzHE7a2+J2cXSAcjZ0zKGg5hRaIhFX/kKOrta62IPPxhGN85oOTRoprvoPLdlLKw4PmYnEOnZxwhHvJoiXgW1x5aspUIJaCf/Z96Fbr4pqMJRCFKpZ7ZjDM5OxCzj6QVkX14VPOiEOkWgPhZKyWG04RXTt5vH+SOYfEHyxaAj6mojFm50tzxZYuZSkQO5prcQkcHbLvQ7dYA7GGi6m5wCuIpfhDbj6QbRuq2FDt4XC/M+IQQ1PRlGsgnMri8CAbz1WnsK9vDBG4soD1D8uxLigGtZsJKFOB8HncbG2sodvGqzKrmGktF1OwyoPHLQUViPb6qpw1mRMRutrqHNGTSSllupjSn7XtJCrcLnY01a7bSLAY2X98jAtDAYIOihFZCQ3azWRQlgIBRhyi28arsv7xGfzeCgJVqyeGiQhNtYUplkskFA+fGOdqG6unV2JPW5Ce4UjBl+hnZxaYiyUI5SAYn292bSy94UFzsTiPPDuRt/nTqWKlROtAtUHZCkRHi58TY9O2ZYf0T8zSVl+9bkC0KeAryAri6FCYszMLOXMvWXS11RFPKI6cLqybaaVBQcVKKQ4POjwwSXTBWfEHSFpBaIEAylggOkN+EgrbskMGJmZW7cGUTKH6MS3On85xvrlTKqoXBSJY3C4mKM3hQfvN+IMTKqiTqfVWUOut0C4mk7IVCCuTyQ43k1LKLJJbPf5gYVVT55t9feO0bahaM4huB80BH6GAr+AV1UOTmVdRO42lTKbSiUPs6xuns8VPXfXKbWkKSYtDeqY5gbIViK0N1VS67ckOGZueZ3YhvuIciOU0+72Mz8zbXqS3FomEYv/xMVu7t65FV1uw4LMhrBVEs7/4BWJxeFCJZDLNxxIcfNb+fmB2oWshlihbgahwu9jeXGtLJlMqGUwWTX4vSsF4Hv3JPcMRJmYWbJv/sB572us4Pjp9zkyFfDM4GaWx1luQJnt2IyJ0tpTO8KAnTp11ZPzBIhTwMTSlO7qCDQIhInUicq+IPCMiT4vIc0WkXkTuF5Ee8/cGc18Rkc+LSK+IHBaR5yQd51Zz/x4RuTVbu1Khs6XWluyQxSK5FFYQi8VyeTwBF+dP5+kDacUhnijgKmJwKloS8QeLCzcGODpYGsOD9vWNA3Clw+IPFi1BH0NT0ZJ4r7PFjsur/wv8RCm1C9gDPA3cDjyglNoJPGDeB3g5sNP8uQ34EoCI1AMfB64CrgQ+bolKLukI+Tk9GWUqmt2Vbv/ioKD1VxCLxXKR/C1h9x8fo7Wuas0qbzvpai38jGqrzUapUErDg/b1jbEr5Ke+xnnxBzBWELGEYqyEssYyJSuBEJEg8ELgKwBKqXml1FngJuAuc7e7gJvN2zcBdyuDfUCdiGwEXgrcr5QaV0pNAPcDL8vGtlToNAPVPVn6dgcmZqmvqaTGu35z3Hz3Y1JKsa9vnKu21eetJ1Gw2sPWhuqCBqpTmUVdTJTK8KCFeIKDJ5zVf2k5uhZiiWxXEBcAI8C/i8ijIvJvIlIDtCilzpj7DAIt5u1WoD/p+QPmttW25xS7ejL1j8+kfHXeWJtfF1PPcITx6fmcF8gtp6utrmAupuhCnImZhZJaQZTK8KDDA5PMLsQdl96ajK6mXiJbgagAngN8SSl1GTDNkjsJAGVMx7HNmScit4nIQRE5ODKS3eSntg1V1FS6s051HZiYTcm9BEabj2CVJ2+T5fbnOf5g0dUW5PRktCApvUNT2c2BcCKLw4OKPJPJioc5Nf4Auh9TMtkKxAAwoJTab96/F0MwhkzXEeZvaxL4KaA96flt5rbVtp+HUuoOpdRepdTepqamrIwXETpC2bUxSCQUpyZmUwpQW+SzFmJf3zgbg76UUnDtZE+72dm1AG6mbAcFOZXOlkDRryD2HzfqHxpqnZtA0FhbiUtgWAtEdgKhlBoE+kWk09x0A/AU8EPAykS6FfiBefuHwJvNbKargUnTFfVT4CUissEMTr/E3JZzsu3JNByeYz6eSKlIzsLox5R7gVDKqH+4eltD3mciXLwpgEsKU1FdSm02krlwo5/jo/a1h8k3Rvxh3HH9l5ZT4XbRWOvVKwjsyWL6M+DrInIYuBT4G+DTwI0i0gO82LwP8COgD+gFvgy8C0ApNQ58Cjhg/nzS3JZzOlr8jE3PM5qhy2exzXcaGULNgfysII6NRBiNzOet/iGZ6soKOlr8BVlBLM6iLrUVRJEPD3ri1CQz83FHB6gtQkEfg7oWIvuZ1Eqpx4C9Kzx0wwr7KuDdqxznTuDObO1JFys7pHswTOOO9Je9/SnMgViO1Y9JKZXTK/vfmfnm+aqgXk5XW5CfPz2c879zOYOTc1RXuvGnkFVWTCQPD9rdGiywNemz3+H1D8m0BHycHJsptBkFp/jLTLNkMTskQzdT/7iRl57OjIUmv5fZhTiRuVhGr5kq+/vGCAV8bGnIbf+l1bikrY7x6fm85+4PTs0SChb3qNGVKPbhQfv6xtjZXLuYyedkQgGfdjGhBYLG2krqayozDv4NTMzQ7Pfi87hTfk5zIPe1EFb9w9V5rH9Yzh6zojrffZlKrUjOwhoeVIwtN2Jm/KEY3EtguJgmZxeKNt5jF2UvECJCR0ttViuIdCuUm2qNL69cCkTf6DSjkbmcz39Yi12hAJVuV97jEENTcyUpEGC4mYqxq+uTp6eYLpL4AywVy5V7LUTZCwSYmUyDYYwQSXr0T8yk3UJ7sR9TDgUi3/2XVqKywsWFG/15bbmRSKiSmEW9Gp0hP0NTxTc8qBjqH5LRtRAGWiAwejJNz8c5dTY9X3ksnuDMZDTlIjmL5jy029jXN06z38vWAsUfLLra6njy1FTeGp+NTc8TS6jSXUFsLM7hQQ8fH2d7U83ixZHTsRo9lnu7DS0QLPVkSrce4sxklHhCpe1iClZ58LglZ9XUSin29xWm/mE5XW1BInMx+kbzk5pZqkVyFsU6POjpM1N0tdUV2oyUadb9mAAtEICxgoD0ezJlkuIK4HIJjbXenPVjOj46zXB4zhH+3qWK6vwEqku1SM6iGIcHTUUXODMZXcwYLAb83gqqK90MTpZ3LYQWCCDg87Ap6Et7BZHOoKDlNPu9OVtB7D9u1j84oGJ1e1Mt1ZXu/AtEia4ginF4kNUtuaOltsCWpI6ImIOD9ApCAxn1ZBoYn8ElsLEu/S+jXPZj2tc3RpPfy7bGmpwcPx3cLmF3azBvgeqhyShuc4VWquwKGUkVxTLQpnvIWJkX0woCzNGjWiA0YMQhekcixNKYFd0/McvGYBUed/pvY64Ewqh/GOOqCwpX/7CcPW1Bnjo9lZc53INTUZpqvbhdzvjbc0FnKJBRUkWh6B4KU13pTquY1AmEgno2tRYIk44WP/OxBM+Op15ePzCR+hyI5TT5fYxNz6UlSKnw7NgMQ1POiD9YdLXVMRdL5KUT6eBktGTdSxa7NhpX4k+fKY5AdfdQmJ3NtbiKTLRbAj6Gw+U9elQLhElyT6ZUMYrkMksjbfJ7UQrGbc5nd0L9w3K68lhRPThVmlXUyRTb8KDuoQg7i8y9BBAKeFmIK8ZniqvmxE60QJjsaK5FJPX88rlYnKFwNOM5C021uSmW2398nMZaL9ubCh9/sNhcX01dtScvFdVDZbCCKKbhQRPT84yE54oqQG1hnUflHKjWAmHi87jZ2lCTcibT6bNRlMosgwly049pMf5QwP5LKyEiXNIazPlsiOm5GOG5WEnNol6NYhke1L2YwVR8KwhdC6EF4hzS6cnUb8YqMo5B1NovECfHZzgzGeVqB7Yz2NNWR/dQmNn53DU/W0pxLd0MJotdIWN40FzM2c3kuoeLM4MJktptlHEthBaIJDpb/JxIcWJXpkVyFlbLATtrIQ6dnABg71bnCURXW5B4QvHUmdytIharqAPFlS2TCcUyPKhnKIzfW8HGInT7Nfm9iJR3PyYtEEl0hPwklDGJbT0GJmbxuCVjd4bP4ybgq7B17u0TA1P4PC52NjvP32tVVD/enweBKMIvo3S5cGNxBKqPDobZ2VLrKJdnqnjM0aNDZZzqqgUiiXR6MvWPz7CpriqrfPsmm6upnzw1yYUbA1RkUJeRa1oCPloC3pwGqku9zUYy1vAgp1dU9wxHitK9ZFHug4Oc901SQLY21lDpdqXUk6l/YjbjALWFncVyiYTiyOlJuhw8irKrrY7Dp3K3ghiaihLwVVBVmfrwpmKlGIYHjUbmGJ+eL8oUV4uWMm+3oQUiCY/bxbam1DKZTk11H2bpAAAgAElEQVTMZJziatHs99mW5to3Os30fNzRs4r3tAXpG5lmKrqQk+OXQ5FcMk4fHmTVFHUWsUCEgl69gtAs0ZlCT6aZ+RijkfmMi+Qs7FxBPHHKcN1c0uZcgbDaPT+Zo3TXwakooWDpB6gtrOFBZx1ayNVdhE36lhMK+Dg7k5vRo9GFOO+751FOjE7bfmy70AKxjI4WP6fOzhJe4yrX6uKaaYqrRZPfy8x8nOm5WFbHgaUA9Y4m534YrYrqXNVDGLOoSz/F1cKq/neqm6l7OEKwylM0Q4JWwkpCyUVr/idOTfKDx07zkyODth/bLrRALGMpUL16HGIgyxRXi2YbR486OUBtUVddyeb66pwEqmPxBKOR0p1FvRIXmtPlnJrJ1D0YprPFX5QZTBYtORw92mN+x6TT3iffOPfbpEAs9mRaIw7RP27fCgKyL5YrhgC1RVdbMCc9mUYicyQUJTuLeiWs4UHPODAOoZQymvQVsXsJllKmcyEQVg2Lk4c/aYFYRmtdFdWV7jWvyvrHZ/B5XIvV0Jlil0AUQ4DaYk9bHafOzjJq87CkpSK58hEIJw8PGg7PMRWNFXWKKyytIHJRC9Fr1lv1DEeIO7RjrC0CISJuEXlURO4z718gIvtFpFdEviUileZ2r3m/13x8a9IxPmJuPyoiL7XDrkxwuYSdLf41VxADE0YX12yXzs1+078Zzu7kK4YAtcVSZ1d73UzlVCSXzJ72Oo6cmrK9K3C2WBdYxS4QAV8FVR53blYQQ2EqK1zGmIExZwaq7VpBvA94Oun+3wGfVUrtACaAt5vb3w5MmNs/a+6HiFwE3AJcDLwM+KKIFCyZvbOldm0XUxZzIJKpq/JQ4ZKsVxDFEKC22N0axCX2V1SXU5FcMq++rJX5eILvPXqq0KacQylkMIE5ejRof7Hc9FyM05NRrutsAlIrzi0EWQuEiLQBvw/8m3lfgOuBe81d7gJuNm/fZN7HfPwGc/+bgHuUUnNKqeNAL3BltrZlSkeLn9HI/KpukP7xmayL5MBYrTTWZp/qWgwBaosabwU7mmvtX0FMRal0u6ivqbT1uE7nwo0B9rTX8a0DJ1HKOW6KnqEIDTWVNJTA6NeWgP3tNqx2Pi/bHUKElIpzC4Ed3yifA/4nYI1GawDOKqWs3M0BoNW83Qr0A5iPT5r7L25f4Tl5Z61A9eTsAlPRWNZFchbNAW9WWUzFFKC26Gqr4/DApK1faEOTUZoD3qLOmMmUN1zRTvdQhEMn8zP3OxWODoWL3r1kEQr4GMrSDbwcK0B9SWuQLfXVpbmCEJFXAMNKqUdssieV17xNRA6KyMGRkZGcvMZa0+WsFNdsi+QsmrJcQRRTgNpiT1uQsel5Ttt4VXZmsvQnya3GK/ZsorrSzbcOnCy0KYCRwdQ7HCl695JFS9DH0NScrRc0PcMRKlzCloYaOlr8js1kynYFcQ3wKhE5AdyD4Vr6v0CdiFSY+7QBloP0FNAOYD4eBMaSt6/wnHNQSt2hlNqrlNrb1NSUpfkr01TrZUO1h6Mr1EJYKa52uJgg+4Z9xRSgtrAqqg/323fFOzRVXm02kqn1VvDKrk385+Nn1izwzBenJ6NE5mJF3YMpmRa/j/lYgokZ+97b3uEIWxtr8LhddDp4tkdWAqGU+ohSqk0ptRUjyPygUuqNwEPAa8zdbgV+YN7+oXkf8/EHlSHLPwRuMbOcLgB2Ag9nY1s2iAgdq2QyLa0gbHIx+b2MReYyTnMrpgC1xa6Nfjxusa2iWilVFrOo1+L1V7YzuxDnvsNnCm3KUg+mUGkIxGIthI0r3mPDkcXPbEeLMdujb8R5mUy5imr+OfBBEenFiDF8xdz+FaDB3P5B4HYApdQR4NvAU8BPgHcrpQoqp50hP92D4fOWlQMTs9R6K6ir9tjyOk1+LwkFY9OZrSKKKUBt4a1wc+HGgG2B6qnZGNGFRNmuIAAua6+js8XPPQf61985xyxmMDWXhkC02Dx6dC4W58TYNDvMuS2pFOcWCtu+VZRSv1BKvcK83aeUulIptUMp9Vql1Jy5PWre32E+3pf0/L9WSm1XSnUqpX5sl12Z0tHiJ2ymoiXTP26kuNoVDM2mWC5ehAFqi0tagzwxMEnChgIhKwWxHGZRr4aI8Por2nm8/yxPnylsZXX3UIRmv5egTRdRhcbuauoTozMkFItV5lsbavC4xZEtU4rnsjPPrBaotork7KJpsVgufYE4PhopugC1xZ62OsJzMY7bUCB0ZtKIC5XzCgKMmohKt4tvFXgV0T0ULhn3EhhuYBH7XExWBtN208VUWeFiW+PatVeFQgvEKljL4+TsAqUU/TbMgUimOYsVxBPm8J1iClBbdLXbV1E9VKZFcsvZUFPJS3eH+O6hgZy0p06FhDkne2eJuJfAmBPTUOO1zcXUMxxGZEkgwBh37MRMJi0QqxCs9hAK+M5ZQYxPzzMzH7ctgwmyczEVY4DaYkdTLVUety0V1YOTxntXzi4mi1uuaGcqGuOnBWohPTAxy+xCvGRSXC3sHBzUOxyhbUPVOZMPO1tq6R+ftaX1v51ogViD5apu1xyIZHweN35fRUYCUYwBaosKt4vdrfYEqgenojTUVFJZUXzvg908d1sDm+ur+ebDhamJsD4vHSXkYgKzWM6mmRC9SRlMFlZRYc+wsyqq9SdqDTpbas/ptNhv0xyI5WQyWa6YA9QWXW11HDk9xUI8sf7OazA0FdWrBxOXywhW7+sb53gBJpVZfvSdzaW1gmi2aTZ1PKHoG13KYLKwBMJpsyG0QKxBR4v/nE6Lds2BWE4m1dTFHKC26GoLMhdLZB2cO1Nms6jX4zWXt+ES+PbB/Aere4bCbAr68PtKI4PJIhTwMT49n3UxW//4DPOxxHkC0V5fjc/jclwcQgvEGuwKGRO7rC+wgYkZ6qo9tp/8zQFf2i2/izlAbbHHqqjOsmCunKuoV6Il4OP6Xc3c+8hA1quzdDk6FCk59xIsJUBkO3rUymDasSyI73YJO5vXHjNQCLRArMGO5tpzOi32T8zaGqC2yGQFUcwBaostDdUEqzxZCcRcLM749HzZZzAt55YrNjMSnuPBZ4bz9prxhOLYSKRkmvQl02JTLYQ1JGj5CgIMj4XTaiG0QKxBVaX7nE6LA+P2prhaNPm9TM/H08pgePLUJBcVaYDaQkTMEaSZB6qtKzotEOdybWcTzX5vXmsinh2bZj6WKLn4AyydX9nWQvQMRWjyewlWne+F6AzVMhyeY8JBw5+K99slT3S0+HlmcIpEQjFw1t4iOYt0U12tAPUlRRx/sOhqC3J0MJxx3v5iFbV2MZ1DhdvFa/e28Yujw4uFhLlmaUhQ6a0gQja12+gdiawqoIuBage5mbRArENnyM+JsRlOnZ1lPpag3eYANSQVy6XY1bUUAtQWXW11xBKKpzJsD3HGvKLbqAXiPF63t52EgnsPDuTl9brN7sc7S6wGAiBQVYHP48pqBaGUMpr0rSIQTuzJpAViHaxOi784avhy22xOcYX0VxClEKC2WJxRnWHrb2vSl05zPZ8tDTVcs6OBbx3st6Xn1Xp0D4Vpr6+iurJi/Z2LDBExBwdlHqQempojMhdbVSBCAR9+X4WjMpm0QKyDpeoPmMG+XKwgLIEYTnH5WgoBaotQwEeT35txoHpwKkqVx03AV3pfSnbw+is2MzAxy2+Ojeb8tbqHwiXTwXUlmgO+rEaP9gwbX/yrfW5FhM4WP90OGj+qBWIdrE6Lvz02Btg3SS6Z+upK3C5J2cVUCgFqCxFhT1uQxzMMVA+aKa7lOGo0FV5yUQt11Z6ctwFfiCc4PjpdkimuFqGAL6sspsUU1zVccFb3BqfMFy/+b5gcY3VanI8laPJ78Xnc6z8pTVwuobG2MiUXUzyheLJEAtQWXW119I1OZzQNbWgySkvAmwOrSgOfx82rL2vlZ0cGGc9hdsyJ0WkW4qrkejAlEwoaApHpl3fvcISAr4Km2tXP184WP5OzC1nNqbcTLRApYF0V2V1BnUyT35vSSXF8NMJMiQSoLbragii1FFtJhzOTUTYGc/d/KQVuuWIzC3HFdw/lLlh9dLHFRumuIFoCxujRsxmOHu0xA9RrrXatTCan1ENogUiBTvOqKBdFchbNfl9KK4hSClBbdGVYUZ1IKIbDug/TenSG/Fy2uY57DvTnzHXRPRTBJSsXgJUKi7UQGbqZjqXQBt1agTklk0kLRApYqp6LIjmLVKupSylAbVFfU0l7fVXaBXPjM/MsxBUh7WJal1uuaKd3OMKhkxM5OX7PUJgtDTU5ccE6hVDQOM8yEYiJ6XnGpufXFdCGWi+NtV69gigmLm4N4pLcLp+b/F5GI3OLnWNXo5QC1Ml0tdWlPRvCyknXfZjW5xVdm6ipdHPPw7kJVh8dCpdkBXUyi7OpM8hkWqvFxnI6Q86ZLlda3zI5orWuivs/+CJeuWdTzl6jOeAloVgzkFiKAWqLPW1BTp2dZSzFTC5YqmrVLqb1qfFW8KpLN3Hf4TMZJQOsxVwszrNjMyU1ZnQlmv1WNXX6AeSeodQFoqPFT/dQJC+1K+uhBSJFtjfV4nblLpXSymxYy81UigFqi8U4RBqB6qUqah2kToXXX7GZ2YU4//n4GVuP2zcyTTyh2FmCLTaSqaxw0VhbmZGLqXc4gs/jorVu/XO1s8XP7EJ8cUBZIdEC4RAWi+XWaPtdigFqi92tQUTgcBpupqGpKC6BxtrKHFpWOuxpC7Ir5OeeA/ZOm1vqwVTaLiYwVhGZ9GPqHYmwvakWVwoXmVbWpBMqqrVAOARr+brWCqIUA9QWtd4KtjfVphWoHpyM0uT3llw8JleIGNPmDg9McuR09rPALbqHwlS4hG2NpXdeLicU9GXUj6l3KJxyhpcVy3FCHEJ/shxCo9+4Cl6rmrpUA9QWXW1BHh+YTDkVc3Aqqtt8p8mrL2ulssLFt22srO4eirC1saYsZoK3ZDB6dHouxunJaMpBfL/PQ2tdlSMymbL6j4pIu4g8JCJPicgREXmfub1eRO4XkR7z9wZzu4jI50WkV0QOi8hzko51q7l/j4jcmt2fVXxUV1ZQ661YdWJVKQeoLfa01TEamVuMLayHnkWdPnXVlbx8d4jvPXoq4xbry+keCpeFewmMWoixNEePHksjg8miM+SM6XLZSn4M+JBS6iLgauDdInIRcDvwgFJqJ/CAeR/g5cBO8+c24EtgCArwceAq4Erg45aolBPNfu+qK4hSDlBbLHZ2TdHNZFRRa4FIl9df0c5UNMaPn8w+WD07H+fk+ExJzoBYCasWIp3Ro0tjRlMXiI4WP8dGInkfGbucrARCKXVGKXXIvB0GngZagZuAu8zd7gJuNm/fBNytDPYBdSKyEXgpcL9SalwpNQHcD7wsG9uKkUb/6sVypRygtrhwY4AKl/B4ChXVM/MxwtGYHhSUAVdf0MCWhmq+aUNNxLGRCEqV5pCglWjJYHBQz3CECpewpaEm5ed0hmpZiCtOjE6nbaOd2OY0FJGtwGXAfqBFKWVdngwCLebtViD5rBwwt622vaxoWksgSjhAbeHzuNm10Z/SCmKxSE67mNLG5RLecOVmHj4+zuMZzuGwsPzkZeNiCqZfC9E7bMRoPGnEDhd7MhXYzWSLQIhILfAd4P1KqXNGgykj4mhbxYeI3CYiB0Xk4MjIiF2HdQTNawhEqQeoLbra6jg8MLlukZCVi64FIjPeeNVm6qo9fPbn3Vkdp3s4TKXbldbVcTGTST+mY8ORtC/stjfV4hLoLnCgOutvGxHxYIjD15VS3zU3D5muI8zfw+b2U0B70tPbzG2rbT8PpdQdSqm9Sqm9TU1N2ZrvKJr8XiJzMWbmY+dsL4cAtcWetiDhaIwTY2svrYf0LOqs8Ps8/OkLt/OLoyM88mzm/Zl6hiJsa0rv6riYCVZ5qKxwpeximovFOTE2nXYTQ5/HzdbGmuJeQYjRt/YrwNNKqc8kPfRDwMpEuhX4QdL2N5vZTFcDk6Yr6qfAS0Rkgxmcfom5raxYrZq6HALUFql2dj2jXUxZ8+bnbqGhppLP3p/5KuLoYLjkK6iTsUaPploLcWJ0hoTKbE53p9lyo5BkK/vXAG8CrheRx8yf3wM+DdwoIj3Ai837AD8C+oBe4MvAuwCUUuPAp4AD5s8nzW1lRXNg5WK5cghQW+xsrsXnca0rEEOTUfy+Cmq8etRoptR4K3jntdv5de8o+/vG0n7+9FyMU2dnF9vhlwvpTJazMpi2ZxA77Gjxc2Js2rZ05EzI6tOllPo1sFrt+A0r7K+Ad69yrDuBO7Oxp9hZbQVRDgFqiwq3i92bgusGqnWRnD288aot/Osv+/jH+7v51m1XpzW6tcf88iunFQQYbs1UU7F7hyOIZCYQnSE/ShnHKJT3oDwch0XCUj+m5SuIs2URoLa4pC3Ik6cnia2RAz44NafbfNtAVaWbd127nYePj/O7Y+mtIroXM5jKSyBCAS+Dk6mNHu0ZDtO2oYqqyvTnZDhhulx5fOMUCfU1lbhdcs4KIp5QHDk9VRYBaos9bXVEFxKLV6grYcyi1gJhB2+4cjOhgI9/vL87rYlz3UNhvBUuNtfnbtKiE2kJ+JiLJZicXb9tem8GGUwWWxuqqXS7ClpRrQXCQbhdQkNN5TkCUU4Baov1Kqpj8QTDYV1FbRc+j5t3X7+DR56d4Jc9oyk/r9ucsZzLNvhOJNVaiHhC0TeafgaTRYXbxfbm2oJmMmmBcBhNfu85Lb/LKUBtsbWhBr+vYtWK6tHIPAmlBwXZyev3ttNaV8VnfnY05VVE92C47NxLkHotRP/4DPOxRFZzujtbagtaC6EFwmEs78dUTgFqC5dL6GpbPVCti+Tsp7LCxZ9dv4PHByZ58JnhdfefnF1gcCpalgKR6ujRpR5Mmb9HHSE/pyejTNk8BTBVtEA4jOXtNsotQG3R1VbHM2fCK6b46VnUueEPL29jc301n0khFtE7XF4tNpJpDhjJJOutINKZQ70anaYA9xTIzVRe3zpFQJPfy2hknnhClWWA2mJPW5BYQvH0manzHtOzqHODx+3ivTfs5MjpKX56ZGjNfY8OGl9+5biC8Fa4qa9Zf/Ro73CEJr+XYJUn49daymQqTMGcFgiH0ez3EU8oJmbmyzJAbbFWRfWZySgetxHQ19jLzZduYltjDZ/7efea/bC6h8JUV7pTmrFcirQEfOu6mHqGIykPCVqN1roqairdBctk0gLhMKxaiJHwXFkGqC02Bn001np5fIU4xNBUlGa/L6X5vpr0qHC7eN+Ld/LMYJgfrTEvomc4zM7m1GYslyKhgHfNFYRSymjSl6VAuFzCzpbCDQ/SAuEwzhGIMgxQW4gIe9qCK64gBiejOv6QQ17RtYmdzbV87uc9xFdZRRwdjJRdBXUyoeDao0eHpuaIzMWyFgiwejJpgdBgZDGBUU1drgFqi662Oo6NRIjMndvddki32cgpbpfw/hd30Dsc4b7Dp897fGJ6ntHIXFkGqC1aAj5GI/OrTnzrMYP4dlzcdYT8jEaM9zzflOc3j4NpNPsxDU1FyzZAbdHVFkQpYxaGhVKKM7qKOue8fHeIXSE/n/t5z3ktT6yr2XIMUFtYFyjL2+JYLKa42iCiViZTIVYRWiAcRo23gppKN/uPj5dtgNpipYrqqWiM2YW4rqLOMS5zFXF8dJrvP3buKkILxFIG3Wptv3uHIwR8FYsNOLOhI2SITCEK5rRAOJDmgI99ZuO0cgxQWzTUemmtqzqnoloPCsofL724hYs3Bfj8Az3nuFK6hyL4vRVlLdLrzabuMQPU6XTHXY2mWi8bqj0cLcBsCC0QDqSp1st8PFG2Aepk9rSfW1GtZ1HnDxHhgzd2cHJ8hu88MrC4vXsozM4We778ihUrSWK1FcSx4Qg7s6igTkZE6ChQoFoLhAOxMpnKOUBt0dVWR//4LOPT84Bus5Fvrt/VzJ72Ov7pwV7mYwmUUnQPlWcPpmQ2VK8+enRiep6x6XlbMpgsOkN+ugfDaXXbtYPy/vZxKJZAlHOA2mJ5HMK6YrPaHWhyi7WKOHV2lm8d7Gc0Ms/EzEJZp7iC8b60rFILYUeLjeV0tPgJz8UWR+3mCy0QDsQSiHIOUFtc0hpEZKmienAqSn1NJT5P+gNYNJnxwp2NXL5lA//8YO9iRllnmQsEsOps6p4h+wWiM2S23Mizm0kLhANp22C0L7hsc12BLSk8fp+HbY01iysIPSgo/4gIH7qxg8GpKH/746eB8mzSt5yWwMrFcr3DEXwel61tSDrMeEa+M5n0xHcH8nuXbGRzfXVWbYJLiT1tdfyqdxSllDmLWruX8s1ztzdw1QX17D8+TrDKs7jKLWdCAR8PPD2MUuqcgH3vSITtTfa2IQlWewgFfHoFoTG6al62eUOhzXAMXW1BRsJzDE5FjSrqMk6vLBRWLAIM91I5ZzBZhII+ZhfiTEXPrfTvHQrb6l6y6AjlP5NJC4TG8XS1G662gycmGI3MaxdTgbhqWwNved5WXnN5W6FNcQTNK9RCTM/FOD0ZzbqL60p0ttTSMxRZtT9WLtAuJo3juWhjgAqX8MDTxoyCci7QKjSfeNXFhTbBMYSSqqmttN9jOchgsuho8TMXS3ByfIYLGmtsP/5K6BWExvH4PG46Wvw8YI7C1CsIjRNYaTb10pjRHKwgrEymPAaqtUBoioI97UHCpq9XxyA0TsCqxUkeHNQzHKHCJWxpsP8K32jdkd+mfY4SCBF5mYgcFZFeEbm90PZonIM1YQ50FbXGGfg8bjZUe85bQWxtrMGTgw4I1ZUVbK6vzmsmk2MEQkTcwD8DLwcuAt4gIhcV1iqNU7Aqqr0Vrqxm/Go0drK8FuLYcCSn/dM6Wvx5rYVwjEAAVwK9Sqk+pdQ8cA9wU4Ft0jiEjhY/3goXG4M+nWKpcQzGZDljJsRcLM6JsemcxB8sOlv8HB+dZi4Wz9lrJOMkgWgF+pPuD5jbNBo8bheXb9nAtjLvbqtxFqGAb9HFdGJ0hoSCnTmsMu8I+YklFMdHp3P2GskUXZqriNwG3AawefPmAlujySdffONzEPTqQeMcmgM+RiNzLMQTixlM23N4EWP1wDo6GGZXKJCz17Fw0griFNCedL/N3HYOSqk7lFJ7lVJ7m5qa8macpvDUVVcSrNbxB41zCAV8KAUj4Tl6hyOI5FYgLmisocIlectkcpJAHAB2isgFIlIJ3AL8sMA2aTQazaqEgkaq6+BUlJ7hMK11VVRV5q7TcGWFi21NNRwdzM90Oce4mJRSMRF5D/BTwA3cqZQ6UmCzNBqNZlUWR49ORukdjuSkxcZyOlr8i+3vc42TVhAopX6klOpQSm1XSv11oe3RaDSatbBqck6dnaVvNLcZTBadLX5Ojs8wMx9bf+csccwKQqPRaIqN+ppKKt0uHnl2gvlYIi8CccuVm/nDy9uoysPQLC0QGo1GkyEiQnPAy2+PjQHkZYZLPmdxOMrFpNFoNMVGKOBjcnYByE2TvkKiBUKj0WiywApUN/m9JdcGRguERqPRZIElEPnIYMo3WiA0Go0mC6xaiFJzL4EWCI1Go8kKawWhBUKj0Wg059DR4kcELm2vW3/nIkOnuWo0Gk0WXLgxwKMfu5G66spCm2I7egWh0Wg0WVKK4gBaIDQajUazClogNBqNRrMiWiA0Go1GsyJaIDQajUazIlogNBqNRrMiWiA0Go1GsyKilCq0DRkjIiPANDBaaFvWoRHn2wjFYWcx2AjaTjspBhuheOzsVEql1Je8qAvllFJNInJQKbW30LasRTHYCMVhZzHYCNpOOykGG6G47Ex1X+1i0mg0Gs2KaIHQaDQazYqUgkDcUWgDUqAYbITisLMYbARtp50Ug41QgnYWdZBao9FoNLmjFFYQGo1Go8kBWiBsQkSk0DaUCvq9tBf9ftpHub2XWiDsow5ARBybOiwifyQie8zbTj7RfdYNh9tZLOhz0z7K6tx0tECIyM0i8qlC27EWIhIUkZ8CPwFQSsUKbNJ5iMiLReRXwOeAywCUA4NPIvISEfkt8AUReSM41k7Hn5egz007Kddz03FXFKYqu4C3ArcDW0TkZ0qpXxXWslWZBc4CzxeR1yql/p+IuJVS8UIaZb6PPuAuoBn4K+AmoNp8vOA2JiMiTcAngU8DU8D7RWSzUupvRcSllEoU2L5iOy9Bn5u2UNbnplLKkT/AtYAfeAfwi0Lbs4qNbqAF+ADwCmAw6TEptH2mHTcl3f5j4HeFtmkFGwXYDfxr0raLgHGg0WHvp+PPS9NOfW7aY2NZn5uOcTGJyHtF5Msi8ifmpv9WSoWVUl8GakTk7eZ+BbM5yca3iYgo4ypnCvh9pdR9wGER+d8islsppQrho0yy8R0ASqkfmNvdwHHgiIi059uu5YjIrSJyIywu1SPA80Sk3tz2FPBt4J8KZ2VxnJfm6+tz0yb0uZlEoVXPVL63APuAlwH/DXwE2J70+MuBI8AGB9n4F8B2zCWyuc/bgBhw0LzvcYCN25IevwQ4APgL+D5uAO4FzgCHAXfSY3cDX1u2737gAof8zx13XupzU5+buTw3nbKCuAH4O6XUT4APYfgn32g9qJT6MfA0cJuI+EXktQ6w0Qu8FsPP+3IR+RnwXuBB4FnzOfkOCi63sRJj6Q6AUuoJIArckme7FlFKTQA/Ay4EHgH+d9LD7wFeJiJXmPengceB+bwauUQxnJegz01b0Ofm+RR6WWy9/qMYflKUUgeB3wGtInJN0u5/Dvwt0AOEHGLjNuD5wP3Aw0qpS5VSLwGuFZELlCnlBbRxH8b7+HxzPwF+CvgK5GKwXvNupdRZ4IvAH4jIFtPmKeAvgY+JyK3AR4GLMZb4+bTT8edlCnbqczM9O/W5uQJ5FQgRCZm/XQBqKfr/G8AlIi807z+JsczbZO6/A+Mf9n3gOUqpnIpeysEAAAdhSURBVPn+0rDxCDCAERT630qpjyYdZrNS6rgDbHwSOA1sNPdTGG6H6Xx8QaxgpzJ/R83fB4AfA39tPUcp9QWMlMfLgS3Aa5VSkzm282IRWcxvd+J5maadhTw303kvC3luLrfTqefmNSKyPcmGvJ6beREIEblMRB4APgVLf2SSGvZgnNSvN1PcBjAyMLaaj08C71FK/YFS6rRDbOzH+GdsUUrNi4g76Ytw2iE2DmBcOWxNOsz/UErdmQv7UrBTVgiYfQHYYX5gW0Rkh1LqQeADSqlbc/X/Nu3pEpFfY6RZNiRtd8x5maGdhTg3M3kvC3Furman087N55iuwQeBYNL2vJ6bORUI803/LEaA5y6l1DuSHkvOHw4Dv8Lwnf6DiHgwgkBjAEqpEaVUjwNtrEuyMa5ylA9t1/to2pkzn2kKdiqlVEJEqkSk1rTnJPA94AmMYFvA3J6PPPiPAvcqpV6tlDpl2ul2wnlpg515OTeztDFv52YKdjri3BQRj4j8K0bH1c9juN2uTbIzr+dmTgXCXLb5gUeVUncDiMj25C81Mar+voGheB/D+CN/Zd6/K5f2aRsLYudfAl/H8JEjIm8A3gX8A3CJUupQru0UEZeIbAMiSqnPmdtuFJE6jLx3ROSvKPD7WQx2FoONadj5KQp8bmJ84f8SeIEy0pO/C1woIhWWMJmfofy8n8r+9KurgY6k+wHgKEZGwG/MP/hu4DlAh/mH7kja30WOU920jY6y82rykCq4ip09GIG+72Ncqd2NkS641WHvp6PsLAYbbbIz7+cmy4rugLcD/2I9BnSZdiantObs/bTzj6wD/gtj6fNRoCbpsfdipIS9EEMh/w4jut6U/Efm4R+hbXSOnW4H2PkXwCHgVeb9FwI/AJ7rsPfTEXYWg4022VnQcxNDCFzm7R3AEGY9A0kCko/3004XUw2GIv+ZeduKrqOU+jxwrVLql0qpOQz13gvMwHl+9FyibXSOnfnqtbOqncB9GFeO9eb9g8AgRj6+Y95PB9lZDDbaYWdBz01lkDAD0ifMfV5kPZZkZ87fz6wEQkTeLCIvEpGAMgI+d2CUoEeBq0Rkk7WvMopQLC4H+oG4+VjO/lBto7ZzBTtbTTsOAx8G3i0ijRiFW5ewFOgrezuLwcYSs9NKUxXTFq/5VEvAJB92LtprClLqTzAMDGH4wRLAMQz1e59SatTc5xrgdcABpdR/mNu8wHMxAj5ngA8ppbpt+ju0jTmiRO08qJT6WtJzP4gRmNyJkcL4VDnbWQw2lrCdyZ8ht1IqLiL/AfQqpT6RKxtXJU2fmdv83QH8h7UNo2nVd5ft+wGMXOMgUGVuex5wcy59ZtpGbWcadvqTtue8N1Ex2FkMNpaJndVJ2ytzbeeq9qf6RwJ/gxFsfBHwSow8d+txF4Yf70VJ22oxqg4PYARZNuX6H6Ft1HamYefD2s7islHbmf+fdWMQIvIijMZVG4BejOrYBeA6EbkSFv1hnzB/LH4fI4f4MYwc4lxWHWobtZ3p2vm4trN4bNR2FogUlPAFwJuS7n8ReCdGu9lHktQwhBFs2Wpuuwl4YT5UTtuo7dR2lraN2s7C/KTyx1ZjRNItX9obgb81bz8G/Jl5ey/wzYL8EdpGbae2s6Rt1HYW5mddF5NSakYpNaeWcoNvBEbM22/FKAO/D/gmRgHKYipWvtA2aju1naVto7azMFSkuqMYYwEVRsfAH5qbwxiVibuB48psfqVMecw32kb70HbaSzHYWQw2grYzn6RTKJcAPMAo0GUq4MeAhFLq19YfWmC0jfah7bSXYrCzGGwEbWf+SMcfhdFUKgH8Gnh7of1j2kZtp7az/GzUdubvJ61KahFpA94EfEYZPXYch7bRPrSd9lIMdhaDjaDtzBdpt9rQaDQaTXmQ15nUGo1GoyketEBoNBqNZkW0QGg0Go1mRbRAaDQajWZFtEBoNBqNZkW0QGg0eURE6kTkXUn3rzULqDQax6EFQqPJL3UYLZ01GsejBUKjWQUR2Soiz4jIV0WkW0S+LiIvFpHfiEiPiFwpIvUi8n0ROSwi+0Sky3zuJ0TkThH5hYj0ich7zcN+GtguIo+JyN+b22pF5F7ztb7u1MZtmvIj5WZ9Gk2ZsgN4LfA2jGl5fwQ8H3gVRtO1fuBRpdTNInI9cDdwqfncXcB1gB84KiJfAm4HdiulLgXDxQRcBlwMnAZ+A1yD0ZpBoykoegWh0azNcaXUE8qYAHYEeEAZ7QeeALZiiMXXAJRSDwINIhIwn/tfymj7PAoMY3T1XImHlVID5ms8Zh5Xoyk4WiA0mrVJ7p+TSLqfYP0VePJz42vsn+p+Gk1e0QKh0WTHrzAmhlnuolGl1NQa+4cxXE4ajePRVyoaTXZ8ArhTRA4DM8Cta+2slBozg9xPAj8G/iv3Jmo0maG7uWo0Go1mRbSLSaPRaDQrogVCo9FoNCuiBUKj0Wg0K6IFQqPRaDQrogVCo9FoNCuiBUKj0Wg0K6IFQqPRaDQrogVCo9FoNCvy/wEhGYQbVXSQXgAAAABJRU5ErkJggg==%0A\">\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Jste-li v příkazové řádce, napřed použij <code>plot()</code> a potom se na graf buď podívete, nebo ho uložte:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"c1\"># Setup</span>\n<span class=\"kn\">import</span> <span class=\"nn\">matplotlib.pyplot</span>\n\n<span class=\"c1\"># Plot</span>\n<span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[</span><span class=\"s1\">'Clothing'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"p\">()</span>\n<span class=\"n\">matplotlib</span><span class=\"o\">.</span><span class=\"n\">pyplot</span><span class=\"o\">.</span><span class=\"n\">show</span><span class=\"p\">()</span>\n<span class=\"n\">matplotlib</span><span class=\"o\">.</span><span class=\"n\">pyplot</span><span class=\"o\">.</span><span class=\"n\">savefig</span><span class=\"p\">(</span><span class=\"s1\">'graph.png'</span><span class=\"p\">)</span>\n</pre></div><p>Funkce <code>show</code> a <code>savefig</code> pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce <code>savefig</code> aktuální graf zahodí; před dalším <code>show</code> nebo <code>savefig</code> je potřeba ho vykreslit znovu.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>V kombinaci s dalšími funkcemi <code>Series</code> a <code>DataFrame</code> umožňují grafy získat o datech rychlý přehled:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [78]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Jak se postupně vyvíjely zisky z oblečení?</span>\n<span class=\"c1\"># `.T` udělá transpozici tabulky (vymění řádky a sloupce)</span>\n<span class=\"c1\"># `cumsum()` spočítá průběžný součet po sloupcích</span>\n<span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">T</span><span class=\"o\">.</span><span class=\"n\">fillna</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">cumsum</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[78]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre><matplotlib.axes._subplots.AxesSubplot at 0x7f0a23d5dc50></pre>\n</div>\n\n</div>\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n\n\n<div class=\"output_png output_subarea \">\n<img src=\"data:image/png;base64,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%0A\">\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [79]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"c1\"># Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?</span>\n<span class=\"n\">unstacked</span><span class=\"o\">.</span><span class=\"n\">loc</span><span class=\"p\">[:,</span> <span class=\"s1\">'2016-03'</span><span class=\"p\">:</span><span class=\"s1\">'2016-05'</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"o\">.</span><span class=\"n\">bar</span><span class=\"p\">(</span><span class=\"n\">legend</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[79]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre><matplotlib.axes._subplots.AxesSubplot at 0x7f0a21c966a0></pre>\n</div>\n\n</div>\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n\n\n<div class=\"output_png output_subarea \">\n<img src=\"data:image/png;base64,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%0A\">\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Další informace jsou, jak už to bývá, <a href=\"http://pandas.pydata.org/pandas-docs/version/0.19.0/visualization.html\">v dokumentaci</a>.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h2>Groupby</h2>\n<p>Často používaná operace pro zjednodušení tabulky je <code>groupby</code>, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [80]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">head</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[80]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>category</th>\n <th>month</th>\n <th>sales</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Electronics</td>\n <td>2015-01-31</td>\n <td>5890</td>\n </tr>\n <tr>\n <th>1</th>\n <td>Power Tools</td>\n <td>2015-01-31</td>\n <td>3242</td>\n </tr>\n <tr>\n <th>2</th>\n <td>Clothing</td>\n <td>2015-01-31</td>\n <td>6961</td>\n </tr>\n <tr>\n <th>3</th>\n <td>Electronics</td>\n <td>2015-02-28</td>\n <td>3969</td>\n </tr>\n <tr>\n <th>4</th>\n <td>Power Tools</td>\n <td>2015-02-28</td>\n <td>4866</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Samotný výsledek <code>groupby()</code> je jen objekt:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [81]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'category'</span><span class=\"p\">)</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[81]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre><pandas.core.groupby.groupby.DataFrameGroupBy object at 0x7f0a21c8cc88></pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>... na který musíme zavolat příslušnou agregující funkci. Tady je například součet částek podle kategorie:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [82]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'category'</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[82]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>sales</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Clothing</th>\n <td>112701</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <td>103742</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>104859</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Nebo počet záznamů:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [83]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'category'</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[83]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>month</th>\n <th>sales</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Clothing</th>\n <td>22</td>\n <td>22</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <td>22</td>\n <td>22</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>23</td>\n <td>23</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Groupby umí agregovat podle více sloupců najednou (i když u našeho příkladu nedává velký smysl):</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [84]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">([</span><span class=\"s1\">'category'</span><span class=\"p\">,</span> <span class=\"s1\">'month'</span><span class=\"p\">])</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">head</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[84]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>sales</th>\n </tr>\n <tr>\n <th>category</th>\n <th>month</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th rowspan=\"5\" valign=\"top\">Clothing</th>\n <th>2015-01-31</th>\n <td>6961</td>\n </tr>\n <tr>\n <th>2015-02-28</th>\n <td>2578</td>\n </tr>\n <tr>\n <th>2015-03-31</th>\n <td>9131</td>\n </tr>\n <tr>\n <th>2015-04-30</th>\n <td>618</td>\n </tr>\n <tr>\n <th>2015-05-31</th>\n <td>4796</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Chceme-li aplikovat více funkcí najednou, předáme jejich seznam metodě <code>agg</code>. Časté funkce lze předat jen jménem, jinak předáme funkci či metodu přímo:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [85]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'category'</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">agg</span><span class=\"p\">([</span><span class=\"s1\">'mean'</span><span class=\"p\">,</span> <span class=\"s1\">'median'</span><span class=\"p\">,</span> <span class=\"nb\">sum</span><span class=\"p\">,</span> <span class=\"n\">pandas</span><span class=\"o\">.</span><span class=\"n\">Series</span><span class=\"o\">.</span><span class=\"n\">kurtosis</span><span class=\"p\">])</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[85]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead tr th {\n text-align: left\n }\n.lesson-content .dataframe thead tr:last-of-type th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th colspan=\"4\" halign=\"left\">sales</th>\n </tr>\n <tr>\n <th></th>\n <th>mean</th>\n <th>median</th>\n <th>sum</th>\n <th>kurt</th>\n </tr>\n <tr>\n <th>category</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Clothing</th>\n <td>5122.772727</td>\n <td>6185.5</td>\n <td>112701</td>\n <td>-1.298035</td>\n </tr>\n <tr>\n <th>Electronics</th>\n <td>4715.545455</td>\n <td>4294.5</td>\n <td>103742</td>\n <td>-1.353210</td>\n </tr>\n <tr>\n <th>Power Tools</th>\n <td>4559.086957</td>\n <td>3769.0</td>\n <td>104859</td>\n <td>-1.044767</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Případně použijeme zkratku pro základní analýzu:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [86]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">g</span> <span class=\"o\">=</span> <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'month'</span><span class=\"p\">)</span>\n<span class=\"n\">g</span><span class=\"o\">.</span><span class=\"n\">describe</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[86]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead tr th {\n text-align: left\n }\n.lesson-content .dataframe thead tr:last-of-type th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th colspan=\"8\" halign=\"left\">sales</th>\n </tr>\n <tr>\n <th></th>\n <th>count</th>\n <th>mean</th>\n <th>std</th>\n <th>min</th>\n <th>25%</th>\n <th>50%</th>\n <th>75%</th>\n <th>max</th>\n </tr>\n <tr>\n <th>month</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2015-01-31</th>\n <td>3.0</td>\n <td>5364.333333</td>\n <td>1914.414880</td>\n <td>3242.0</td>\n <td>4566.0</td>\n <td>5890.0</td>\n <td>6425.5</td>\n <td>6961.0</td>\n </tr>\n <tr>\n <th>2015-02-28</th>\n <td>3.0</td>\n <td>3804.333333</td>\n <td>1152.853995</td>\n <td>2578.0</td>\n <td>3273.5</td>\n <td>3969.0</td>\n <td>4417.5</td>\n <td>4866.0</td>\n </tr>\n <tr>\n <th>2015-03-31</th>\n <td>3.0</td>\n <td>3900.333333</td>\n <td>4529.891978</td>\n <td>1281.0</td>\n <td>1285.0</td>\n <td>1289.0</td>\n <td>5210.0</td>\n <td>9131.0</td>\n </tr>\n <tr>\n <th>2015-04-30</th>\n <td>3.0</td>\n <td>3250.000000</td>\n <td>3895.490855</td>\n <td>618.0</td>\n <td>1012.5</td>\n <td>1407.0</td>\n <td>4566.0</td>\n <td>7725.0</td>\n </tr>\n <tr>\n <th>2015-05-31</th>\n <td>3.0</td>\n <td>5792.000000</td>\n <td>2069.341200</td>\n <td>4409.0</td>\n <td>4602.5</td>\n <td>4796.0</td>\n <td>6483.5</td>\n <td>8171.0</td>\n </tr>\n <tr>\n <th>2015-06-30</th>\n <td>3.0</td>\n <td>7241.333333</td>\n <td>2747.220656</td>\n <td>4180.0</td>\n <td>6116.0</td>\n <td>8052.0</td>\n <td>8772.0</td>\n <td>9492.0</td>\n </tr>\n <tr>\n <th>2015-07-31</th>\n <td>3.0</td>\n <td>5836.333333</td>\n <td>2388.415653</td>\n <td>3267.0</td>\n <td>4760.0</td>\n <td>6253.0</td>\n <td>7121.0</td>\n <td>7989.0</td>\n </tr>\n <tr>\n <th>2015-08-31</th>\n <td>1.0</td>\n <td>5534.000000</td>\n <td>NaN</td>\n <td>5534.0</td>\n <td>5534.0</td>\n <td>5534.0</td>\n <td>5534.0</td>\n <td>5534.0</td>\n </tr>\n <tr>\n <th>2015-09-30</th>\n <td>3.0</td>\n <td>3371.000000</td>\n <td>3542.417960</td>\n <td>31.0</td>\n <td>1513.5</td>\n <td>2996.0</td>\n <td>5041.0</td>\n <td>7086.0</td>\n </tr>\n <tr>\n <th>2015-10-31</th>\n <td>3.0</td>\n <td>6367.666667</td>\n <td>3002.029702</td>\n <td>2909.0</td>\n <td>5402.5</td>\n <td>7896.0</td>\n <td>8097.0</td>\n <td>8298.0</td>\n </tr>\n <tr>\n <th>2015-11-30</th>\n <td>3.0</td>\n <td>3917.666667</td>\n <td>3273.148688</td>\n <td>494.0</td>\n <td>2368.5</td>\n <td>4243.0</td>\n <td>5629.5</td>\n <td>7016.0</td>\n </tr>\n <tr>\n <th>2015-12-31</th>\n <td>3.0</td>\n <td>5225.333333</td>\n <td>2377.587082</td>\n <td>3769.0</td>\n <td>3853.5</td>\n <td>3938.0</td>\n <td>5953.5</td>\n <td>7969.0</td>\n </tr>\n <tr>\n <th>2016-01-31</th>\n <td>3.0</td>\n <td>8453.666667</td>\n <td>536.431108</td>\n <td>7852.0</td>\n <td>8239.5</td>\n <td>8627.0</td>\n <td>8754.5</td>\n <td>8882.0</td>\n </tr>\n <tr>\n <th>2016-02-29</th>\n <td>3.0</td>\n <td>6417.666667</td>\n <td>2290.170372</td>\n <td>4194.0</td>\n <td>5242.0</td>\n <td>6290.0</td>\n <td>7529.5</td>\n <td>8769.0</td>\n </tr>\n <tr>\n <th>2016-03-31</th>\n <td>3.0</td>\n <td>2345.666667</td>\n <td>537.738164</td>\n <td>2012.0</td>\n <td>2035.5</td>\n <td>2059.0</td>\n <td>2512.5</td>\n <td>2966.0</td>\n </tr>\n <tr>\n <th>2016-04-30</th>\n <td>3.0</td>\n <td>5439.000000</td>\n <td>4444.797408</td>\n <td>471.0</td>\n <td>3639.0</td>\n <td>6807.0</td>\n <td>7923.0</td>\n <td>9039.0</td>\n </tr>\n <tr>\n <th>2016-05-31</th>\n <td>3.0</td>\n <td>2391.333333</td>\n <td>2675.235566</td>\n <td>314.0</td>\n <td>882.0</td>\n <td>1450.0</td>\n <td>3430.0</td>\n <td>5410.0</td>\n </tr>\n <tr>\n <th>2016-06-30</th>\n <td>3.0</td>\n <td>5012.000000</td>\n <td>3178.877632</td>\n <td>2858.0</td>\n <td>3186.5</td>\n <td>3515.0</td>\n <td>6089.0</td>\n <td>8663.0</td>\n </tr>\n <tr>\n <th>2016-07-31</th>\n <td>3.0</td>\n <td>8232.000000</td>\n <td>1732.765131</td>\n <td>6382.0</td>\n <td>7439.5</td>\n <td>8497.0</td>\n <td>9157.0</td>\n <td>9817.0</td>\n </tr>\n <tr>\n <th>2016-08-31</th>\n <td>3.0</td>\n <td>5452.333333</td>\n <td>4539.188621</td>\n <td>349.0</td>\n <td>3659.0</td>\n <td>6969.0</td>\n <td>8004.0</td>\n <td>9039.0</td>\n </tr>\n <tr>\n <th>2016-09-30</th>\n <td>3.0</td>\n <td>3569.333333</td>\n <td>5183.962802</td>\n <td>-735.0</td>\n <td>692.0</td>\n <td>2119.0</td>\n <td>5721.5</td>\n <td>9324.0</td>\n </tr>\n <tr>\n <th>2016-10-31</th>\n <td>3.0</td>\n <td>3487.333333</td>\n <td>2247.644174</td>\n <td>919.0</td>\n <td>2683.5</td>\n <td>4448.0</td>\n <td>4771.5</td>\n <td>5095.0</td>\n </tr>\n <tr>\n <th>2016-11-30</th>\n <td>3.0</td>\n <td>385.333333</td>\n <td>887.008643</td>\n <td>-259.0</td>\n <td>-120.5</td>\n <td>18.0</td>\n <td>707.5</td>\n <td>1397.0</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>A perlička nakonec – agregovat se dá i podle sloupců, které nejsou v tabulce. Následující kód rozloží data na slabé, průměrné a silné měsíce podle toho, kolik jsme v daném měsíci vydělali celých tisícikorun, a zjistí celkový zisk ze slabých, průměrných a silných měsíců:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [87]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">bin_size</span> <span class=\"o\">=</span> <span class=\"mi\">10000</span>\n<span class=\"n\">by_month</span> <span class=\"o\">=</span> <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"s1\">'month'</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span>\n<span class=\"n\">by_thousands</span> <span class=\"o\">=</span> <span class=\"n\">by_month</span><span class=\"o\">.</span><span class=\"n\">groupby</span><span class=\"p\">(</span><span class=\"n\">by_month</span><span class=\"p\">[</span><span class=\"s1\">'sales'</span><span class=\"p\">]</span> <span class=\"o\">//</span> <span class=\"n\">bin_size</span> <span class=\"o\">*</span> <span class=\"n\">bin_size</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">agg</span><span class=\"p\">([</span><span class=\"s1\">'count'</span><span class=\"p\">,</span> <span class=\"s1\">'sum'</span><span class=\"p\">])</span>\n<span class=\"n\">by_thousands</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[87]:</div>\n\n\n\n<div class=\"output_html rendered_html output_subarea output_execute_result\">\n<div>\n<style>.lesson-content .dataframe tbody tr th:only-of-type {\n vertical-align: middle\n }\n.lesson-content .dataframe tbody tr th {\n vertical-align: top\n }\n.lesson-content .dataframe thead tr th {\n text-align: left\n }\n.lesson-content .dataframe thead tr:last-of-type th {\n text-align: right\n }</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th colspan=\"2\" halign=\"left\">sales</th>\n </tr>\n <tr>\n <th></th>\n <th>count</th>\n <th>sum</th>\n </tr>\n <tr>\n <th>sales</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>5</td>\n <td>30651</td>\n </tr>\n <tr>\n <th>10000</th>\n <td>15</td>\n <td>218870</td>\n </tr>\n <tr>\n <th>20000</th>\n <td>3</td>\n <td>71781</td>\n </tr>\n </tbody>\n</table>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In [88]:</div>\n<div class=\"inner_cell\">\n <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">by_thousands</span><span class=\"p\">[(</span><span class=\"s1\">'sales'</span><span class=\"p\">,</span> <span class=\"s1\">'sum'</span><span class=\"p\">)]</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"p\">()</span>\n</pre></div>\n\n</div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n<div class=\"prompt output_prompt\">Out[88]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre><matplotlib.axes._subplots.AxesSubplot at 0x7f0a2a54e3c8></pre>\n</div>\n\n</div>\n\n<div class=\"output_area\">\n\n<div class=\"prompt\"></div>\n\n\n\n\n<div class=\"output_png output_subarea \">\n<img src=\"data:image/png;base64,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%0A\">\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n \n\n\n\n\n " } } }