diff --git a/course.yml b/course.yml index 0b9a039..e3dea16 100644 --- a/course.yml +++ b/course.yml @@ -45,6 +45,7 @@ plan: slug: eda4 date: 2023-10-09 materials: + - lesson: pydata/pandas_joins - lesson: pydata/pandas_correlations - title: "Svátky klidu a konce kurzu" diff --git a/lessons/pydata/pandas_correlations/index.ipynb b/lessons/pydata/pandas_correlations/index.ipynb index aabdc5e..7151d89 100644 --- a/lessons/pydata/pandas_correlations/index.ipynb +++ b/lessons/pydata/pandas_correlations/index.ipynb @@ -4,6100 +4,36 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Pandas - spojování tabulek a vztahy mezi více proměnnými\n", - "\n", - "Tato lekce se nese ve znamení mnohosti a propojování - naučíš se:\n", - "\n", - "- pracovat s více tabulkami najednou\n", - "- nacházet spojitosti mezi dvěma (a více) proměnnými\n", - "\n", - "Při tom společně projdeme (ne poprvé a ne naposledy) čištění reálných datových sad." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Importy jako obvykle\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "toc-hr-collapsed": false - }, - "source": [ - "## Spojování tabulek\n", - "\n", - "V lekci, kde jsme zpracovávali data o počasí, jsme ti ukázali, že je pomocí funkce `concat` možné slepit dohromady několik objektů `DataFrame` či `Series`, pokud mají \"kompatibilní\" index. Nyní se na problematiku podíváme trochu blíže a ukážeme si, jak spojovat tabulky na základě různých sloupců, a co dělat, když řádky z jedné tabulky nepasují přesně na tabulku druhou.\n", - "\n", - "Obecně pro spojování `pandas` nabízí čtyři funkce / metody, z nichž každá má svoje typické využití (možnostmi se ovšem překrývají):\n", - "\n", - "- [`concat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html) je univerzální funkce pro slepování dvou či více tabulek / sloupců - pod sebe, vedle sebe, s přihlédnutím k indexům i bez něj. \n", - "- [`append`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html) (metoda) je jednodušší alternativou `concat`, pokud jen chceš do nějaké tabulky přidat pár řádků.\n", - "- [`merge`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html) je univerzální funkce pro spojování tabulek na základě vazby mezi indexy nebo sloupci.\n", - "- [`join`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html) (metoda) zjednodušuje práci, když chceš spojit dvě tabulky na základě indexu.\n", - "\n", - "Detailní rozbor toho, co která umí, najdeš v [dokumentaci](https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html). My si je také postupně ukážeme." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Jednoduché skládání" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Pod sebou\n", - "\n", - "To je asi ten nejjednodušší případ - máme dva objekty `Series` nebo dva kusy tabulky se stejnými sloupci a chceme je spojit pod sebou. Na to se používá funkce [`concat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html):" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "a = pd.Series([\"jedna\", \"dvě\", \"tři\"])\n", - "b = pd.Series([\"čtyři\", \"pět\", \"šest\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 jedna\n", - "1 dvě\n", - "2 tři\n", - "0 čtyři\n", - "1 pět\n", - "2 šest\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.concat([a, b])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "💡 Vidíš, že se index opakuje? Vytvořili jsme dvě `Series`, u kterých jsme index neřešili. Jenže `pandas` na rozdíl od nás ano, a tak poslušně oba indexy spojil, i za cenu duplicitních hodnot. Za cenu použití dodatečného argumentu `ignore_index=True` se tomu lze vyhnout, což si ukážeme na příklady spojování dvou tabulek o stejných sloupcích:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 jedna\n", - "1 dvě\n", - "2 tři\n", - "3 jedna\n", - "4 dvě\n", - "5 tři\n", - "6 jedna\n", - "7 dvě\n", - "8 tři\n", - "9 jedna\n", - "10 dvě\n", - "11 tři\n", - "12 jedna\n", - "13 dvě\n", - "14 tři\n", - "dtype: object" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.concat([a, a, a, a, a], ignore_index=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Vedle sebe\n", - "\n", - "Toto asi použijete zřídka, ale když chceme \"lepit\" doprava (třeba deset `Series`), stačí přidat nám dobře známý argument `axis`:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
01234
0jednajednajednajednajedna
1dvědvědvědvědvě
2třitřitřitřitři
\n", - "
" - ], - "text/plain": [ - " 0 1 2 3 4\n", - "0 jedna jedna jedna jedna jedna\n", - "1 dvě dvě dvě dvě dvě\n", - "2 tři tři tři tři tři" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.concat([a, a, a, a, a], axis=\"columns\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Příklad:** Jak co nejrychleji \"nakreslit prázdnou šachovnici\" (obě slova jsou v uvozovkách)?" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ABCDEFGH
8
7
6
5
4
3
2
1
\n", - "
" - ], - "text/plain": [ - " A B C D E F G H\n", - "8 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", - "7 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", - "6 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", - "5 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", - "4 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", - "3 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", - "2 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", - "1 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sachy = pd.concat(\n", - " [\n", - " pd.concat( \n", - " [pd.DataFrame([[\"⬜\", \"⬛\"], [\"⬛\", \"⬜\"]])] * 4,\n", - " axis=1)\n", - " ] * 4\n", - ")\n", - "sachy.index = list(range(8, 0, -1))\n", - "sachy.columns = list(\"ABCDEFGH\")\n", - "sachy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Spojování různorodých tabulek" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "🎦 Pro spojování heterogenních dat (v datové hantýrce \"joinování\") sáhneme po trochu komplexnějších filmových datech..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Máme staženo několik souborů, načteme si je (zatím hrubě, \"raw\") - s přihlédnutím k tomu, že první dva nejsou v pravém slova smyslu \"comma-separated\", ale používají k oddělení hodnot tabulátor (tady pomůže argument `sep`). Také zohledníme, že v nich řetězec `\"\\N\"` představuje chybějící hodnoty (pomůže argument `na_values`):" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "imdb_titles_raw = pd.read_csv(\"title.basics.tsv.gz\", sep=\"\\t\", na_values=\"\\\\N\")\n", - "imdb_ratings_raw = pd.read_csv(\"title.ratings.tsv.gz\", sep=\"\\t\", na_values=\"\\\\N\")\n", - "boxoffice_raw = pd.read_csv(\"boxoffice_march_2019.csv.gz\")\n", - "rotten_tomatoes_raw = pd.read_csv(\"rotten_tomatoes_top_movies_2019-01-15.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Co který soubor obsahuje? \n", - "\n", - "- První dva soubory obsahují volně dostupná (byť \"jen\" pro nekomerční použití) data o filmech z IMDb (Internet Movie Database). My jsme si zvolili obecné informace a uživatelská (číselná) hodnocení. Detailní popis souborů, stejně jako odkazy na další soubory, najdeš na https://www.imdb.com/interfaces/. Z důvodů paměťové náročnosti jsme datovou sadu ořezali o epizody seriálů, protože nás nebudou zajímat a s trochu štěstí přežijeme i na počítačích s menší operační pamětí.\n", - "\n", - "- Soubor `boxoffice_march_2019.csv.gz` obsahuje informace o výdělcích jednotlivých filmů. Pochází z ukázkového datasetu pro soutěž \"TMDB Box Office Prediction\" na serveru Kaggle: https://www.kaggle.com/c/tmdb-box-office-prediction/data\n", - "\n", - "- Soubor `rotten_tomatoes_top_movies_2019-01-15.csv` obsahuje procentuální hodnocení filmů ze serveru Rotten Tomatoes, které se počítá jako podíl pozitivních hodnoceních od filmových kritiku (je to tedy jiný princip než na IMDb). Staženo z: https://data.world/prasert/rotten-tomatoes-top-movies-by-genre\n", - "\n", - "Pojďme se podívat na nedostatky těchto souborů a postupně je skládat dohromady. Zajímalo by nás (a snad i tebe!), jak souvisí hodnocení s komerční úspěšností filmu, jak se liší hodnocení rotten tomatoes od těch na IMDb." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tconsttitleTypeprimaryTitleoriginalTitleisAdultstartYearendYearruntimeMinutesgenres
0tt0000001shortCarmencitaCarmencita01894.0NaN1.0Documentary,Short
1tt0000002shortLe clown et ses chiensLe clown et ses chiens01892.0NaN5.0Animation,Short
2tt0000003shortPauvre PierrotPauvre Pierrot01892.0NaN4.0Animation,Comedy,Romance
3tt0000004shortUn bon bockUn bon bock01892.0NaNNaNAnimation,Short
4tt0000005shortBlacksmith SceneBlacksmith Scene01893.0NaN1.0Comedy,Short
..............................
1783511tt9916734videoManca: PeleoManca: Peleo02018.0NaNNaNMusic,Short
1783512tt9916754movieChico Albuquerque - RevelaçõesChico Albuquerque - Revelações02013.0NaNNaNDocumentary
1783513tt9916756shortPretty Pretty Black GirlPretty Pretty Black Girl02019.0NaNNaNShort
1783514tt9916764short383802018.0NaNNaNShort
1783515tt9916856shortThe WindThe Wind02015.0NaN27.0Short
\n", - "

1783516 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " tconst titleType primaryTitle \\\n", - "0 tt0000001 short Carmencita \n", - "1 tt0000002 short Le clown et ses chiens \n", - "2 tt0000003 short Pauvre Pierrot \n", - "3 tt0000004 short Un bon bock \n", - "4 tt0000005 short Blacksmith Scene \n", - "... ... ... ... \n", - "1783511 tt9916734 video Manca: Peleo \n", - "1783512 tt9916754 movie Chico Albuquerque - Revelações \n", - "1783513 tt9916756 short Pretty Pretty Black Girl \n", - "1783514 tt9916764 short 38 \n", - "1783515 tt9916856 short The Wind \n", - "\n", - " originalTitle isAdult startYear endYear \\\n", - "0 Carmencita 0 1894.0 NaN \n", - "1 Le clown et ses chiens 0 1892.0 NaN \n", - "2 Pauvre Pierrot 0 1892.0 NaN \n", - "3 Un bon bock 0 1892.0 NaN \n", - "4 Blacksmith Scene 0 1893.0 NaN \n", - "... ... ... ... ... \n", - "1783511 Manca: Peleo 0 2018.0 NaN \n", - "1783512 Chico Albuquerque - Revelações 0 2013.0 NaN \n", - "1783513 Pretty Pretty Black Girl 0 2019.0 NaN \n", - "1783514 38 0 2018.0 NaN \n", - "1783515 The Wind 0 2015.0 NaN \n", - "\n", - " runtimeMinutes genres \n", - "0 1.0 Documentary,Short \n", - "1 5.0 Animation,Short \n", - "2 4.0 Animation,Comedy,Romance \n", - "3 NaN Animation,Short \n", - "4 1.0 Comedy,Short \n", - "... ... ... \n", - "1783511 NaN Music,Short \n", - "1783512 NaN Documentary \n", - "1783513 NaN Short \n", - "1783514 NaN Short \n", - "1783515 27.0 Short \n", - "\n", - "[1783516 rows x 9 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles_raw" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "648.8971881866455" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Kolik tabulka zabírá megabajtů paměti? (1 MB = 2**20 bajtů)\n", - "imdb_titles_raw.memory_usage(deep=True).sum() / 2**20 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jistě budeme chtít převést sloupce na správné typy. Jaké jsou v základu?" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tconst object\n", - "titleType object\n", - "primaryTitle object\n", - "originalTitle object\n", - "isAdult int64\n", - "startYear float64\n", - "endYear float64\n", - "runtimeMinutes float64\n", - "genres object\n", - "dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles_raw.dtypes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Na co budeme převádět?\n", - "\n", - "- `tconst` je řetězec, který posléze použijeme jako index, protože představuje unikátní identifikátor v databázi IMDb.\n", - "- `titleType`:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "titleType\n", - "short 676930\n", - "movie 514654\n", - "video 227582\n", - "tvSeries 162781\n", - "tvMovie 126507\n", - "tvMiniSeries 25574\n", - "videoGame 23310\n", - "tvSpecial 17007\n", - "tvShort 9171\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles_raw[\"titleType\"].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jen devět různých hodnot ve skoro 2 milionech řádků? To je ideální kandidát na převedení na typ `\"category\"`.\n", - "\n", - "- `primaryTitle` a `originalTitle` vypadají jako obyčejné řetězce (pokud možno anglický a pokud možno původní název)\n", - "- `isAdult` určuje, zda se jedná o dílo pro dospělé. Tento sloupec bychom nejspíše měli převést na `bool`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "isAdult\n", - "0 1692292\n", - "1 91224\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles_raw[\"isAdult\"].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- `startYear` a `endYear` obsahují roky, t.j. celá čísla, ovšem kvůli chybějícím hodnotám je pro ně zvolen typ `float64`. V `pandas` raději zvolíme tzv. \"nullable integer\", který se zapisuje s velkým \"I\". Když nevíš, jaký podtyp konkrétně, sáhni po `Int64`.\n", - "- totéž platí pro `runtimeMinutes`." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "startYear 2115.0\n", - "endYear 2027.0\n", - "runtimeMinutes 125156.0\n", - "dtype: float64" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles_raw[[\"startYear\", \"endYear\", \"runtimeMinutes\"]].max()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Mimochodem všimli jste si, že máme díla z budoucnosti (rok 2115)?" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "startYear\n", - "2020.0 340\n", - "2021.0 36\n", - "2022.0 14\n", - "2023.0 1\n", - "2024.0 2\n", - "2025.0 1\n", - "2115.0 1\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGsCAYAAAAhYYazAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqCElEQVR4nO3de1zVdZ7H8fcB5SApqCHghcR7FxXJC8OkTU4kKg83c2bXtUxjtFnLGpKspAuMNSOaydqumpPrJXe2vOya06RihprrxOaKUNl6N8MLoKZyFAuQ89s/fHjqBCocjhz4+no+Hufx6HzP9/c7n9/3ceS8+57v7/ezWZZlCQAAwBB+vi4AAADAmwg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAoN3W42bZtm0aMGKF27drJZrNp7dq1td6HZVl644031L17d9ntdrVv315//OMfvV8sAACokSa+LsCXSktLFR0drd/85jcaNWqUR/tITk7WRx99pDfeeEO9evXSmTNndObMGS9XCgAAasrGjTMvs9lsev/99zVy5EhXW1lZmV566SW99957OnfunHr27KlZs2bpvvvukyTt2bNHvXv31u7du9WjRw/fFA4AANzc1D9LXc9TTz2lnJwcrVixQl988YX+/u//XkOHDtWBAwckSX/961/VuXNnffjhh+rUqZOioqI0ceJEZm4AAPAhws1VFBQUaOnSpVq9erUGDRqkLl26aOrUqRo4cKCWLl0qSTp8+LC++eYbrV69WsuXL9eyZcuUm5urX//61z6uHgCAm9dNvebmWr788ktVVlaqe/fubu1lZWW69dZbJUlOp1NlZWVavny5q9/ixYvVt29f7du3j5+qAADwAcLNVVy4cEH+/v7Kzc2Vv7+/22vNmzeXJLVt21ZNmjRxC0B33HGHpMszP4QbAADqH+HmKmJiYlRZWamTJ09q0KBB1fa55557dOnSJR06dEhdunSRJO3fv1+S1LFjx3qrFQAA/OCmPlvqwoULOnjwoKTLYSYzM1ODBw9W69atddttt2ns2LH629/+pjlz5igmJkanTp1Sdna2evfurcTERDmdTvXv31/NmzfX3Llz5XQ6NXnyZAUHB+ujjz7y8dEBAHBzuqnDzdatWzV48OAq7ePHj9eyZctUUVGhP/zhD1q+fLmOHz+u0NBQ/exnP9P06dPVq1cvSdKJEyf09NNP66OPPtItt9yiYcOGac6cOWrdunV9Hw4AANBNHm4AAIB5OBUcAAAYxafhprb3dlqzZo0eeOABtWnTRsHBwYqLi9PGjRvrp1gAANAo+PRsqdre22nbtm164IEHNGPGDLVs2VJLly7ViBEj9NlnnykmJqZG7+l0OnXixAm1aNFCNputrocAAADqgWVZOn/+vNq1ayc/v2vPzTSYNTfV3dupJu666y6NHj1aaWlpNep/7NgxRUZGelAhAADwtaNHj6pDhw7X7NOor3PjdDp1/vz5a56ZVFZWprKyMtfzK1nu6NGjCg4OvuE1AgCAunM4HIqMjFSLFi2u27dRh5s33nhDFy5c0D/8wz9ctU9GRoamT59epT04OJhwAwBAI1OTJSWN9mypd999V9OnT9eqVasUFhZ21X6pqakqKSlxPY4ePVqPVQIAgPrWKGduVqxYoYkTJ2r16tWKj4+/Zl+73S673V5PlQEAAF9rdDM37733npKSkvTee+8pMTHR1+UAAIAGxqczNz++t5Mkff3118rPz3fd2yk1NVXHjx/X8uXLJV3+KWr8+PF68803FRsbq6KiIklSs2bNFBIS4pNjAAAADYtPZ2527typmJgY1zVqUlJSFBMT4zqtu7CwUAUFBa7+b7/9ti5duqTJkyerbdu2rkdycrJP6gcAAA1Pg7nOTX1xOBwKCQlRSUkJZ0sBANBI1Ob7u9GtuQEAALgWwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiN8saZAHA1UdPW+bqEWjsyk/vkAd7EzA0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwik/DzbZt2zRixAi1a9dONptNa9euve42W7du1d133y273a6uXbtq2bJlN7xOAADQePg03JSWlio6Olrz58+vUf+vv/5aiYmJGjx4sPLz8/XMM89o4sSJ2rhx4w2uFAAANBZNfPnmw4YN07Bhw2rcf+HCherUqZPmzJkjSbrjjju0fft2/fM//7MSEhJuVJkAAKARaVRrbnJychQfH+/WlpCQoJycnKtuU1ZWJofD4fYAAADmalThpqioSOHh4W5t4eHhcjgc+u6776rdJiMjQyEhIa5HZGRkfZQKAAB8pFGFG0+kpqaqpKTE9Th69KivSwIAADeQT9fc1FZERISKi4vd2oqLixUcHKxmzZpVu43dbpfdbq+P8gAAQAPQqGZu4uLilJ2d7da2adMmxcXF+agiAADQ0Pg03Fy4cEH5+fnKz8+XdPlU7/z8fBUUFEi6/JPSuHHjXP0nTZqkw4cP6/nnn9fevXu1YMECrVq1SlOmTPFF+QAAoAHyabjZuXOnYmJiFBMTI0lKSUlRTEyM0tLSJEmFhYWuoCNJnTp10rp167Rp0yZFR0drzpw5+rd/+zdOAwcAAC42y7IsXxdRnxwOh0JCQlRSUqLg4GBflwPAy6KmrfN1CbV2ZGair0sAGrzafH83qjU3AAAA10O4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARvF5uJk/f76ioqIUGBio2NhY7dix45r9586dqx49eqhZs2aKjIzUlClT9P3339dTtQAAoKHzabhZuXKlUlJSlJ6erl27dik6OloJCQk6efJktf3fffddTZs2Tenp6dqzZ48WL16slStX6sUXX6znygEAQEPl03CTmZmpxx9/XElJSbrzzju1cOFCBQUFacmSJdX2//TTT3XPPffo4YcfVlRUlIYMGaIxY8Zcd7YHAADcPHwWbsrLy5Wbm6v4+PgfivHzU3x8vHJycqrd5uc//7lyc3NdYebw4cNav369hg8fftX3KSsrk8PhcHsAAABzNfHVG58+fVqVlZUKDw93aw8PD9fevXur3ebhhx/W6dOnNXDgQFmWpUuXLmnSpEnX/FkqIyND06dP92rtAACg4fL5guLa2Lp1q2bMmKEFCxZo165dWrNmjdatW6fXXnvtqtukpqaqpKTE9Th69Gg9VgwAAOqbz2ZuQkND5e/vr+LiYrf24uJiRUREVLvNK6+8okcffVQTJ06UJPXq1UulpaX67W9/q5deekl+flWzmt1ul91u9/4BAACABslnMzcBAQHq27evsrOzXW1Op1PZ2dmKi4urdpuLFy9WCTD+/v6SJMuyblyxAACg0fDZzI0kpaSkaPz48erXr58GDBiguXPnqrS0VElJSZKkcePGqX379srIyJAkjRgxQpmZmYqJiVFsbKwOHjyoV155RSNGjHCFHAAAcHPzabgZPXq0Tp06pbS0NBUVFalPnz7KyspyLTIuKChwm6l5+eWXZbPZ9PLLL+v48eNq06aNRowYoT/+8Y++OgQAANDA2Kyb7Pcch8OhkJAQlZSUKDg42NflAPCyqGnrfF1CrR2ZmejrEoAGrzbf343qbCkAAIDrIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFI/CzeHDh71dBwAAgFd4FG66du2qwYMH689//rO+//57b9cEAADgMY/Cza5du9S7d2+lpKQoIiJC//RP/6QdO3Z4uzYAAIBa8yjc9OnTR2+++aZOnDihJUuWqLCwUAMHDlTPnj2VmZmpU6dOebtOAACAGqnTguImTZpo1KhRWr16tWbNmqWDBw9q6tSpioyM1Lhx41RYWOitOgEAAGqkTuFm586devLJJ9W2bVtlZmZq6tSpOnTokDZt2qQTJ07owQcf9FadAAAANdLEk40yMzO1dOlS7du3T8OHD9fy5cs1fPhw+fldzkqdOnXSsmXLFBUV5c1aAQAArsujcPPWW2/pN7/5jR577DG1bdu22j5hYWFavHhxnYoDAACoLY/CzYEDB67bJyAgQOPHj/dk9wAAAB7zaM3N0qVLtXr16irtq1ev1jvvvFPnogAAADzlUbjJyMhQaGholfawsDDNmDGjzkUBAAB4yqNwU1BQoE6dOlVp79ixowoKCupcFAAAgKc8CjdhYWH64osvqrR//vnnuvXWW+tcFAAAgKc8CjdjxozR7373O23ZskWVlZWqrKzU5s2blZycrH/8x3/0do0AAAA15tHZUq+99pqOHDmi+++/X02aXN6F0+nUuHHjWHMDAAB8yqNwExAQoJUrV+q1117T559/rmbNmqlXr17q2LGjt+sDAACoFY/CzRXdu3dX9+7dvVULAABAnXkUbiorK7Vs2TJlZ2fr5MmTcjqdbq9v3rzZK8UBAADUlkfhJjk5WcuWLVNiYqJ69uwpm83m7boAAAA84lG4WbFihVatWqXhw4d7ux4AAIA68ehU8ICAAHXt2tXbtQAAANSZR+Hm2Wef1ZtvvinLsrxdDwAAQJ149LPU9u3btWXLFm3YsEF33XWXmjZt6vb6mjVrvFIcAABAbXkUblq2bKmHHnrI27UAAADUmUfhZunSpd6uAwAAwCs8WnMjSZcuXdLHH3+sP/3pTzp//rwk6cSJE7pw4YLXigMAAKgtj2ZuvvnmGw0dOlQFBQUqKyvTAw88oBYtWmjWrFkqKyvTwoULvV0nAABAjXg0c5OcnKx+/frp7Nmzatasmav9oYceUnZ2tteKAwAAqC2PZm7++7//W59++qkCAgLc2qOionT8+HGvFAYAAOAJj2ZunE6nKisrq7QfO3ZMLVq0qNW+5s+fr6ioKAUGBio2NlY7duy4Zv9z585p8uTJatu2rex2u7p3767169fX6j0BAIC5PAo3Q4YM0dy5c13PbTabLly4oPT09FrdkmHlypVKSUlRenq6du3apejoaCUkJOjkyZPV9i8vL9cDDzygI0eO6D//8z+1b98+LVq0SO3bt/fkMAAAgIFslgeXGT527JgSEhJkWZYOHDigfv366cCBAwoNDdW2bdsUFhZWo/3Exsaqf//+mjdvnqTLM0KRkZF6+umnNW3atCr9Fy5cqNmzZ2vv3r1VLhxYUw6HQyEhISopKVFwcLBH+wDQcEVNW+frEmrtyMxEX5cANHi1+f72aOamQ4cO+vzzz/Xiiy9qypQpiomJ0cyZM5WXl1fjYFNeXq7c3FzFx8f/UIyfn+Lj45WTk1PtNh988IHi4uI0efJkhYeHq2fPnpoxY0a1P5FdUVZWJofD4fYAAADm8mhBsSQ1adJEY8eO9fiNT58+rcrKSoWHh7u1h4eHa+/evdVuc/jwYW3evFmPPPKI1q9fr4MHD+rJJ59URUWF0tPTq90mIyND06dP97hOAADQuHgUbpYvX37N18eNG+dRMdfjdDoVFhamt99+W/7+/urbt6+OHz+u2bNnXzXcpKamKiUlxfXc4XAoMjLyhtQHAAB8z6Nwk5yc7Pa8oqJCFy9eVEBAgIKCgmoUbkJDQ+Xv76/i4mK39uLiYkVERFS7Tdu2bdW0aVP5+/u72u644w4VFRWpvLy8yqnpkmS322W322tyWAAAwAAerbk5e/as2+PChQvat2+fBg4cqPfee69G+wgICFDfvn3dLvrndDqVnZ2tuLi4are55557dPDgQTmdTlfb/v371bZt22qDDQAAuPl4fG+pn+rWrZtmzpxZZVbnWlJSUrRo0SK988472rNnj5544gmVlpYqKSlJ0uWft1JTU139n3jiCZ05c0bJycnav3+/1q1bpxkzZmjy5MneOgwAANDIebyguNqdNWmiEydO1Lj/6NGjderUKaWlpamoqEh9+vRRVlaWa5FxQUGB/Px+yF+RkZHauHGjpkyZot69e6t9+/ZKTk7WCy+84M3DAAAAjZhH17n54IMP3J5blqXCwkLNmzdPkZGR2rBhg9cK9DaucwOYjevcAGaqzfe3RzM3I0eOdHtus9nUpk0b/fKXv9ScOXM82SUAAIBXeBRufrygFwAAoCHx2oJiAACAhsCjmZsfXxTvejIzMz15CwAAAI94FG7y8vKUl5eniooK9ejRQ9Ll6834+/vr7rvvdvWz2WzeqRIAAKCGPAo3I0aMUIsWLfTOO++oVatWki5f2C8pKUmDBg3Ss88+69UiAQAAasqjNTdz5sxRRkaGK9hIUqtWrfSHP/yBs6UAAIBPeRRuHA6HTp06VaX91KlTOn/+fJ2LAgAA8JRH4eahhx5SUlKS1qxZo2PHjunYsWP6r//6L02YMEGjRo3ydo0AAAA15tGam4ULF2rq1Kl6+OGHVVFRcXlHTZpowoQJmj17tlcLBAAAqA2Pwk1QUJAWLFig2bNn69ChQ5KkLl266JZbbvFqcQAAALVVp4v4FRYWqrCwUN26ddMtt9wiD25TBQAA4FUehZtvv/1W999/v7p3767hw4ersLBQkjRhwgROAwcAAD7lUbiZMmWKmjZtqoKCAgUFBbnaR48eraysLK8VBwAAUFserbn56KOPtHHjRnXo0MGtvVu3bvrmm2+8UhgAAIAnPJq5KS0tdZuxueLMmTOy2+11LgoAAMBTHoWbQYMGafny5a7nNptNTqdTr7/+ugYPHuy14gAAAGrLo5+lXn/9dd1///3auXOnysvL9fzzz+urr77SmTNn9Le//c3bNQIAANSYRzM3PXv21P79+zVw4EA9+OCDKi0t1ahRo5SXl6cuXbp4u0YAAIAaq/XMTUVFhYYOHaqFCxfqpZdeuhE1AQAAeKzWMzdNmzbVF198cSNqAQAAqDOPfpYaO3asFi9e7O1aAAAA6syjBcWXLl3SkiVL9PHHH6tv375V7imVmZnpleIAAABqq1bh5vDhw4qKitLu3bt19913S5L279/v1sdms3mvOgAAgFqqVbjp1q2bCgsLtWXLFkmXb7fwL//yLwoPD78hxQEAANRWrdbc/PSu3xs2bFBpaalXCwIAAKgLjxYUX/HTsAMAAOBrtQo3Nputypoa1tgAAICGpFZrbizL0mOPPea6Oeb333+vSZMmVTlbas2aNd6rEAAAoBZqFW7Gjx/v9nzs2LFeLQYAAKCuahVuli5deqPqAAAA8Io6LSgGAABoaAg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMEqDCDfz589XVFSUAgMDFRsbqx07dtRouxUrVshms2nkyJE3tkAAANBo+DzcrFy5UikpKUpPT9euXbsUHR2thIQEnTx58prbHTlyRFOnTtWgQYPqqVIAANAY+DzcZGZm6vHHH1dSUpLuvPNOLVy4UEFBQVqyZMlVt6msrNQjjzyi6dOnq3PnzvVYLQAAaOh8Gm7Ky8uVm5ur+Ph4V5ufn5/i4+OVk5Nz1e1effVVhYWFacKECdd9j7KyMjkcDrcHAAAwl0/DzenTp1VZWanw8HC39vDwcBUVFVW7zfbt27V48WItWrSoRu+RkZGhkJAQ1yMyMrLOdQMAgIbL5z9L1cb58+f16KOPatGiRQoNDa3RNqmpqSopKXE9jh49eoOrBAAAvtTEl28eGhoqf39/FRcXu7UXFxcrIiKiSv9Dhw7pyJEjGjFihKvN6XRKkpo0aaJ9+/apS5cubtvY7XbZ7fYbUD0AAGiIfDpzExAQoL59+yo7O9vV5nQ6lZ2drbi4uCr9b7/9dn355ZfKz893Pf7u7/5OgwcPVn5+Pj85AQAA387cSFJKSorGjx+vfv36acCAAZo7d65KS0uVlJQkSRo3bpzat2+vjIwMBQYGqmfPnm7bt2zZUpKqtAMAgJuTz8PN6NGjderUKaWlpamoqEh9+vRRVlaWa5FxQUGB/Pwa1dIgAADgQzbLsixfF1GfHA6HQkJCVFJSouDgYF+XA8DLoqat83UJtXZkZqKvSwAavNp8fzMlAgAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYJQmvi4AQMMVNW2dr0sAgFpj5gYAABiFcAMAAIxCuAEAAEZpEOFm/vz5ioqKUmBgoGJjY7Vjx46r9l20aJEGDRqkVq1aqVWrVoqPj79mfwAAcHPxebhZuXKlUlJSlJ6erl27dik6OloJCQk6efJktf23bt2qMWPGaMuWLcrJyVFkZKSGDBmi48eP13PlAACgIbJZlmX5soDY2Fj1799f8+bNkyQ5nU5FRkbq6aef1rRp0667fWVlpVq1aqV58+Zp3Lhx1+3vcDgUEhKikpISBQcH17l+wGScLVU/jsxM9HUJQINXm+9vn87clJeXKzc3V/Hx8a42Pz8/xcfHKycnp0b7uHjxoioqKtS6detqXy8rK5PD4XB7AAAAc/k03Jw+fVqVlZUKDw93aw8PD1dRUVGN9vHCCy+oXbt2bgHpxzIyMhQSEuJ6REZG1rluAADQcPl8zU1dzJw5UytWrND777+vwMDAavukpqaqpKTE9Th69Gg9VwkAAOqTT69QHBoaKn9/fxUXF7u1FxcXKyIi4prbvvHGG5o5c6Y+/vhj9e7d+6r97Ha77Ha7V+oFAAANn09nbgICAtS3b19lZ2e72pxOp7KzsxUXF3fV7V5//XW99tprysrKUr9+/eqjVAAA0Ej4/N5SKSkpGj9+vPr166cBAwZo7ty5Ki0tVVJSkiRp3Lhxat++vTIyMiRJs2bNUlpamt59911FRUW51uY0b95czZs399lxAACAhsHn4Wb06NE6deqU0tLSVFRUpD59+igrK8u1yLigoEB+fj9MML311lsqLy/Xr3/9a7f9pKen6/e//319lg4AABogn1/npr5xnRug5rjOTf3gOjfA9TWa69wAAAB4G+EGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjNLE1wUAN4uoaet8XQIA3BQIN2iUX7pHZib6ugQAQAPFz1IAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjMJdwdEoNcY7mQMA6gczNwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhRtnAoCPNcYbwR6ZmejrEoCrYuYGAAAYhXADAACM0iDCzfz58xUVFaXAwEDFxsZqx44d1+y/evVq3X777QoMDFSvXr20fv36eqoUAAA0dD4PNytXrlRKSorS09O1a9cuRUdHKyEhQSdPnqy2/6effqoxY8ZowoQJysvL08iRIzVy5Ejt3r27nisHAAANkc2yLMuXBcTGxqp///6aN2+eJMnpdCoyMlJPP/20pk2bVqX/6NGjVVpaqg8//NDV9rOf/Ux9+vTRwoULr/t+DodDISEhKikpUXBwsPcOpBFrjIsZAfgWC4pR32rz/e3Ts6XKy8uVm5ur1NRUV5ufn5/i4+OVk5NT7TY5OTlKSUlxa0tISNDatWur7V9WVqaysjLX85KSEkmXB+lG6Jm+8YbsFwAakhv1NxS4miufuZrMyfg03Jw+fVqVlZUKDw93aw8PD9fevXur3aaoqKja/kVFRdX2z8jI0PTp06u0R0ZGelg1ACBkrq8rwM3q/PnzCgkJuWYf469zk5qa6jbT43Q6debMGd16662y2Ww+rKzhcTgcioyM1NGjR/nJrh4x7r7BuNc/xtw3TBl3y7J0/vx5tWvX7rp9fRpuQkND5e/vr+LiYrf24uJiRUREVLtNRERErfrb7XbZ7Xa3tpYtW3pe9E0gODi4Uf8DaKwYd99g3OsfY+4bJoz79WZsrvDp2VIBAQHq27evsrOzXW1Op1PZ2dmKi4urdpu4uDi3/pK0adOmq/YHAAA3F5//LJWSkqLx48erX79+GjBggObOnavS0lIlJSVJksaNG6f27dsrIyNDkpScnKxf/OIXmjNnjhITE7VixQrt3LlTb7/9ti8PAwAANBA+DzejR4/WqVOnlJaWpqKiIvXp00dZWVmuRcMFBQXy8/thgunnP/+53n33Xb388st68cUX1a1bN61du1Y9e/b01SEYw263Kz09vcrPeLixGHffYNzrH2PuGzfjuPv8OjcAAADe5PMrFAMAAHgT4QYAABiFcAMAAIxCuAEAAEYh3Bhm27ZtGjFihNq1ayebzVblnlvFxcV67LHH1K5dOwUFBWno0KE6cOCAW5/vv/9ekydP1q233qrmzZvrV7/6VZULJxYUFCgxMVFBQUEKCwvTc889p0uXLt3ow2uwvDHu9913n2w2m9tj0qRJbn0Y9x9kZGSof//+atGihcLCwjRy5Ejt27fPrY+3Pstbt27V3XffLbvdrq5du2rZsmU3+vAaLG+N+08/6zabTStWrHDrw7hfVpMxf/vtt3XfffcpODhYNptN586dq7KfM2fO6JFHHlFwcLBatmypCRMm6MKFC259vvjiCw0aNEiBgYGKjIzU66+/fiMP7YYh3BimtLRU0dHRmj9/fpXXLMvSyJEjdfjwYf3lL39RXl6eOnbsqPj4eJWWlrr6TZkyRX/961+1evVqffLJJzpx4oRGjRrler2yslKJiYkqLy/Xp59+qnfeeUfLli1TWlpavRxjQ+SNcZekxx9/XIWFha7Hj/+wMO7uPvnkE02ePFn/8z//o02bNqmiokJDhgzx+mf566+/VmJiogYPHqz8/Hw988wzmjhxojZuvDlvkuuNcb9i6dKlbp/3kSNHul5j3H9QkzG/ePGihg4dqhdffPGq+3nkkUf01VdfadOmTfrwww+1bds2/fa3v3W97nA4NGTIEHXs2FG5ubmaPXu2fv/73zfO68hZMJYk6/3333c937dvnyXJ2r17t6utsrLSatOmjbVo0SLLsizr3LlzVtOmTa3Vq1e7+uzZs8eSZOXk5FiWZVnr16+3/Pz8rKKiIleft956ywoODrbKyspu8FE1fJ6Mu2VZ1i9+8QsrOTn5qvtl3K/t5MmTliTrk08+sSzLe5/l559/3rrrrrvc3mv06NFWQkLCjT6kRsGTcbesqv9Ofopxv7qfjvmPbdmyxZJknT171q39//7v/yxJ1v/+7/+62jZs2GDZbDbr+PHjlmVZ1oIFC6xWrVq5/T154YUXrB49etyYA7mBmLm5iZSVlUmSAgMDXW1+fn6y2+3avn27JCk3N1cVFRWKj4939bn99tt12223KScnR5KUk5OjXr16ud2dPSEhQQ6HQ1999VV9HEqjUpNxv+I//uM/FBoaqp49eyo1NVUXL150vca4X1tJSYkkqXXr1pK891nOyclx28eVPlf2cbPzZNyvmDx5skJDQzVgwAAtWbJE1o8uu8a4X91Px7wmcnJy1LJlS/Xr18/VFh8fLz8/P3322WeuPvfee68CAgJcfRISErRv3z6dPXvWS9XXD8LNTeTKH5jU1FSdPXtW5eXlmjVrlo4dO6bCwkJJUlFRkQICAqrcXDQ8PFxFRUWuPj/+Mrjy+pXX4K4m4y5JDz/8sP785z9ry5YtSk1N1b//+79r7NixrtcZ96tzOp165plndM8997iuVu6tz/LV+jgcDn333Xc34nAaDU/HXZJeffVVrVq1Sps2bdKvfvUrPfnkk/rXf/1X1+uMe/WqG/OaKCoqUlhYmFtbkyZN1Lp1ayP/tvv89guoP02bNtWaNWs0YcIEtW7dWv7+/oqPj9ewYcPc/o8J3lXTcf/xb9+9evVS27Ztdf/99+vQoUPq0qWLL0pvNCZPnqzdu3dXmQnDjVWXcX/llVdc/x0TE6PS0lLNnj1bv/vd77xZonH4rNcMMzc3mb59+yo/P1/nzp1TYWGhsrKy9O2336pz586SpIiICJWXl1dZaV9cXKyIiAhXn5+e+XDl+ZU+cHe9ca9ObGysJOngwYOSGPereeqpp/Thhx9qy5Yt6tChg6vdW5/lq/UJDg5Ws2bNvH04jUZdxr06sbGxOnbsmOtnXMa9qquNeU1ERETo5MmTbm2XLl3SmTNnjPzbTri5SYWEhKhNmzY6cOCAdu7cqQcffFDS5S/hpk2bKjs729V33759KigoUFxcnCQpLi5OX375pds/lE2bNik4OFh33nln/R5II3O1ca9Ofn6+JKlt27aSGPefsixLTz31lN5//31t3rxZnTp1cnvdW5/luLg4t31c6XNlHzcbb4x7dfLz89WqVSvXzR0Z9x9cb8xrIi4uTufOnVNubq6rbfPmzXI6na7/kYqLi9O2bdtUUVHh6rNp0yb16NFDrVq1qvuB1CdfrmaG950/f97Ky8uz8vLyLElWZmamlZeXZ33zzTeWZVnWqlWrrC1btliHDh2y1q5da3Xs2NEaNWqU2z4mTZpk3XbbbdbmzZutnTt3WnFxcVZcXJzr9UuXLlk9e/a0hgwZYuXn51tZWVlWmzZtrNTU1Ho91oakruN+8OBB69VXX7V27txpff3119Zf/vIXq3Pnzta9997r6sO4u3viiSeskJAQa+vWrVZhYaHrcfHiRVcfb3yWDx8+bAUFBVnPPfectWfPHmv+/PmWv7+/lZWVVa/H21B4Y9w/+OADa9GiRdaXX35pHThwwFqwYIEVFBRkpaWlufow7j+oyZgXFhZaeXl51qJFiyxJ1rZt26y8vDzr22+/dfUZOnSoFRMTY3322WfW9u3brW7dulljxoxxvX7u3DkrPDzcevTRR63du3dbK1assIKCgqw//elP9Xq83kC4McyV0wB/+hg/frxlWZb15ptvWh06dLCaNm1q3XbbbdbLL79c5TTi7777znryySetVq1aWUFBQdZDDz1kFRYWuvU5cuSINWzYMKtZs2ZWaGio9eyzz1oVFRX1dZgNTl3HvaCgwLr33nut1q1bW3a73eratav13HPPWSUlJW7vw7j/oLrxlmQtXbrU1cdbn+UtW7ZYffr0sQICAqzOnTu7vcfNxhvjvmHDBqtPnz5W8+bNrVtuucWKjo62Fi5caFVWVrq9F+N+WU3GPD09/bp9vv32W2vMmDFW8+bNreDgYCspKck6f/6823t9/vnn1sCBAy273W61b9/emjlzZj0dpXfZLIuVpAAAwBysuQEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKP8P5IDHPkhK2PQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "imdb_titles_raw[\"startYear\"].plot.hist()\n", - "imdb_titles_raw.query(\"startYear > 2019\")[\"startYear\"].value_counts().sort_index()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Takhle nějak by přetypování mohlo vypadat:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tconst object\n", - "titleType category\n", - "primaryTitle object\n", - "originalTitle object\n", - "isAdult bool\n", - "startYear Int64\n", - "endYear Int64\n", - "runtimeMinutes Int64\n", - "genres object\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(\n", - " imdb_titles_raw\n", - " .assign(\n", - " titleType=imdb_titles_raw[\"titleType\"].astype(\"category\"),\n", - " startYear=imdb_titles_raw[\"startYear\"].astype(\"Int64\"),\n", - " endYear=imdb_titles_raw[\"endYear\"].astype(\"Int64\"),\n", - " isAdult=imdb_titles_raw[\"isAdult\"].astype(bool),\n", - " runtimeMinutes=imdb_titles_raw[\"runtimeMinutes\"].astype(\"Int64\")\n", - " )\n", - ").dtypes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Takhle už by to mohlo být. Jen si ještě:\n", - "\n", - "- pro přehlednost přejmenujeme některé sloupce (pomocí metody [`rename`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html))\n", - "- použijeme `tconst` jako index\n", - "\n", - "A tabulka `imdb_titles` bude připravená k použití!" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
title_typetitleoriginal_titleis_adultstart_yearend_yearlengthgenres
tconst
tt0000001shortCarmencitaCarmencitaFalse1894<NA>1Documentary,Short
tt0000002shortLe clown et ses chiensLe clown et ses chiensFalse1892<NA>5Animation,Short
tt0000003shortPauvre PierrotPauvre PierrotFalse1892<NA>4Animation,Comedy,Romance
tt0000004shortUn bon bockUn bon bockFalse1892<NA><NA>Animation,Short
tt0000005shortBlacksmith SceneBlacksmith SceneFalse1893<NA>1Comedy,Short
...........................
tt9916734videoManca: PeleoManca: PeleoFalse2018<NA><NA>Music,Short
tt9916754movieChico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA><NA>Documentary
tt9916756shortPretty Pretty Black GirlPretty Pretty Black GirlFalse2019<NA><NA>Short
tt9916764short3838False2018<NA><NA>Short
tt9916856shortThe WindThe WindFalse2015<NA>27Short
\n", - "

1783516 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title_type title \\\n", - "tconst \n", - "tt0000001 short Carmencita \n", - "tt0000002 short Le clown et ses chiens \n", - "tt0000003 short Pauvre Pierrot \n", - "tt0000004 short Un bon bock \n", - "tt0000005 short Blacksmith Scene \n", - "... ... ... \n", - "tt9916734 video Manca: Peleo \n", - "tt9916754 movie Chico Albuquerque - Revelações \n", - "tt9916756 short Pretty Pretty Black Girl \n", - "tt9916764 short 38 \n", - "tt9916856 short The Wind \n", - "\n", - " original_title is_adult start_year end_year \\\n", - "tconst \n", - "tt0000001 Carmencita False 1894 \n", - "tt0000002 Le clown et ses chiens False 1892 \n", - "tt0000003 Pauvre Pierrot False 1892 \n", - "tt0000004 Un bon bock False 1892 \n", - "tt0000005 Blacksmith Scene False 1893 \n", - "... ... ... ... ... \n", - "tt9916734 Manca: Peleo False 2018 \n", - "tt9916754 Chico Albuquerque - Revelações False 2013 \n", - "tt9916756 Pretty Pretty Black Girl False 2019 \n", - "tt9916764 38 False 2018 \n", - "tt9916856 The Wind False 2015 \n", - "\n", - " length genres \n", - "tconst \n", - "tt0000001 1 Documentary,Short \n", - "tt0000002 5 Animation,Short \n", - "tt0000003 4 Animation,Comedy,Romance \n", - "tt0000004 Animation,Short \n", - "tt0000005 1 Comedy,Short \n", - "... ... ... \n", - "tt9916734 Music,Short \n", - "tt9916754 Documentary \n", - "tt9916756 Short \n", - "tt9916764 Short \n", - "tt9916856 27 Short \n", - "\n", - "[1783516 rows x 8 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_titles = (\n", - " imdb_titles_raw\n", - " .assign(\n", - " titleType=imdb_titles_raw[\"titleType\"].astype(\"category\"),\n", - " startYear=imdb_titles_raw[\"startYear\"].astype(\"Int64\"),\n", - " endYear=imdb_titles_raw[\"endYear\"].astype(\"Int64\"),\n", - " isAdult=imdb_titles_raw[\"isAdult\"].astype(bool),\n", - " runtimeMinutes=imdb_titles_raw[\"runtimeMinutes\"].astype(\"Int64\")\n", - " )\n", - " .rename({\n", - " \"primaryTitle\": \"title\",\n", - " \"originalTitle\": \"original_title\",\n", - " \"titleType\": \"title_type\",\n", - " \"runtimeMinutes\": \"length\",\n", - " \"startYear\": \"start_year\",\n", - " \"endYear\": \"end_year\",\n", - " \"isAdult\": \"is_adult\",\n", - " }, axis=\"columns\")\n", - " .set_index(\"tconst\")\n", - ")\n", - "imdb_titles" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "537.2908029556274" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Kolik tabulka zabírá megabajtů paměti?\n", - "imdb_titles.memory_usage(deep=True).sum() / 2**20 # O chlup méně, zase tolik jsme si ale nepomohli." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Připravíme si ještě speciální tabulku jenom pro filmy, protože další datové sady se zabývají jenom jimi.\n", - "\n", - "U této tabulky navíc vyhodíme zbytečné sloupce `title_type`, `end_year` a přejmenujeme `start_year` prostě na `year`:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenres
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama
tt0000502BohemiosBohemiosFalse1905100NaN
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama
.....................
tt9916622Rodolpho Teóphilo - O Legado de um PioneiroRodolpho Teóphilo - O Legado de um PioneiroFalse2015<NA>Documentary
tt9916680De la ilusión al desconcierto: cine colombiano...De la ilusión al desconcierto: cine colombiano...False2007100Documentary
tt9916706Dankyavar DankaDankyavar DankaFalse2013<NA>Comedy
tt99167306 Gunn6 GunnFalse2017116NaN
tt9916754Chico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA>Documentary
\n", - "

514654 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - " title \\\n", - "tconst \n", - "tt0000009 Miss Jerry \n", - "tt0000147 The Corbett-Fitzsimmons Fight \n", - "tt0000335 Soldiers of the Cross \n", - "tt0000502 Bohemios \n", - "tt0000574 The Story of the Kelly Gang \n", - "... ... \n", - "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro \n", - "tt9916680 De la ilusión al desconcierto: cine colombiano... \n", - "tt9916706 Dankyavar Danka \n", - "tt9916730 6 Gunn \n", - "tt9916754 Chico Albuquerque - Revelações \n", - "\n", - " original_title is_adult year \\\n", - "tconst \n", - "tt0000009 Miss Jerry False 1894 \n", - "tt0000147 The Corbett-Fitzsimmons Fight False 1897 \n", - "tt0000335 Soldiers of the Cross False 1900 \n", - "tt0000502 Bohemios False 1905 \n", - "tt0000574 The Story of the Kelly Gang False 1906 \n", - "... ... ... ... \n", - "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro False 2015 \n", - "tt9916680 De la ilusión al desconcierto: cine colombiano... False 2007 \n", - "tt9916706 Dankyavar Danka False 2013 \n", - "tt9916730 6 Gunn False 2017 \n", - "tt9916754 Chico Albuquerque - Revelações False 2013 \n", - "\n", - " length genres \n", - "tconst \n", - "tt0000009 45 Romance \n", - "tt0000147 20 Documentary,News,Sport \n", - "tt0000335 Biography,Drama \n", - "tt0000502 100 NaN \n", - "tt0000574 70 Biography,Crime,Drama \n", - "... ... ... \n", - "tt9916622 Documentary \n", - "tt9916680 100 Documentary \n", - "tt9916706 Comedy \n", - "tt9916730 116 NaN \n", - "tt9916754 Documentary \n", - "\n", - "[514654 rows x 6 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "movies = (\n", - " imdb_titles\n", - " .query(\"title_type == 'movie'\")\n", - " .drop([\"title_type\", \"end_year\"], axis=\"columns\")\n", - " .rename({\"start_year\": \"year\"}, axis=\"columns\")\n", - ")\n", - "movies" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(514654, 6)\n", - "title object\n", - "original_title object\n", - "is_adult bool\n", - "year Int64\n", - "length Int64\n", - "genres object\n", - "dtype: object\n" - ] - } - ], - "source": [ - "print(movies.shape)\n", - "print(movies.dtypes)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Nyní se podíváme na zoubek hodnocením z IMDb, na tabulky `imdb_ratings_raw`:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tconstaverageRatingnumVotes
0tt00000015.81486
1tt00000026.4179
2tt00000036.61117
3tt00000046.4109
4tt00000056.21820
............
923691tt99163809.758
923692tt99164207.05
923693tt99164609.212
923694tt99167205.211
923695tt99167667.25
\n", - "

923696 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " tconst averageRating numVotes\n", - "0 tt0000001 5.8 1486\n", - "1 tt0000002 6.4 179\n", - "2 tt0000003 6.6 1117\n", - "3 tt0000004 6.4 109\n", - "4 tt0000005 6.2 1820\n", - "... ... ... ...\n", - "923691 tt9916380 9.7 58\n", - "923692 tt9916420 7.0 5\n", - "923693 tt9916460 9.2 12\n", - "923694 tt9916720 5.2 11\n", - "923695 tt9916766 7.2 5\n", - "\n", - "[923696 rows x 3 columns]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_ratings_raw" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tconst object\n", - "averageRating float64\n", - "numVotes int64\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imdb_ratings_raw.dtypes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To by vlastně skoro mohlo být!\n", - "\n", - "Tak jen nastavíme index (opět `tconst`) a přejmenujeme sloupce:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
imdb_ratingimdb_votes
tconst
tt00000015.81486
tt00000026.4179
tt00000036.61117
tt00000046.4109
tt00000056.21820
.........
tt99163809.758
tt99164207.05
tt99164609.212
tt99167205.211
tt99167667.25
\n", - "

923696 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " imdb_rating imdb_votes\n", - "tconst \n", - "tt0000001 5.8 1486\n", - "tt0000002 6.4 179\n", - "tt0000003 6.6 1117\n", - "tt0000004 6.4 109\n", - "tt0000005 6.2 1820\n", - "... ... ...\n", - "tt9916380 9.7 58\n", - "tt9916420 7.0 5\n", - "tt9916460 9.2 12\n", - "tt9916720 5.2 11\n", - "tt9916766 7.2 5\n", - "\n", - "[923696 rows x 2 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ratings = (imdb_ratings_raw\n", - " .rename({\n", - " \"averageRating\": \"imdb_rating\",\n", - " \"numVotes\": \"imdb_votes\"\n", - " }, axis=\"columns\")\n", - " .set_index(\"tconst\")\n", - ")\n", - "ratings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### První join\n", - "\n", - "Máme připravené dvě krásné tabulky, které sdílejí stejný index, a můžeme vesele spojovat. Protože pomocí `join`, `merge` a `concat` lze volbou vhodných parametrů dosáhnout identického výsledku (což je jedním z nešvarů knihovny `pandas`), ukážeme si všechny tři alternativy podle subjektivního pořadí vhodnosti." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577.0
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289.0
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339.0
tt0000502BohemiosBohemiosFalse1905100NaNNaNNaN
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505.0
...........................
tt9916622Rodolpho Teóphilo - O Legado de um PioneiroRodolpho Teóphilo - O Legado de um PioneiroFalse2015<NA>DocumentaryNaNNaN
tt9916680De la ilusión al desconcierto: cine colombiano...De la ilusión al desconcierto: cine colombiano...False2007100DocumentaryNaNNaN
tt9916706Dankyavar DankaDankyavar DankaFalse2013<NA>ComedyNaNNaN
tt99167306 Gunn6 GunnFalse2017116NaNNaNNaN
tt9916754Chico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA>DocumentaryNaNNaN
\n", - "

514654 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title \\\n", - "tconst \n", - "tt0000009 Miss Jerry \n", - "tt0000147 The Corbett-Fitzsimmons Fight \n", - "tt0000335 Soldiers of the Cross \n", - "tt0000502 Bohemios \n", - "tt0000574 The Story of the Kelly Gang \n", - "... ... \n", - "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro \n", - "tt9916680 De la ilusión al desconcierto: cine colombiano... \n", - "tt9916706 Dankyavar Danka \n", - "tt9916730 6 Gunn \n", - "tt9916754 Chico Albuquerque - Revelações \n", - "\n", - " original_title is_adult year \\\n", - "tconst \n", - "tt0000009 Miss Jerry False 1894 \n", - "tt0000147 The Corbett-Fitzsimmons Fight False 1897 \n", - "tt0000335 Soldiers of the Cross False 1900 \n", - "tt0000502 Bohemios False 1905 \n", - "tt0000574 The Story of the Kelly Gang False 1906 \n", - "... ... ... ... \n", - "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro False 2015 \n", - "tt9916680 De la ilusión al desconcierto: cine colombiano... False 2007 \n", - "tt9916706 Dankyavar Danka False 2013 \n", - "tt9916730 6 Gunn False 2017 \n", - "tt9916754 Chico Albuquerque - Revelações False 2013 \n", - "\n", - " length genres imdb_rating imdb_votes \n", - "tconst \n", - "tt0000009 45 Romance 5.5 77.0 \n", - "tt0000147 20 Documentary,News,Sport 5.2 289.0 \n", - "tt0000335 Biography,Drama 6.3 39.0 \n", - "tt0000502 100 NaN NaN NaN \n", - "tt0000574 70 Biography,Crime,Drama 6.2 505.0 \n", - "... ... ... ... ... \n", - "tt9916622 Documentary NaN NaN \n", - "tt9916680 100 Documentary NaN NaN \n", - "tt9916706 Comedy NaN NaN \n", - "tt9916730 116 NaN NaN NaN \n", - "tt9916754 Documentary NaN NaN \n", - "\n", - "[514654 rows x 8 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "movies.join(ratings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "K tabulce se nenápadně přidaly dva sloupce z tabulky `ratings`, a to takovým způsobem, že se porovnaly hodnoty indexu (tedy `tconst`) a spárovaly se ty části řádku, kde se tento index shoduje.\n", - "\n", - "💡 Uvědom si (ačkoliv z volání funkcí v `pandas` to není úplně zřejmé), že se tady děje něco fundamentálně odlišného od \"nalepení doprava\" - tabulky tu nejsou chápány jako čtverečky, které jde skládat jako lego, nýbrž jako zdroj údajů o jednotlivých objektech, které je potřeba spojit sémanticky.\n", - "\n", - "Jak ale vidíš, tabulka obsahuje spoustu řádků, kde ve sloupcích s hodnocením chybí hodnoty (respektive nachází se `NaN`). To vychází ze způsobu, jakým metoda `join` ve výchozím nastavení \"joinuje\" - použije všechny řádky z levé tabulky bez ohledu na to, jestli jim odpovídá nějaký protějšek v tabulce pravé. Naštěstí lze pomocí argumentu `how` specifikovat i jiné způsoby spojování:\n", - "\n", - "- `left` (výchozí pro metodu `join`) - vezmou se všechny prvky z levé tabulky a jim odpovídající prvky z pravé tabulky (kde nejsou, doplní se `NaN`)\n", - "- `right` - vezmou se všechny prvky z pravé tabulky a jim odpovídající prvky z levé tabulky (kde nejsou, doplní se `NaN`)\n", - "- `inner` (výchozí pro funkci `merge`) - vezmou se jen ty prvky, které jsou v levé i pravé tabulce.\n", - "- `outer` (výchozí pro funkci `concat`) - vezmou se všechny prvky, z levé i pravé tabulky, kde něco chybí, doplní se `NaN`.\n", - "\n", - "V podobě Vennově diagramu, kde kruhy představují množiny řádků v obou zdrojových tabulkách a modrou barvou jsou zvýrazněny řádky v tabulce cílové:\n", - "\n", - "![Typy joinů](static/joins.svg)\n", - "\n", - "*Obrázek adaptován z https://upload.wikimedia.org/wikipedia/commons/9/9d/SQL_Joins.svg (autor: Arbeck)*\n", - "\n", - "💡 Až budeme probírat databáze, tyto čtyři typu joinů se nám znovu vynoří.\n", - "\n", - "Následující výpis ukáže, kolik řádků bychom dostali při použití různých hodnot `how`:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "movies.join(ratings, how=\"left\"): 514654 řádků.\n", - "movies.join(ratings, how=\"right\"): 923696 řádků.\n", - "movies.join(ratings, how=\"inner\"): 232496 řádků.\n", - "movies.join(ratings, how=\"outer\"): 1205854 řádků.\n" - ] - } - ], - "source": [ - "for how in [\"left\", \"right\", \"inner\", \"outer\"]:\n", - " print(f\"movies.join(ratings, how=\\\"{how}\\\"):\", movies.join(ratings, how=how).shape[0], \"řádků.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A teď tedy ty tři alternativy:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", - "

232496 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title \\\n", - "tconst \n", - "tt0000009 Miss Jerry Miss Jerry \n", - "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", - "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", - "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", - "tt0000615 Robbery Under Arms Robbery Under Arms \n", - "... ... ... \n", - "tt9910930 Jeg ser deg Jeg ser deg \n", - "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", - "tt9913056 Swarm Season Swarm Season \n", - "tt9913084 Diabolik sono io Diabolik sono io \n", - "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", - "\n", - " is_adult year length genres imdb_rating \\\n", - "tconst \n", - "tt0000009 False 1894 45 Romance 5.5 \n", - "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", - "tt0000335 False 1900 Biography,Drama 6.3 \n", - "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", - "tt0000615 False 1907 Drama 4.8 \n", - "... ... ... ... ... ... \n", - "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", - "tt9911774 False 2019 130 Drama 8.5 \n", - "tt9913056 False 2019 86 Documentary 6.2 \n", - "tt9913084 False 2019 75 Documentary 6.2 \n", - "tt9914286 False 2019 98 Drama,Family 9.8 \n", - "\n", - " imdb_votes \n", - "tconst \n", - "tt0000009 77 \n", - "tt0000147 289 \n", - "tt0000335 39 \n", - "tt0000574 505 \n", - "tt0000615 14 \n", - "... ... \n", - "tt9910930 5 \n", - "tt9911774 363 \n", - "tt9913056 5 \n", - "tt9913084 6 \n", - "tt9914286 72 \n", - "\n", - "[232496 rows x 8 columns]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Alternativa 1 (preferovaná)\n", - "movies_with_rating = movies.join(ratings, how=\"inner\")\n", - "movies_with_rating" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", - "

232496 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title \\\n", - "tconst \n", - "tt0000009 Miss Jerry Miss Jerry \n", - "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", - "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", - "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", - "tt0000615 Robbery Under Arms Robbery Under Arms \n", - "... ... ... \n", - "tt9910930 Jeg ser deg Jeg ser deg \n", - "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", - "tt9913056 Swarm Season Swarm Season \n", - "tt9913084 Diabolik sono io Diabolik sono io \n", - "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", - "\n", - " is_adult year length genres imdb_rating \\\n", - "tconst \n", - "tt0000009 False 1894 45 Romance 5.5 \n", - "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", - "tt0000335 False 1900 Biography,Drama 6.3 \n", - "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", - "tt0000615 False 1907 Drama 4.8 \n", - "... ... ... ... ... ... \n", - "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", - "tt9911774 False 2019 130 Drama 8.5 \n", - "tt9913056 False 2019 86 Documentary 6.2 \n", - "tt9913084 False 2019 75 Documentary 6.2 \n", - "tt9914286 False 2019 98 Drama,Family 9.8 \n", - "\n", - " imdb_votes \n", - "tconst \n", - "tt0000009 77 \n", - "tt0000147 289 \n", - "tt0000335 39 \n", - "tt0000574 505 \n", - "tt0000615 14 \n", - "... ... \n", - "tt9910930 5 \n", - "tt9911774 363 \n", - "tt9913056 5 \n", - "tt9913084 6 \n", - "tt9914286 72 \n", - "\n", - "[232496 rows x 8 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Alternativa 2 (taky dobrá)\n", - "pd.merge(movies, ratings, left_index=True, right_index=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", - "

232496 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title \\\n", - "tconst \n", - "tt0000009 Miss Jerry Miss Jerry \n", - "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", - "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", - "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", - "tt0000615 Robbery Under Arms Robbery Under Arms \n", - "... ... ... \n", - "tt9910930 Jeg ser deg Jeg ser deg \n", - "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", - "tt9913056 Swarm Season Swarm Season \n", - "tt9913084 Diabolik sono io Diabolik sono io \n", - "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", - "\n", - " is_adult year length genres imdb_rating \\\n", - "tconst \n", - "tt0000009 False 1894 45 Romance 5.5 \n", - "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", - "tt0000335 False 1900 Biography,Drama 6.3 \n", - "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", - "tt0000615 False 1907 Drama 4.8 \n", - "... ... ... ... ... ... \n", - "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", - "tt9911774 False 2019 130 Drama 8.5 \n", - "tt9913056 False 2019 86 Documentary 6.2 \n", - "tt9913084 False 2019 75 Documentary 6.2 \n", - "tt9914286 False 2019 98 Drama,Family 9.8 \n", - "\n", - " imdb_votes \n", - "tconst \n", - "tt0000009 77 \n", - "tt0000147 289 \n", - "tt0000335 39 \n", - "tt0000574 505 \n", - "tt0000615 14 \n", - "... ... \n", - "tt9910930 5 \n", - "tt9911774 363 \n", - "tt9913056 5 \n", - "tt9913084 6 \n", - "tt9914286 72 \n", - "\n", - "[232496 rows x 8 columns]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Alternativa 3 (méně \"sémantická\")\n", - "pd.concat([movies, ratings], axis=\"columns\", join=\"inner\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zkusme si zreprodukovat pořadí 250 nejlepších filmů z IMDb (viz https://www.imdb.com/chart/top/?ref_=nv_mv_250):" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
0The Chaos ClassHababam SinifiFalse197587Comedy,Drama9.433394
1The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.32071759
2The Mountain IIDag IIFalse2016135Action,Drama,War9.3100095
3CM101MMXI FundamentalsCM101MMXI FundamentalsFalse2013139Comedy,Documentary9.241327
4The GodfatherThe GodfatherFalse1972175Crime,Drama9.21421495
...........................
24512 Years a Slave12 Years a SlaveFalse2013134Biography,Drama,History8.1571204
246The Sixth SenseThe Sixth SenseFalse1999107Drama,Mystery,Thriller8.1836928
247The Passion of Joan of ArcLa passion de Jeanne d'ArcFalse1928110Biography,Drama,History8.140107
248Barfi!Barfi!False2012151Comedy,Drama,Romance8.168274
249PlatoonPlatoonFalse1986120Drama,War8.1348628
\n", - "

250 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year \\\n", - "0 The Chaos Class Hababam Sinifi False 1975 \n", - "1 The Shawshank Redemption The Shawshank Redemption False 1994 \n", - "2 The Mountain II Dag II False 2016 \n", - "3 CM101MMXI Fundamentals CM101MMXI Fundamentals False 2013 \n", - "4 The Godfather The Godfather False 1972 \n", - ".. ... ... ... ... \n", - "245 12 Years a Slave 12 Years a Slave False 2013 \n", - "246 The Sixth Sense The Sixth Sense False 1999 \n", - "247 The Passion of Joan of Arc La passion de Jeanne d'Arc False 1928 \n", - "248 Barfi! Barfi! False 2012 \n", - "249 Platoon Platoon False 1986 \n", - "\n", - " length genres imdb_rating imdb_votes \n", - "0 87 Comedy,Drama 9.4 33394 \n", - "1 142 Drama 9.3 2071759 \n", - "2 135 Action,Drama,War 9.3 100095 \n", - "3 139 Comedy,Documentary 9.2 41327 \n", - "4 175 Crime,Drama 9.2 1421495 \n", - ".. ... ... ... ... \n", - "245 134 Biography,Drama,History 8.1 571204 \n", - "246 107 Drama,Mystery,Thriller 8.1 836928 \n", - "247 110 Biography,Drama,History 8.1 40107 \n", - "248 151 Comedy,Drama,Romance 8.1 68274 \n", - "249 120 Drama,War 8.1 348628 \n", - "\n", - "[250 rows x 8 columns]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Ty nejlepší (do června 2019)\n", - "(movies_with_rating\n", - " .query(\"imdb_votes > 25000\") # Berou se jen filmy s více než 25000 hlasy\n", - " .sort_values(\"imdb_rating\", ascending=False) # IMDb tu použivá i váhu jednotlivých hlasů (kterou neznáme)\n", - " .reset_index(drop=True)\n", - ").iloc[:250]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Do výčtu se nám dostaly filmy, které hranici hlasů nepřekračují o moc. Máme důvodné podezření, že toto kritérium dávno změnili. S požadovanými 250 000 hlasy se už blížíme:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
0The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.32071759
1The GodfatherThe GodfatherFalse1972175Crime,Drama9.21421495
2The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.02037678
3The Godfather: Part IIThe Godfather: Part IIFalse1974202Crime,Drama9.0986451
4Pulp FictionPulp FictionFalse1994154Crime,Drama8.91620135
...........................
245Ocean's ElevenOcean's ElevenFalse2001116Crime,Thriller7.8470530
246Lost in TranslationLost in TranslationFalse2003102Drama7.8371577
247Donnie BrascoDonnie BrascoFalse1997127Biography,Crime,Drama7.8253811
248Captain PhillipsCaptain PhillipsFalse2013134Biography,Drama,Thriller7.8384378
249How to Train Your Dragon 2How to Train Your Dragon 2False2014102Action,Adventure,Animation7.8273406
\n", - "

250 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year \\\n", - "0 The Shawshank Redemption The Shawshank Redemption False 1994 \n", - "1 The Godfather The Godfather False 1972 \n", - "2 The Dark Knight The Dark Knight False 2008 \n", - "3 The Godfather: Part II The Godfather: Part II False 1974 \n", - "4 Pulp Fiction Pulp Fiction False 1994 \n", - ".. ... ... ... ... \n", - "245 Ocean's Eleven Ocean's Eleven False 2001 \n", - "246 Lost in Translation Lost in Translation False 2003 \n", - "247 Donnie Brasco Donnie Brasco False 1997 \n", - "248 Captain Phillips Captain Phillips False 2013 \n", - "249 How to Train Your Dragon 2 How to Train Your Dragon 2 False 2014 \n", - "\n", - " length genres imdb_rating imdb_votes \n", - "0 142 Drama 9.3 2071759 \n", - "1 175 Crime,Drama 9.2 1421495 \n", - "2 152 Action,Crime,Drama 9.0 2037678 \n", - "3 202 Crime,Drama 9.0 986451 \n", - "4 154 Crime,Drama 8.9 1620135 \n", - ".. ... ... ... ... \n", - "245 116 Crime,Thriller 7.8 470530 \n", - "246 102 Drama 7.8 371577 \n", - "247 127 Biography,Crime,Drama 7.8 253811 \n", - "248 134 Biography,Drama,Thriller 7.8 384378 \n", - "249 102 Action,Adventure,Animation 7.8 273406 \n", - "\n", - "[250 rows x 8 columns]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(movies_with_rating\n", - " .query(\"imdb_votes > 250000\")\n", - " .sort_values(\"imdb_rating\", ascending=False)\n", - " .reset_index(drop=True)\n", - ").iloc[:250]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Druhý join\n", - "\n", - "Co tabulka s výdělky (`boxoffice_raw`)?" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ranktitlestudiolifetime_grossyear
01Star Wars: The Force AwakensBV9366622252015
12AvatarFox7605076252009
23Black PantherBV7000595662018
34Avengers: Infinity WarBV6788154822018
45TitanicPar.6593639441997
..................
1626216263Dog Eat DogIFC802009
1626316264Paranoid GirlsNaN782015
1626416265Confession of a Child of the CenturyCohen742015
1626516266Storage 24Magn.722013
1626616267Zyzzyx RoadReg.302006
\n", - "

16267 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " rank title studio lifetime_gross \\\n", - "0 1 Star Wars: The Force Awakens BV 936662225 \n", - "1 2 Avatar Fox 760507625 \n", - "2 3 Black Panther BV 700059566 \n", - "3 4 Avengers: Infinity War BV 678815482 \n", - "4 5 Titanic Par. 659363944 \n", - "... ... ... ... ... \n", - "16262 16263 Dog Eat Dog IFC 80 \n", - "16263 16264 Paranoid Girls NaN 78 \n", - "16264 16265 Confession of a Child of the Century Cohen 74 \n", - "16265 16266 Storage 24 Magn. 72 \n", - "16266 16267 Zyzzyx Road Reg. 30 \n", - "\n", - " year \n", - "0 2015 \n", - "1 2009 \n", - "2 2018 \n", - "3 2018 \n", - "4 1997 \n", - "... ... \n", - "16262 2009 \n", - "16263 2015 \n", - "16264 2015 \n", - "16265 2013 \n", - "16266 2006 \n", - "\n", - "[16267 rows x 5 columns]" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "boxoffice_raw" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "rank int64\n", - "title object\n", - "studio object\n", - "lifetime_gross int64\n", - "year int64\n", - "dtype: object" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "boxoffice_raw.dtypes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "S tím bychom v podstatně mohli být spokojení, jen přejmenujeme `rank`, abychom při joinování věděli, odkud daný sloupec pochází." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "boxoffice = (boxoffice_raw\n", - " .rename({\n", - " \"rank\": \"boxoffice_rank\"\n", - " }, axis=\"columns\")\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A zkusíme joinovat. V tomto případě se nemůžeme opřít o index (`boxoffice` pochází z jiného zdroje a o nějakém ID filmu z IMDb nemá ani tuchy), ale explicitně specifikujeme, který sloupec (či sloupce) se musí shodovat - na to slouží argument `on`:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyear (imdb)lengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grossyear (boxoffice)
1643PinocchioPinocchioFalse194088Animation,Comedy,Family7.5114689885Dis.842541671940
1644PinocchioPinocchioFalse194088Animation,Comedy,Family7.51146896108Mira.36843052002
1645PinocchioTurlis AbenteuerFalse196775Adventure,Family,Fantasy7.219885Dis.842541671940
1646PinocchioTurlis AbenteuerFalse196775Adventure,Family,Fantasy7.2196108Mira.36843052002
1647PinocchioPinocchioFalse197179Comedy,Fantasy3.5123885Dis.842541671940
1648PinocchioPinocchioFalse197179Comedy,Fantasy3.51236108Mira.36843052002
1649PinocchioPinocchioFalse191150Fantasy5.969885Dis.842541671940
1650PinocchioPinocchioFalse191150Fantasy5.9696108Mira.36843052002
1651PinocchioPinocchioFalse2002108Comedy,Family,Fantasy4.37192885Dis.842541671940
1652PinocchioPinocchioFalse2002108Comedy,Family,Fantasy4.371926108Mira.36843052002
1653PinocchioUn burattino di nome PinocchioFalse197196Animation,Family,Fantasy7.0117885Dis.842541671940
1654PinocchioUn burattino di nome PinocchioFalse197196Animation,Family,Fantasy7.01176108Mira.36843052002
1655PinocchioPinocchioFalse201275Animation,Family,Fantasy6.3218885Dis.842541671940
1656PinocchioPinocchioFalse201275Animation,Family,Fantasy6.32186108Mira.36843052002
1657PinocchioPinocchioFalse2015<NA>Family,Fantasy4.943885Dis.842541671940
1658PinocchioPinocchioFalse2015<NA>Family,Fantasy4.9436108Mira.36843052002
1659PinocchioPinocchioFalse201575Documentary6.88885Dis.842541671940
1660PinocchioPinocchioFalse201575Documentary6.886108Mira.36843052002
\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year (imdb) \\\n", - "1643 Pinocchio Pinocchio False 1940 \n", - "1644 Pinocchio Pinocchio False 1940 \n", - "1645 Pinocchio Turlis Abenteuer False 1967 \n", - "1646 Pinocchio Turlis Abenteuer False 1967 \n", - "1647 Pinocchio Pinocchio False 1971 \n", - "1648 Pinocchio Pinocchio False 1971 \n", - "1649 Pinocchio Pinocchio False 1911 \n", - "1650 Pinocchio Pinocchio False 1911 \n", - "1651 Pinocchio Pinocchio False 2002 \n", - "1652 Pinocchio Pinocchio False 2002 \n", - "1653 Pinocchio Un burattino di nome Pinocchio False 1971 \n", - "1654 Pinocchio Un burattino di nome Pinocchio False 1971 \n", - "1655 Pinocchio Pinocchio False 2012 \n", - "1656 Pinocchio Pinocchio False 2012 \n", - "1657 Pinocchio Pinocchio False 2015 \n", - "1658 Pinocchio Pinocchio False 2015 \n", - "1659 Pinocchio Pinocchio False 2015 \n", - "1660 Pinocchio Pinocchio False 2015 \n", - "\n", - " length genres imdb_rating imdb_votes \\\n", - "1643 88 Animation,Comedy,Family 7.5 114689 \n", - "1644 88 Animation,Comedy,Family 7.5 114689 \n", - "1645 75 Adventure,Family,Fantasy 7.2 19 \n", - "1646 75 Adventure,Family,Fantasy 7.2 19 \n", - "1647 79 Comedy,Fantasy 3.5 123 \n", - "1648 79 Comedy,Fantasy 3.5 123 \n", - "1649 50 Fantasy 5.9 69 \n", - "1650 50 Fantasy 5.9 69 \n", - "1651 108 Comedy,Family,Fantasy 4.3 7192 \n", - "1652 108 Comedy,Family,Fantasy 4.3 7192 \n", - "1653 96 Animation,Family,Fantasy 7.0 117 \n", - "1654 96 Animation,Family,Fantasy 7.0 117 \n", - "1655 75 Animation,Family,Fantasy 6.3 218 \n", - "1656 75 Animation,Family,Fantasy 6.3 218 \n", - "1657 Family,Fantasy 4.9 43 \n", - "1658 Family,Fantasy 4.9 43 \n", - "1659 75 Documentary 6.8 8 \n", - "1660 75 Documentary 6.8 8 \n", - "\n", - " boxoffice_rank studio lifetime_gross year (boxoffice) \n", - "1643 885 Dis. 84254167 1940 \n", - "1644 6108 Mira. 3684305 2002 \n", - "1645 885 Dis. 84254167 1940 \n", - "1646 6108 Mira. 3684305 2002 \n", - "1647 885 Dis. 84254167 1940 \n", - "1648 6108 Mira. 3684305 2002 \n", - "1649 885 Dis. 84254167 1940 \n", - "1650 6108 Mira. 3684305 2002 \n", - "1651 885 Dis. 84254167 1940 \n", - "1652 6108 Mira. 3684305 2002 \n", - "1653 885 Dis. 84254167 1940 \n", - "1654 6108 Mira. 3684305 2002 \n", - "1655 885 Dis. 84254167 1940 \n", - "1656 6108 Mira. 3684305 2002 \n", - "1657 885 Dis. 84254167 1940 \n", - "1658 6108 Mira. 3684305 2002 \n", - "1659 885 Dis. 84254167 1940 \n", - "1660 6108 Mira. 3684305 2002 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.merge(\n", - " movies_with_rating,\n", - " boxoffice,\n", - " suffixes=[\" (imdb)\", \" (boxoffice)\"],\n", - " on=\"title\"\n", - ").query(\"title == 'Pinocchio'\") # \"Jeden\" ukázkový film" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jejda, to jsme asi nechtěli. Existuje spousta různých Pinocchiů a ke každému z nich se připojili vždy oba snímky tohoto jména z `boxoffice`. Z toho vyplývá poučení, že při joinování je dobré se zamyslet nad jedinečností hodnot ve sloupci, který používáme jako klíč. Jméno filmu takové očividně není.\n", - "\n", - "V našem konkrétním případě jsme si problému všimli sami, ale pokud bude duplikátní klíč utopen někde v milionech hodnot, rádi bychom, aby to počítač poznal za nás. K tomu slouží argument `validate` - podle toho, jaký vztah mezi tabulkami očekáš, jsou přípustné hodnoty `\"one_to_one\"`, `\"one_to_many\"`, `\"many_to_one\"` nebo `\"many_to_many\"`:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyear (imdb)lengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grossyear (boxoffice)
0Oliver TwistOliver TwistFalse1912<NA>Drama4.7196826Sony20803212005
1Oliver TwistOliver TwistFalse1912<NA>Drama4.4126826Sony20803212005
2Oliver TwistOliver TwistFalse191650Drama6.6166826Sony20803212005
3Oliver TwistOliver TwistFalse192298Drama6.86576826Sony20803212005
4Oliver TwistOliver TwistFalse193380Drama5.02926826Sony20803212005
.......................................
20562BTS World Tour: Love Yourself in SeoulBTS World Tour: Love Yourself in SeoulFalse2019112Documentary,Music8.54396173Fathom35099172019
20563Mojin: The Worm ValleyYun nan chong guFalse2018110Action,Fantasy4.712011240WGUSA1015162019
20564Extreme JobGeukhanjikeobFalse2019111Action,Comedy7.39057212CJ15488162019
20565Peppa Celebrates Chinese New Yearxiao zhu pei qi guo da nianFalse201981Animation,Family3.44110811STX1312252019
20566Avant qu'on exploseAvant qu'on exploseFalse2019108Comedy6.94110995EOne1165762019
\n", - "

20567 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " title \\\n", - "0 Oliver Twist \n", - "1 Oliver Twist \n", - "2 Oliver Twist \n", - "3 Oliver Twist \n", - "4 Oliver Twist \n", - "... ... \n", - "20562 BTS World Tour: Love Yourself in Seoul \n", - "20563 Mojin: The Worm Valley \n", - "20564 Extreme Job \n", - "20565 Peppa Celebrates Chinese New Year \n", - "20566 Avant qu'on explose \n", - "\n", - " original_title is_adult year (imdb) length \\\n", - "0 Oliver Twist False 1912 \n", - "1 Oliver Twist False 1912 \n", - "2 Oliver Twist False 1916 50 \n", - "3 Oliver Twist False 1922 98 \n", - "4 Oliver Twist False 1933 80 \n", - "... ... ... ... ... \n", - "20562 BTS World Tour: Love Yourself in Seoul False 2019 112 \n", - "20563 Yun nan chong gu False 2018 110 \n", - "20564 Geukhanjikeob False 2019 111 \n", - "20565 xiao zhu pei qi guo da nian False 2019 81 \n", - "20566 Avant qu'on explose False 2019 108 \n", - "\n", - " genres imdb_rating imdb_votes boxoffice_rank studio \\\n", - "0 Drama 4.7 19 6826 Sony \n", - "1 Drama 4.4 12 6826 Sony \n", - "2 Drama 6.6 16 6826 Sony \n", - "3 Drama 6.8 657 6826 Sony \n", - "4 Drama 5.0 292 6826 Sony \n", - "... ... ... ... ... ... \n", - "20562 Documentary,Music 8.5 439 6173 Fathom \n", - "20563 Action,Fantasy 4.7 120 11240 WGUSA \n", - "20564 Action,Comedy 7.3 905 7212 CJ \n", - "20565 Animation,Family 3.4 41 10811 STX \n", - "20566 Comedy 6.9 41 10995 EOne \n", - "\n", - " lifetime_gross year (boxoffice) \n", - "0 2080321 2005 \n", - "1 2080321 2005 \n", - "2 2080321 2005 \n", - "3 2080321 2005 \n", - "4 2080321 2005 \n", - "... ... ... \n", - "20562 3509917 2019 \n", - "20563 101516 2019 \n", - "20564 1548816 2019 \n", - "20565 131225 2019 \n", - "20566 116576 2019 \n", - "\n", - "[20567 rows x 12 columns]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.merge(\n", - " movies_with_rating,\n", - " boxoffice,\n", - " on=\"title\",\n", - " suffixes=[\" (imdb)\", \" (boxoffice)\"],\n", - "# validate=\"one_to_one\" # Odkomentuj a vyskočí chyba!\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Řešení je jednoduché - budeme joinovat přes dva různé sloupce (argument `on` to unese ;-)). Při té příležitosti navíc zjišťujeme, že nedává smysl spojovat filmy, které rok vůbec uvedený nemají, a proto je vyhodíme:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
6926PlaybackPlaybackFalse201298Horror,Thriller4.3447816256Magn.264
6927PlaybackPlaybackFalse2012113Drama4.92716256Magn.264
6928PlaybackDur d'être DieuFalse201266Documentary5.2816256Magn.264
\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year length genres \\\n", - "6926 Playback Playback False 2012 98 Horror,Thriller \n", - "6927 Playback Playback False 2012 113 Drama \n", - "6928 Playback Dur d'être Dieu False 2012 66 Documentary \n", - "\n", - " imdb_rating imdb_votes boxoffice_rank studio lifetime_gross \n", - "6926 4.3 4478 16256 Magn. 264 \n", - "6927 4.9 27 16256 Magn. 264 \n", - "6928 5.2 8 16256 Magn. 264 " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(\n", - " pd.merge(\n", - " movies_with_rating.dropna(subset=[\"year\"]), # Vyhoď všechny řádky bez roku\n", - " boxoffice,\n", - " on=[\"title\", \"year\"],\n", - " validate=\"many_to_one\", # movies_with_rating pořád nejsou unikátní!\n", - " )\n", - ").query(\"title == 'Playback'\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pořád nejsou unikátní! Co s tím?\n", - "\n", - "**Hypotéza:** Vstupujeme na nebezpečnou půdu a zkusíme spekulovat, že informace o ziscích budeme mít nejspíš jen o nejpopulárnějších filmech. Možná máme pravdu, možná ne a nejspíš nějakou drobnou nepřesnost zaneseme, ale dobrat se tady skutečné pravdy je \"drahé\" (a možná i skutečně drahé), z nabízených datových sad to věrohodně možné není.\n", - "\n", - "Abychom se co nejvíc přiblížili realitě, z každé opakující se dvojice (název, rok) vybereme film s nejvyšším `imdb_votes`. Nejdříve si pomocí `sort_values` srovnáme všechny filmy a pak zavoláme `drop_duplicates(..., keep=\"first\")`, což nám ponechá vždy jen jeden z řady duplikátů:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
0The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.320717592792Col.28341469
1The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.0203767810WB535234033
2InceptionInceptionFalse2010148Action,Adventure,Sci-Fi8.8181636085WB292576195
3Fight ClubFight ClubFalse1999139Drama8.816578572248Fox37030102
4Pulp FictionPulp FictionFalse1994154Crime,Drama8.91620135629Mira.107928762
....................................
8996GirlfriendsGirlfriendsFalse1996<NA>NaN8.6713930FRun18000
8997SacredSacredFalse2017<NA>Action,Drama,Romance8.2613950Argo.17740
8998The Professor: Tai Chi's Journey WestThe Professor: Tai Chi's Journey WestFalse201672Documentary7.2615820FRun2852
8999After LoveAfter LoveFalse2017<NA>Drama,Romance,Thriller7.6514299Distrib.13693
9000Still, the Children Are HereStill, the Children Are HereFalse200485Documentary6.6515653Icar.3685
\n", - "

9001 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " title \\\n", - "0 The Shawshank Redemption \n", - "1 The Dark Knight \n", - "2 Inception \n", - "3 Fight Club \n", - "4 Pulp Fiction \n", - "... ... \n", - "8996 Girlfriends \n", - "8997 Sacred \n", - "8998 The Professor: Tai Chi's Journey West \n", - "8999 After Love \n", - "9000 Still, the Children Are Here \n", - "\n", - " original_title is_adult year length \\\n", - "0 The Shawshank Redemption False 1994 142 \n", - "1 The Dark Knight False 2008 152 \n", - "2 Inception False 2010 148 \n", - "3 Fight Club False 1999 139 \n", - "4 Pulp Fiction False 1994 154 \n", - "... ... ... ... ... \n", - "8996 Girlfriends False 1996 \n", - "8997 Sacred False 2017 \n", - "8998 The Professor: Tai Chi's Journey West False 2016 72 \n", - "8999 After Love False 2017 \n", - "9000 Still, the Children Are Here False 2004 85 \n", - "\n", - " genres imdb_rating imdb_votes boxoffice_rank \\\n", - "0 Drama 9.3 2071759 2792 \n", - "1 Action,Crime,Drama 9.0 2037678 10 \n", - "2 Action,Adventure,Sci-Fi 8.8 1816360 85 \n", - "3 Drama 8.8 1657857 2248 \n", - "4 Crime,Drama 8.9 1620135 629 \n", - "... ... ... ... ... \n", - "8996 NaN 8.6 7 13930 \n", - "8997 Action,Drama,Romance 8.2 6 13950 \n", - "8998 Documentary 7.2 6 15820 \n", - "8999 Drama,Romance,Thriller 7.6 5 14299 \n", - "9000 Documentary 6.6 5 15653 \n", - "\n", - " studio lifetime_gross \n", - "0 Col. 28341469 \n", - "1 WB 535234033 \n", - "2 WB 292576195 \n", - "3 Fox 37030102 \n", - "4 Mira. 107928762 \n", - "... ... ... \n", - "8996 FRun 18000 \n", - "8997 Argo. 17740 \n", - "8998 FRun 2852 \n", - "8999 Distrib. 13693 \n", - "9000 Icar. 3685 \n", - "\n", - "[9001 rows x 11 columns]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "movies_with_rating_and_boxoffice = (\n", - " pd.merge(\n", - " movies_with_rating\n", - " .dropna(subset=[\"year\"])\n", - " .sort_values(\"imdb_votes\", ascending=False)\n", - " .drop_duplicates(\n", - " subset=[\"title\", \"year\"],\n", - " keep=\"first\"\n", - " ),\n", - " boxoffice,\n", - " on=[\"title\", \"year\"],\n", - " validate=\"one_to_one\",\n", - " )\n", - ")\n", - "movies_with_rating_and_boxoffice" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
5831PlaybackPlaybackFalse201298Horror,Thriller4.3447816256Magn.264
\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year length genres \\\n", - "5831 Playback Playback False 2012 98 Horror,Thriller \n", - "\n", - " imdb_rating imdb_votes boxoffice_rank studio lifetime_gross \n", - "5831 4.3 4478 16256 Magn. 264 " - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# To už by šlo!\n", - "movies_with_rating_and_boxoffice.query(\"title == 'Playback'\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Úkol:** Seřaď filmy podle toho, kolik vydělaly (nabízí se hned dvě možnosti)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Otázka:** Které filmy nám vypadly a proč?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Třetí join" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RankTitleRatingTomatometerNo. of ReviewsGenres
01Black Panther (2018)97444action|adventure
12Mad Max: Fury Road (2015)97394action|adventure
23Wonder Woman (2017)93410action|adventure
34Metropolis (1927)99118action|adventure
45Coco (2017)97308action|adventure
..................
158570Priest (2011)1597western
158671American Outlaws (2001)14103western
158772September Dawn (2007)1554western
158873Jonah Hex (2010)12147western
158974Texas Rangers (2001)251western
\n", - "

1590 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " Rank Title RatingTomatometer No. of Reviews \\\n", - "0 1 Black Panther (2018) 97 444 \n", - "1 2 Mad Max: Fury Road (2015) 97 394 \n", - "2 3 Wonder Woman (2017) 93 410 \n", - "3 4 Metropolis (1927) 99 118 \n", - "4 5 Coco (2017) 97 308 \n", - "... ... ... ... ... \n", - "1585 70 Priest (2011) 15 97 \n", - "1586 71 American Outlaws (2001) 14 103 \n", - "1587 72 September Dawn (2007) 15 54 \n", - "1588 73 Jonah Hex (2010) 12 147 \n", - "1589 74 Texas Rangers (2001) 2 51 \n", - "\n", - " Genres \n", - "0 action|adventure \n", - "1 action|adventure \n", - "2 action|adventure \n", - "3 action|adventure \n", - "4 action|adventure \n", - "... ... \n", - "1585 western \n", - "1586 western \n", - "1587 western \n", - "1588 western \n", - "1589 western \n", - "\n", - "[1590 rows x 5 columns]" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rotten_tomatoes_raw" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Title\n", - "Yellow Submarine (1968) 6\n", - "101 Dalmatians (1961) 5\n", - "Fantasia (1940) 5\n", - "Harry Potter and the Deathly Hallows - Part 2 (2011) 5\n", - "Miracle on 34th Street (1947) 5\n", - " ..\n", - "Misery (1990) 1\n", - "The Dead Zone (1983) 1\n", - "The Conjuring (2013) 1\n", - "The Exorcist (1973) 1\n", - "Texas Rangers (2001) 1\n", - "Name: count, Length: 947, dtype: int64" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rotten_tomatoes_raw[\"Title\"].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A zase duplicity, některé názvy se nám opakují :-(\n", - "\n", - "**Otázka:** Dokážeš zjistit proč? Nápověda: podívej se na nějaký konkrétní film." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Naštěstí už víme, jak na to - použijeme metodu `drop_duplicates`, tentokrát přes sloupec `\"Title\"`. (Poznámka: druhou možností by bylo sloučit všechny různé žánry daného filmu do jedné buňky)." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TitleRatingTomatometerNo. of Reviews
0Black Panther (2018)97444
1Mad Max: Fury Road (2015)97394
2Wonder Woman (2017)93410
3Metropolis (1927)99118
4Coco (2017)97308
............
1585Priest (2011)1597
1586American Outlaws (2001)14103
1587September Dawn (2007)1554
1588Jonah Hex (2010)12147
1589Texas Rangers (2001)251
\n", - "

947 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " Title RatingTomatometer No. of Reviews\n", - "0 Black Panther (2018) 97 444\n", - "1 Mad Max: Fury Road (2015) 97 394\n", - "2 Wonder Woman (2017) 93 410\n", - "3 Metropolis (1927) 99 118\n", - "4 Coco (2017) 97 308\n", - "... ... ... ...\n", - "1585 Priest (2011) 15 97\n", - "1586 American Outlaws (2001) 14 103\n", - "1587 September Dawn (2007) 15 54\n", - "1588 Jonah Hex (2010) 12 147\n", - "1589 Texas Rangers (2001) 2 51\n", - "\n", - "[947 rows x 3 columns]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rotten_tomatoes_nodup = (\n", - " rotten_tomatoes_raw\n", - " .drop_duplicates(\n", - " subset=\"Title\",\n", - " keep=\"first\" # Vybereme první výskyt, lze i \"last\" (anebo False => vyhodit všechny)\n", - " )\n", - " .drop(\"Genres\", axis=\"columns\") # Informační hodnotu jsme už ztratili\n", - " .drop(\"Rank\", axis=\"columns\") # Mělo smysl jen v rámci žánru\n", - ")\n", - "rotten_tomatoes_nodup" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
title_typetitleoriginal_titleis_adultstart_yearend_yearlengthgenresTitleRatingTomatometerNo. of Reviews
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [title_type, title, original_title, is_adult, start_year, end_year, length, genres, Title, RatingTomatometer, No. of Reviews]\n", - "Index: []" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Ready to merge?\n", - "pd.merge(imdb_titles, rotten_tomatoes_nodup, left_on=\"title\", right_on=\"Title\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "0 řádků!\n", - "\n", - "Dosud jsme manipulovali s řádky a sloupci jako celky, nicméně teď musíme zasahovat přímo do hodnot v buňkách. I to se při slučování dat z různých zdrojů nezřídka stává. Stojíme před úkolem převést řetězce typu \"Black Panther (2018)\" na dvě hodnoty: název \"Black Panther\" a rok 2018 (jeden sloupec na dva). \n", - "\n", - "Naštěstí si ty sloupce umíme jednoduše vyrobit pomocí řetězcové metody [`.str.slice`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.slice.html), která z každého řetězce vyřízne nějakou jeho část (a zase pracuje na celém sloupci - výsledkem bude nový sloupec s funkcí aplikovanou na každou z hodnot). Budeme věřit, že předposlední čtyři znaky představují rok a zbytek, až na nějaké ty závorky, tvoří skutečný název:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tomatoes_ratingtomatoes_votestitleyear
097444Black Panther2018
197394Mad Max: Fury Road2015
293410Wonder Woman2017
399118Metropolis1927
497308Coco2017
...............
15851597Priest2011
158614103American Outlaws2001
15871554September Dawn2007
158812147Jonah Hex2010
1589251Texas Rangers2001
\n", - "

947 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " tomatoes_rating tomatoes_votes title year\n", - "0 97 444 Black Panther 2018\n", - "1 97 394 Mad Max: Fury Road 2015\n", - "2 93 410 Wonder Woman 2017\n", - "3 99 118 Metropolis 1927\n", - "4 97 308 Coco 2017\n", - "... ... ... ... ...\n", - "1585 15 97 Priest 2011\n", - "1586 14 103 American Outlaws 2001\n", - "1587 15 54 September Dawn 2007\n", - "1588 12 147 Jonah Hex 2010\n", - "1589 2 51 Texas Rangers 2001\n", - "\n", - "[947 rows x 4 columns]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rotten_tomatoes_beta = (rotten_tomatoes_nodup\n", - " .assign(\n", - " title=rotten_tomatoes_nodup[\"Title\"].str.slice(0, -7), \n", - " year=rotten_tomatoes_nodup[\"Title\"].str.slice(-5, -1).astype(int)\n", - " )\n", - " .rename({\n", - " \"RatingTomatometer\": \"tomatoes_rating\",\n", - " \"No. of Reviews\": \"tomatoes_votes\",\n", - " }, axis=\"columns\")\n", - " .drop([\"Title\"], axis=\"columns\")\n", - ")\n", - "rotten_tomatoes_beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Závorková odysea nekončí, někdo nám proaktivně do závorek nacpal i originální název naanglickojazyčných filmů. Pojďme se o tom přesvědčit pomocí metody [`.str.contains`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html) (protože tato metoda ve výchozím stavu používá pro vyhledávání regulární výrazy, které jsme se zatím nenaučili používat, musíme jí to explicitně zakázat argumentem `regex=False`):" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tomatoes_ratingtomatoes_votestitleyear
1510058Seven Samurai (Shichinin no Samurai)1956
519846Aguirre, the Wrath of God (Aguirre, der Zorn G...1972
619771Ghostbusters (1984 Original)1984
699847A Fistful of Dollars (Per un Pugno di Dollari)1964
9996139Embrace Of The Serpent (El Abrazo De La Serpie...2016
...............
13689759To Be and to Have (Etre et Avoir)2003
14574382Goal! The Dream Begins (Goal!: The Impossible ...2005
15027152Only Human (Seres queridos)2006
15478364The Good, the Bad, the Weird (Joheun-nom, Nabb...2010
15597462Fah talai jone (Tears of the Black Tiger)2007
\n", - "

66 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " tomatoes_rating tomatoes_votes \\\n", - "15 100 58 \n", - "51 98 46 \n", - "61 97 71 \n", - "69 98 47 \n", - "99 96 139 \n", - "... ... ... \n", - "1368 97 59 \n", - "1457 43 82 \n", - "1502 71 52 \n", - "1547 83 64 \n", - "1559 74 62 \n", - "\n", - " title year \n", - "15 Seven Samurai (Shichinin no Samurai) 1956 \n", - "51 Aguirre, the Wrath of God (Aguirre, der Zorn G... 1972 \n", - "61 Ghostbusters (1984 Original) 1984 \n", - "69 A Fistful of Dollars (Per un Pugno di Dollari) 1964 \n", - "99 Embrace Of The Serpent (El Abrazo De La Serpie... 2016 \n", - "... ... ... \n", - "1368 To Be and to Have (Etre et Avoir) 2003 \n", - "1457 Goal! The Dream Begins (Goal!: The Impossible ... 2005 \n", - "1502 Only Human (Seres queridos) 2006 \n", - "1547 The Good, the Bad, the Weird (Joheun-nom, Nabb... 2010 \n", - "1559 Fah talai jone (Tears of the Black Tiger) 2007 \n", - "\n", - "[66 rows x 4 columns]" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rotten_tomatoes_beta[rotten_tomatoes_beta[\"title\"].str.contains(\")\", regex=False)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "V rámci zjednodušení proto ještě odstraníme všechny takové závorky. K tomu pomůže funkce [`.str.rsplit`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.rsplit.html), která rozdělí zprava řetězec na několik částí podle oddělovače a vloží je do seznamu - my za ten oddělovač zvolíme levou závorku `\"(\"`, omezíme počet částí na jednu až dvě (`n=1`):" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "41 [Marvel's The Avengers]\n", - "61 [Ghostbusters , 1984 Original)]\n", - "81 [Mad Max 2: The Road Warrior]\n", - "Name: title, dtype: object" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "split_title = (\n", - " rotten_tomatoes_beta[\"title\"]\n", - " .str.rsplit(\"(\", n=1)\n", - ")\n", - "split_title.loc[[41, 61, 81]] # Některé seznamy obsahují jeden prvek, jiné dva" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A jak teď vybrat první prvek z každého seznamu?\n", - "\n", - "💡 Metoda [`apply`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.apply.html) umožňuje použít libovolnou transformaci (definovanou jako funkci) na každý řádek v tabulce či hodnotu v `Series`. Obvykle se bez ní obejdeme a měli bychom (proto se jí tolik speciálně nevěnujeme), protože není příliš výpočetně efektivní. Tady nám ale usnadní pochopení, co se vlastně dělá, t.j. vybírá první prvek nějakého seznamu:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tomatoes_ratingtomatoes_votestitleyear
097444Black Panther2018
197394Mad Max: Fury Road2015
293410Wonder Woman2017
399118Metropolis1927
497308Coco2017
...............
15851597Priest2011
158614103American Outlaws2001
15871554September Dawn2007
158812147Jonah Hex2010
1589251Texas Rangers2001
\n", - "

947 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " tomatoes_rating tomatoes_votes title year\n", - "0 97 444 Black Panther 2018\n", - "1 97 394 Mad Max: Fury Road 2015\n", - "2 93 410 Wonder Woman 2017\n", - "3 99 118 Metropolis 1927\n", - "4 97 308 Coco 2017\n", - "... ... ... ... ...\n", - "1585 15 97 Priest 2011\n", - "1586 14 103 American Outlaws 2001\n", - "1587 15 54 September Dawn 2007\n", - "1588 12 147 Jonah Hex 2010\n", - "1589 2 51 Texas Rangers 2001\n", - "\n", - "[947 rows x 4 columns]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def take_first(a_list): # Funkce, kterou použijeme v apply\n", - " return a_list[0]\n", - "\n", - "rotten_tomatoes = (rotten_tomatoes_beta\n", - " .assign(\n", - " title=split_title.apply(take_first)\n", - " )\n", - ")\n", - "rotten_tomatoes" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tomatoes_ratingtomatoes_votestitleyear
15398842The Magnificent Seven1960
156063289The Magnificent Seven2016
\n", - "
" - ], - "text/plain": [ - " tomatoes_rating tomatoes_votes title year\n", - "1539 88 42 The Magnificent Seven 1960\n", - "1560 63 289 The Magnificent Seven 2016" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Zbavení se duplikátů hned na začátku nám zachovalo filmy se stejným jménem :-)\n", - "rotten_tomatoes.query(\"title == 'The Magnificent Seven'\")" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenrestomatoes_ratingtomatoes_votes
0The Birth of a NationThe Birth of a NationFalse1915195Drama,History,War9840
1Battleship PotemkinBronenosets PotemkinFalse192575Drama,History10045
2The Gold RushThe Gold RushFalse192595Adventure,Comedy,Drama10043
3MetropolisMetropolisFalse1927153Drama,Sci-Fi99118
4All Quiet on the Western FrontAll Quiet on the Western FrontFalse1930136Drama,War10042
...........................
654Three Identical StrangersThree Identical StrangersFalse201896Biography,Documentary,Drama96157
655SearchingSearchingFalse2018102Drama,Mystery,Thriller92214
656Won't You Be My Neighbor?Won't You Be My Neighbor?False201894Biography,Documentary98216
657RBGRBGFalse201898Biography,Documentary95153
658HereditaryHereditaryFalse2018127Drama,Horror,Mystery89317
\n", - "

659 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " title original_title is_adult \\\n", - "0 The Birth of a Nation The Birth of a Nation False \n", - "1 Battleship Potemkin Bronenosets Potemkin False \n", - "2 The Gold Rush The Gold Rush False \n", - "3 Metropolis Metropolis False \n", - "4 All Quiet on the Western Front All Quiet on the Western Front False \n", - ".. ... ... ... \n", - "654 Three Identical Strangers Three Identical Strangers False \n", - "655 Searching Searching False \n", - "656 Won't You Be My Neighbor? Won't You Be My Neighbor? False \n", - "657 RBG RBG False \n", - "658 Hereditary Hereditary False \n", - "\n", - " year length genres tomatoes_rating \\\n", - "0 1915 195 Drama,History,War 98 \n", - "1 1925 75 Drama,History 100 \n", - "2 1925 95 Adventure,Comedy,Drama 100 \n", - "3 1927 153 Drama,Sci-Fi 99 \n", - "4 1930 136 Drama,War 100 \n", - ".. ... ... ... ... \n", - "654 2018 96 Biography,Documentary,Drama 96 \n", - "655 2018 102 Drama,Mystery,Thriller 92 \n", - "656 2018 94 Biography,Documentary 98 \n", - "657 2018 98 Biography,Documentary 95 \n", - "658 2018 127 Drama,Horror,Mystery 89 \n", - "\n", - " tomatoes_votes \n", - "0 40 \n", - "1 45 \n", - "2 43 \n", - "3 118 \n", - "4 42 \n", - ".. ... \n", - "654 157 \n", - "655 214 \n", - "656 216 \n", - "657 153 \n", - "658 317 \n", - "\n", - "[659 rows x 8 columns]" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.merge(\n", - " movies.dropna(subset=[\"year\"]),\n", - " rotten_tomatoes,\n", - " on=[\"title\", \"year\"],\n", - " how=\"inner\"\n", - ")" + "# Pandas - vztahy mezi více proměnnými" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "metadata": {}, + "outputs": [], "source": [ - "Když sloučíme filmy a hodnocení na Rotten Tomatoes, z 947 filmů se nám skoro tři sta ztratí. Bohužel zde je na vině především nestejnost zápisu názvu, různé uřčité členy, interpunkce, podnázvy apod. Coby řešení se tady nabízí spousta a spousta manuální práce, případně nějaká heuristika, která by na sebe pasovala \"hodně podobné\" názvy.\n", - "\n", - "*Mimochodem, obtížnost manuální práce se mezi vývojáři někdy přeceňuje: Opravit 288 názvů filmů může být práce na hodinu až dvě, zatímco psát algoritmus na \"řešení problému\" může trvat stejně dlouho, ne-li déle.*" + "# Importy jako obvykle\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Čtvrtý (a poslední) join\n", - "\n", - "Dokončíme slučování všech čtyř tabulek:" + "Načteme si spojené tabulky z předchozí lekce:" ] }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grosstomatoes_ratingtomatoes_votes
0Black PantherBlack PantherFalse2018134Action,Adventure,Sci-Fi7.34899773BV70005956697444
1Avengers: Infinity WarAvengers: Infinity WarFalse2018149Action,Adventure,Sci-Fi8.56160504BV67881548284408
2TitanicTitanicFalse1997194Drama,Romance7.89458895Par.65936394489184
3Incredibles 2Incredibles 2False2018118Action,Adventure,Animation7.71923019BV60858174494332
4The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.0203767810WB53523403394332
..........................................
469Boxing GymBoxing GymFalse201091Documentary7.138912999Zipp.324769542
470Red HillRed HillFalse201095Thriller,Western6.4784413681Strand210877865
471City LightsCity LightsFalse193187Comedy,Drama,Romance8.514426113827UA191819845
472Minding the GapMinding the GapFalse201893Documentary8.1411914471Magn.1199810063
473The Autopsy of Jane DoeThe Autopsy of Jane DoeFalse201686Horror,Mystery,Thriller6.87396514657IFC104748798
\n", - "

474 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " title original_title is_adult year length \\\n", - "0 Black Panther Black Panther False 2018 134 \n", - "1 Avengers: Infinity War Avengers: Infinity War False 2018 149 \n", - "2 Titanic Titanic False 1997 194 \n", - "3 Incredibles 2 Incredibles 2 False 2018 118 \n", - "4 The Dark Knight The Dark Knight False 2008 152 \n", - ".. ... ... ... ... ... \n", - "469 Boxing Gym Boxing Gym False 2010 91 \n", - "470 Red Hill Red Hill False 2010 95 \n", - "471 City Lights City Lights False 1931 87 \n", - "472 Minding the Gap Minding the Gap False 2018 93 \n", - "473 The Autopsy of Jane Doe The Autopsy of Jane Doe False 2016 86 \n", - "\n", - " genres imdb_rating imdb_votes boxoffice_rank \\\n", - "0 Action,Adventure,Sci-Fi 7.3 489977 3 \n", - "1 Action,Adventure,Sci-Fi 8.5 616050 4 \n", - "2 Drama,Romance 7.8 945889 5 \n", - "3 Action,Adventure,Animation 7.7 192301 9 \n", - "4 Action,Crime,Drama 9.0 2037678 10 \n", - ".. ... ... ... ... \n", - "469 Documentary 7.1 389 12999 \n", - "470 Thriller,Western 6.4 7844 13681 \n", - "471 Comedy,Drama,Romance 8.5 144261 13827 \n", - "472 Documentary 8.1 4119 14471 \n", - "473 Horror,Mystery,Thriller 6.8 73965 14657 \n", - "\n", - " studio lifetime_gross tomatoes_rating tomatoes_votes \n", - "0 BV 700059566 97 444 \n", - "1 BV 678815482 84 408 \n", - "2 Par. 659363944 89 184 \n", - "3 BV 608581744 94 332 \n", - "4 WB 535234033 94 332 \n", - ".. ... ... ... ... \n", - "469 Zipp. 32476 95 42 \n", - "470 Strand 21087 78 65 \n", - "471 UA 19181 98 45 \n", - "472 Magn. 11998 100 63 \n", - "473 IFC 10474 87 98 \n", - "\n", - "[474 rows x 13 columns]" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "movies_complete = pd.merge(\n", - " movies_with_rating_and_boxoffice,\n", - " rotten_tomatoes,\n", - " on=[\"title\", \"year\"],\n", - " how=\"inner\"\n", - ")\n", - "movies_complete.sort_values(\"boxoffice_rank\").reset_index(drop=True)" - ] - }, - { - "cell_type": "markdown", + "execution_count": 2, "metadata": {}, + "outputs": [], "source": [ - "A přišli jsme o dalších 175 filmů. \n", - "\n", - "Co dál? Pokud by toto byl skutečný úkol, museli bychom se s tím nějak vypořádat - zkoumat, proč které řádky nesedí, v čem se liší názvy stejného filmu v různých datových sadách, jinými slovy *manuální práce, práce, práce...*\n", - "\n", - "Naštěstí to je úkol jen ukázkový, a my můžeme být spokojeni, že máme sice neúplnou, ale přesto použitelnou datovou sadu :-)" + "movies_complete = pd.read_csv(\"./movies_complete.csv.gz\")\n", + "movies_with_rating = pd.read_csv(\"./movies_with_rating.csv.gz\")" ] }, { @@ -6125,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -6149,6 +85,7 @@ " \n", " \n", " \n", + " Unnamed: 0\n", " year\n", " length\n", " imdb_rating\n", @@ -6162,8 +99,9 @@ " \n", " \n", " count\n", - " 474.0\n", - " 474.0\n", + " 474.000000\n", + " 474.000000\n", + " 474.000000\n", " 474.000000\n", " 4.740000e+02\n", " 474.000000\n", @@ -6173,6 +111,7 @@ " \n", " \n", " mean\n", + " 236.500000\n", " 2000.272152\n", " 112.529536\n", " 7.502110\n", @@ -6184,6 +123,7 @@ " \n", " \n", " std\n", + " 136.976275\n", " 18.099671\n", " 24.468735\n", " 0.690525\n", @@ -6195,8 +135,9 @@ " \n", " \n", " min\n", - " 1927.0\n", - " 63.0\n", + " 0.000000\n", + " 1927.000000\n", + " 63.000000\n", " 2.700000\n", " 3.890000e+02\n", " 3.000000\n", @@ -6206,8 +147,9 @@ " \n", " \n", " 25%\n", - " 1993.0\n", - " 95.0\n", + " 118.250000\n", + " 1993.000000\n", + " 95.000000\n", " 7.200000\n", " 3.088050e+04\n", " 687.250000\n", @@ -6217,8 +159,9 @@ " \n", " \n", " 50%\n", - " 2007.0\n", - " 108.0\n", + " 236.500000\n", + " 2007.000000\n", + " 108.000000\n", " 7.600000\n", " 1.031485e+05\n", " 2343.000000\n", @@ -6228,8 +171,9 @@ " \n", " \n", " 75%\n", - " 2013.0\n", - " 123.0\n", + " 354.750000\n", + " 2013.000000\n", + " 123.000000\n", " 7.975000\n", " 2.878735e+05\n", " 6152.500000\n", @@ -6239,8 +183,9 @@ " \n", " \n", " max\n", - " 2018.0\n", - " 219.0\n", + " 473.000000\n", + " 2018.000000\n", + " 219.000000\n", " 9.200000\n", " 2.037678e+06\n", " 14657.000000\n", @@ -6253,28 +198,28 @@ "" ], "text/plain": [ - " year length imdb_rating imdb_votes boxoffice_rank \\\n", - "count 474.0 474.0 474.000000 4.740000e+02 474.000000 \n", - "mean 2000.272152 112.529536 7.502110 2.049621e+05 3645.890295 \n", - "std 18.099671 24.468735 0.690525 2.618299e+05 3452.106932 \n", - "min 1927.0 63.0 2.700000 3.890000e+02 3.000000 \n", - "25% 1993.0 95.0 7.200000 3.088050e+04 687.250000 \n", - "50% 2007.0 108.0 7.600000 1.031485e+05 2343.000000 \n", - "75% 2013.0 123.0 7.975000 2.878735e+05 6152.500000 \n", - "max 2018.0 219.0 9.200000 2.037678e+06 14657.000000 \n", - "\n", - " lifetime_gross tomatoes_rating tomatoes_votes \n", - "count 4.740000e+02 474.000000 474.000000 \n", - "mean 7.643727e+07 88.369198 150.299578 \n", - "std 1.101133e+08 15.831859 97.208147 \n", - "min 1.047400e+04 5.000000 39.000000 \n", - "25% 3.564070e+06 88.000000 65.000000 \n", - "50% 3.542173e+07 93.000000 120.500000 \n", - "75% 1.022663e+08 96.000000 221.500000 \n", - "max 7.000596e+08 100.000000 444.000000 " + " Unnamed: 0 year length imdb_rating imdb_votes \\\n", + "count 474.000000 474.000000 474.000000 474.000000 4.740000e+02 \n", + "mean 236.500000 2000.272152 112.529536 7.502110 2.049621e+05 \n", + "std 136.976275 18.099671 24.468735 0.690525 2.618299e+05 \n", + "min 0.000000 1927.000000 63.000000 2.700000 3.890000e+02 \n", + "25% 118.250000 1993.000000 95.000000 7.200000 3.088050e+04 \n", + "50% 236.500000 2007.000000 108.000000 7.600000 1.031485e+05 \n", + "75% 354.750000 2013.000000 123.000000 7.975000 2.878735e+05 \n", + "max 473.000000 2018.000000 219.000000 9.200000 2.037678e+06 \n", + "\n", + " boxoffice_rank lifetime_gross tomatoes_rating tomatoes_votes \n", + "count 474.000000 4.740000e+02 474.000000 474.000000 \n", + "mean 3645.890295 7.643727e+07 88.369198 150.299578 \n", + "std 3452.106932 1.101133e+08 15.831859 97.208147 \n", + "min 3.000000 1.047400e+04 5.000000 39.000000 \n", + "25% 687.250000 3.564070e+06 88.000000 65.000000 \n", + "50% 2343.000000 3.542173e+07 93.000000 120.500000 \n", + "75% 6152.500000 1.022663e+08 96.000000 221.500000 \n", + "max 14657.000000 7.000596e+08 100.000000 444.000000 " ] }, - "execution_count": 49, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -6285,12 +230,12 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "image/png": "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HTF+/Hi0aNEC+fn5yMrKwh9//CGtRzhkyBDMmTMHY8eORc+ePXHs2DF88skn0lVxIiJrpdFosGLFCowaNQrdunXD8OHD0aRJE5w/fx7btm1Dr169pEduqisqKgo9evTAK6+8gtOnTyMwMBBff/01rl69CsDwKktQUBAA4KWXXkJERATs7OwwfPhw0zWQiKiWkpOTERkZid69e+P555/H1atXsXTpUrRv394g2SzVqlUr9O7dGxMnToRWq8XixYvh4eGBKVOmmCSe6p6XtmzZEm5ubli5ciUaNmwIZ2dnhISE1HouoXnz5mHYsGHo1asXxo4di2vXrmHZsmXo0KFDuf1B5sMr2mRRQ4cORaNGjeDq6op//OMfBvvatWuHw4cPIzIyEqtXr0ZcXBxWrlwJpVKJGTNmSPXeeOMNvPLKK9i5cydefvllfP/999i2bVuZCTSIiKzRc889h4yMDDz00ENYuHAhXn75Zaxfvx5dunTB2LFjjT6enZ2dtM7qmjVr8O9//xu+vr7SFW0HBwepbnR0NCZNmoQdO3Zg1KhRePbZZ03WLiIiUxg0aBA2bNiAkpISJCUlYePGjUhNTUVwcHC59UePHo1JkyZh2bJleOutt9C+fXvs2rULPj4+JomnuuelKpUKa9asgZ2dHf71r3/h2WefxZ49e2r9/kOHDsWnn36K27dvY+rUqdi4cSNWr16NNm3aGIzvZH4KwafnyYLu3LkDX19fDB06tMyzLEREVHc2b96MJ554Avv27UOvXr0sHQ4REZlQly5d0KRJE6Snp1s6lHqDV7TJojZv3ow///wTo0ePtnQoRET1xt9//22wXVJSgqVLl0Kj0aBbt24WioqIiGpLp9Phzp07BmWZmZn44Ycf0LdvX8sEVU/xGW2yiOzsbPz444+YO3cuunbtij59+lg6JCKiemPSpEn4+++/ERoaCq1Wi40bN2L//v2YN28el0Akonrr9u3b0nwVFXF1dZX1OHnhwgWEhYVh5MiR8PX1xc8//4yVK1fC29sb//rXvywdXr3CRJssYsWKFfj444/RpUsXrF692tLhEBHVK/3798e7776LrVu3ori4GK1atcLSpUsRHx9v6dCIiCxm//796NevX6V1UlNTMWbMmLoJqAYaNWqEoKAg/N///R/+/PNPODs7IzIyEm+//TY8PDwsHV69wme0iYiIiIio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Ut6zZ08UFRXhpZdegoeHB9asWYN//OMf+OKLL/DEE0+gbdu2mDNnDmbMmIEJEybg0UcfBQD07NkTwN3bnQYPHoygoCDMnDkTSqUSqamp6N+/P/73v/+hR48eAIB//etf+OKLLxAfH4927drhypUr2LdvH3766Sd069atBt8VIqoLTz/9NJo3b47k5GQcOHAAS5YswbVr17B27VoAwD//+U+sWbMGTz75JF555RVkZ2cjOTkZP/30EzZt2gSFQoH//Oc/6NSpE/71r39h48aNAICZM2fixIkTyMzMhLOzc7WOBQD//e9/8eGHH+LgwYP4v//7PwBA165d8d///hdvvfUWbt68ieTkZABA27Zty23TxYsX0aNHDxQUFGDChAkIDAzEhQsX8MUXX6CoqAj29vYoKipCnz59cOHCBbzwwgto1qwZ9u/fj6SkJFy6dMnoyYquXLmCwYMHY/jw4Rg5cqQ0nq9evRouLi5ITEyEi4sLdu3ahRkzZqCwsBALFy40OMa1a9cwaNAgREdH4+mnn8YXX3yB119/HR07dsTgwYPLfd+///4bw4YNw+HDh/Htt99KfzglIst77LHH8N///hejRo3CwIEDMXr0aGlfdcagJk2aYMWKFZg4cSKeeOIJREdHAwA6depU6fv+73//w9dff424uDgAd89fhwwZgilTpmD58uV48cUXce3aNSxYsADPP/88du3aJb22uud9VdHr9Rg6dCgOHjyIiRMnIjAwEF999RViY2PLrX/nzh1ERESgd+/eeOedd+Dk5AQhBP7xj39g9+7dGDduHLp06YKdO3fitddew4ULF6THiE6cOIEhQ4agU6dOmDNnDtRqNU6fPm3wx4FVq1bhpZdewpNPPin9QfnHH39EdnY2nnvuuWq1iaogqN5LTU0VAMSZM2eEEEL4+/sLAGL//v1SnZ07dwoAwtHRUZw7d04q/+CDDwQAsXv3bqmsS5cuwsfHRxQUFEhlaWlpAoDw9/eXys6cOSMd848//pDKs7OzBQAxefLkarehNI5jx44ZlLdr1070799f2k5ISBAAxP/+9z+p7MaNGyIgIEA0b95clJSUCCGEOHTokAAgUlNTDY6n1+tF69atRUREhNDr9VJ5UVGRCAgIEAMHDpTKXF1dRVxcXLXbQESWNXPmTAFA/OMf/zAof/HFFwUA8cMPP4ijR48KAOKf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pCvwc+bMwd69exEZGQl/f39cvnwZy5cvR9OmTaUJgcPDw+Ht7Y1evXrBy8sLP/30E5YtW4bIyMgyz4BTDVlqunOSj/KW94qMjCxTD+UsxVC6RNfChQsNyr/88kvRtm1boVarRbt27cTGjRtFbGxsuct7LVy4ULz77rvCz89PqNVq8eijj4offvihRm0pLCwUjo6O0pI65fn111/Fk08+Kdzc3ISDg4Po0aOH2Lp1a5l6X331lWjXrp1o0KBBmWUXjhw5IqKjo4WHh4dQq9XC399fPP300yIjI0MIcXcJmtdee0107txZNGzYUDg7O4vOnTuL5cuX16hdRGR+pcvCnDx5Ujz55JOiYcOGolGjRiI+Pl78/fffUj2dTidmz54tAgIChEqlEn5+fiIpKUlamur3338Xrq6uYujQoWXe44knnhDOzs7it99+q9axStV2eS8hhDh37pwYPXq0aNKkiVCr1aJFixYiLi5OaLVaqc6NGzdEUlKSaNWqlbC3txeNGzcWPXv2FO+88464fft2tfuyoriEEOK7774TjzzyiHB0dBS+vr5iypQp0hKS9y8VWdExHvxdcv/yXvebMmWKACCWLVtW7biJqPZquryXENUfg/bv3y+CgoKEvb29wXhX0fJe1T1/rWg8qeq8r7r+/PNP8dxzz4mGDRsKV1dXMWbMGPHdd98JAGL9+vVSvYrG/NI+mjx5svD19RUqlUq0bt1aLFy40GD5sYyMDDFs2DDh6+sr7O3tha+vr3j22WcNlk774IMPxGOPPSa1qWXLluK1114T169fN6pNVDGFEDKYxYqIiIiIiKie2bx5M5544gns27ePM37bGCbaREREREREZvb3338brMhQUlKC8PBwHD58GHl5eeWu1kDWi89ok6zdvn273Akd7ufq6sqBiYioDly9ehW3b9+ucL+dnV2Fa+ASEdmikpKSKidFc3FxgYuLCyZNmoS///4boaGh0Gq12LhxI/bv34958+bxXNYG8Yo2yVpmZmaVEwKlpqZizJgxdRMQEVE91rdvX+zZs6fC/f7+/jh79mzdBUREZGFnz541WBKyPDNnzsSsWbOwbt06vPvuuzh9+jSKi4vRqlUrTJw4EfHx8XUULdUloxLt5ORkbNy4ET///DMcHR3Rs2dPzJ8/H23atJHqFBcX45VXXsH69euh1WoRERGB5cuXw8vL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+BhjTO3uMwcAAAAA4OLh8edoAwAAAADgTii0AQAAAACwEIU2AAAAAAAWotAGAAAAAMBCFNoAAAAAAFiIQhsAAAAAAAtRaAMAAAAAYCEKbaCOtGzZUiNGjHB1GHVqzZo1GjBggJo1ayYfHx8tWrSoyvMwxujpp5/WZZddJpvNpubNm+uxxx6zPlgAAAB4NCvWPZcuXaprrrlGDRo0UJMmTTR48GB9/fXXVZ4PhbYH+vzzzzVlyhQVFBS4OpTz8pQ4rXQx5nw+J0+e1FVXXaWZM2dWex5jxozRv//9bz399NP66quv9OGHH6pr164WRomLjaf8n3pKnLXlYs8fAFB1NV33PHDggG666Sb17NlTOTk5Wrp0qX766ScNGjSo6jMz8DhPPfWUkWQOHDjg6lDOy1PitNL5cj516pQ5ffp03QflJiSZhQsXOrWdOnXKjB8/3jRr1syEhISYrl27mpUrVzqm79y50/j7+5uvvvqqboOFV/OUsclT4qwtF3v+AICaqc6654IFC4y/v78pKSlxtH344YfGx8enyuvx7NEGzuPkyZOWzctmsykgIMCy+XmDUaNGad26dZo/f762bt2qW265RX379tWePXskSR999JEuvfRSLV68WHFxcWrZsqXuuusuHT161MWRAwAAwNNcaN2zc+fO8vX11Zw5c1RSUqJjx47pjTfeUFJSUtXX42uylQB1b/LkyUZSuceBAweM3W4306ZNM5deeqkJDAw0sbGxJj093Zw6dcppHrGxsaZ///5m5cqVpnPnziYoKMjEx8c7tua89957Jj4+3thsNtOpUyezefNmp9d/+eWXJiUlxcTFxRmbzWYiIyPN7bffbn766adKxWmMqXSsxhjzySefmO7du5uQkBBTv359c+ONN5rt27c79Tl06JAZMWKEad68uQkMDDRRUVHmj3/8Y5X2hJTFvGPHDjNs2DATHh5uOnToYFnOsbGxJiUlxdF/zpw5RpJZu3atGTdunGncuLEJCQkxAwcONIcPH3aKraSkxEyePNlER0eb4OBg06NHD7Njx45y83RnOmur4jfffGP8/PzM999/79SvV69eJj093RhjzN/+9jdjs9lMQkKCWbNmjVm5cqXp0KGDueGGG+oydHgRxtDaGUMXLFhgJJlVq1aVmzZ79mwjyWzbts3RlpWV5YgpLCzM/PGPfzQ7d+6sdP7GGPPGG2+YTp06maCgINOwYUMzZMgQc/DgQadl79692wwaNMhERkYam81mmjdvboYMGWIKCgoqlRcAwHNVZ93TGGNWrVplmjZtavz8/Iwkk5iYaH7++ecqL9+/amU5XG3QoEHavXu33n77bT333HNq3LixJKlJkya666679Nprr+lPf/qTxo8frw0bNigjI0O7du3SwoULneazd+9e/fnPf9bf/vY3/eUvf9HTTz+tAQMGaPbs2XrooYf097//XZKUkZGhW2+9Vbm5ufL1/fUAiMzMTO3fv1+33367oqKitGPHDr3yyivasWOH1q9fLx8fn/PGKanSsb7xxhtKSUlRcnKynnzySRUVFWnWrFnq3r27tmzZopYtW0qSBg8erB07dmj06NFq2bKlDh8+rMzMTB08eNDRp7JuueUWtW7dWo8//rh+/R+1JudzGT16tBo2bKjJkyfr66+/1owZMzRq1Ci98847jj7p6emaPn26BgwYoOTkZH355ZdKTk7WqVOnqpSbO9m2bZtKSkp02WWXObUXFxerUaNGkqTS0lIVFxfr9ddfd/R79dVX1blzZ+Xm5uryyy+v87jh2RhDa2cM7d+/v+rXr693331X119/vdO0d955R1deeaXi4+MlScuXL1e/fv106aWXasqUKfrll1/0wgsvqFu3btq8ebNatmx5wfwfe+wxTZw4Ubfeeqvuuusu/fjjj3rhhRd03XXXacuWLQoPD9fp06eVnJys4uJijR49WlFRUfr++++1ePFiFRQUKCwsrNLfGwCA56vMumdeXp7uvvtupaSkaNiwYTp+/LgmTZqkP/3pT8rMzJSPj0/lF1jNDQRwoYrOW8vJyTGSzF133eXU9/777zeSzIoVKxxtsbGxRpL5/PPPHW1Lly41kkxwcLD55ptvHO0vv/yykeR07kJRUVG5mN5++20jyaxZs+a8cVYl1uPHj5vw8HBz9913O/XLy8szYWFhjvaff/7ZSDJPPfVURW9XpZXtQRk2bFi5aTXN2Zhz79FOSkoypaWljvZx48YZPz8/xx6XvLw84+/vbwYOHOg0vylTphhJHrtHe/78+cbPz8989dVXZs+ePU6PQ4cOGWOMmTRpkvH393eaT1FRkZFkli1bVpfhw4swhtbOGDps2DDTtGlTc+bMGUfboUOHjK+vr5k2bZqjrUOHDqZp06bmyJEjjrYvv/zS+Pr6mr/+9a8XzP/rr782fn5+5rHHHnNq37Ztm/H393e0b9myxUgyCxYsqFFeAADPVJ11z4cffth06dLFaT7ffvutkWTWrVtXpeVzjraX+OSTTyRJaWlpTu3jx4+XJH388cdO7VdccYUSExMdzxMSEiRJPXv2VIsWLcq179+/39EWHBzs+PvUqVP66aefdM0110iSNm/ebFmsmZmZKigo0LBhw/TTTz85Hn5+fkpISNDKlSsd8QQGBmrVqlX6+eefL7j8C7nnnnvKtdU05/MZOXKk09ax3//+9yopKdE333wjScrKytKZM2cce8jKjB49ukbLdbWOHTuqpKREhw8f1u9+9zunR1RUlCSpW7duOnPmjPbt2+d43e7duyVJsbGxLokb3okxtOZj6JAhQ3T48GGtWrXK0fbf//5XpaWlGjJkiCTp0KFDysnJ0YgRIxQREeHo1759e/Xu3duR2/m8//77Ki0t1a233uqUV1RUlFq3bu3Iq2yP9dKlS1VUVFTtvAAA3qEy655FRUWOI9DK+Pn5Sfr1SMuqoND2Et988418fX31u9/9zqk9KipK4eHhjqKtzG9XBKX/rZDExMRU2P7bla+jR49qzJgxioyMVHBwsJo0aaK4uDhJ0rFjxyyLteyiBD179lSTJk2cHsuWLdPhw4cl/XqRsSeffFKffvqpIiMjdd1112n69OnKy8u7YCwVKcvlt2qa8/mc/Vk0bNhQ0v/e87L34+z3KyIiwtHXXZ04cUI5OTnKycmR9OstE3JycnTw4EFddtllGj58uP7617/q/fff14EDB/TFF18oIyPDUSgkJSWpU6dOuuOOO7RlyxZlZ2frb3/7m3r37l3usB+gJhhDaz6G9u3bV2FhYU6nvbzzzjvq0KGD4/+1LLaKTvto27atfvrppwtehHLPnj0yxqh169bl8tq1a5cjr7i4OKWlpenf//63GjdurOTkZM2cObPGYzYAwH3VdN2zf//+2rhxo6ZNm6Y9e/Zo8+bNuv322xUbG6uOHTtWKRbO0fYylT1voGzLTGXbzf8/V1mSbr31Vn3++ed64IEH1KFDB9WvX1+lpaXq27dvlbb0XCjWsnm98cYbjq1Mv+Xv/7+v79ixYzVgwAAtWrRIS5cu1cSJE5WRkaEVK1ZU+Z/it3ubyliVc0Uq8557qk2bNumGG25wPC/bA5eSkqK5c+dqzpw5evTRRzV+/Hh9//33aty4sa655hr94Q9/kCT5+vrqo48+0ujRo3XdddepXr166tevn5555hmX5APvxxha/THUZrNp4MCBWrhwoV566SXl5+frs88+0+OPP17pnCqjtLRUPj4++vTTTyt8v+vXr+/4+5lnntGIESP0wQcfaNmyZbrvvvuUkZGh9evX65JLLrE0LgCA69V03bNnz56aN2+epk+frunTpyskJESJiYlasmRJhTXC+VBoe6CKVq5iY2NVWlqqPXv2qG3bto72/Px8FRQUWHaY7c8//6ysrCxNnTpVkyZNcrSX7Tm5UJxVibVVq1aSpKZNmyopKemCsbVq1Urjx4/X+PHjtWfPHnXo0EHPPPOM3nzzzSrleDYrcq6Jsvdj7969Tnvbjxw5Ysmh8rWpR48e591gEBAQoKlTp2rq1Knn7NOsWTO99957tREeLlKMoRWzYgwdMmSIXnvtNWVlZWnXrl0yxjgOGy+LXZJyc3PLvfarr75S48aNVa9ePUnnzr9Vq1YyxiguLq5SR7a0a9dO7dq108MPP6zPP/9c3bp10+zZs/Xoo49WOi8AgGewYt1z6NChGjp0aI1j4dBxD1S2ElJQUOBou/HGGyVJM2bMcOr77LPPSvr1MAgrlO09OPsLfPZyzxWnVPlYk5OTFRoaqscff1x2u73c/H/88UdJv55LcfbVt1u1aqUGDRqouLi4ElmdnxU510SvXr3k7++vWbNmObW/+OKLli0DuJgwhv6qNsbQpKQkRURE6J133tE777yjrl27Om0gjI6OVocOHfTaa6855bV9+3YtW7bMkZt07vwHDRokPz8/TZ06tdz7aIzRkSNHJEmFhYU6c+aM0/R27drJ19fXkt8GAADOhz3aHqhz586SpH/+858aOnSoAgICNGDAAKWkpOiVV15RQUGBrr/+en3xxRd67bXXNHDgQKdDKGoiNDTUcf6e3W5X8+bNtWzZMh04cKDScV511VWVijU0NFSzZs3Sbbfdpk6dOmno0KFq0qSJDh48qI8//ljdunXTiy++qN27d6tXr1669dZbdcUVV8jf318LFy5Ufn6+JVujrMi5bIWxOiIjIzVmzBg988wz+uMf/6i+ffvqyy+/1KeffqrGjRvXyl50wJsxhtbeGBoQEKBBgwZp/vz5OnnypJ5++ulyfZ566in169dPiYmJ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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAK8CAYAAACTCf6PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAADbcklEQVR4nOzde1hU1f4/8PcMDgOoA4JcFRQvifcbSnjJG4Ic80jSxY4Vmkf7GnpCjpl0vKEVXkotRcwy1MpMKy3TVCLBYyIqaWkWqWGaCpaIKMQ4Muv3hz/2cbhf5rJneL+eh0f32mv2/qzFsGZ/Zu+9tkIIIUBEREREREREFqe0dABEREREREREdA+TdCIiIiIiIiKZYJJOREREREREJBNM0omIiIiIiIhkgkk6ERERERERkUwwSSciIiIiIiKSCSbpRERERERERDLBJJ2IiIiIiIhIJpikExEREREREckEk3SiGkycOBFt27a1dBhEREREVI2NGzdCoVDgwoULlg6lShcuXIBCocDrr79u6VBIxpikN0ILFy6EQqHAn3/+Wen6bt26YejQoeYNysZ98cUX6NOnDxwcHODn54cFCxbg7t27lg6LiIiIiExgz549WLhwoaXDICvFJJ3IxL766itERETAxcUFq1evRkREBF555RXMmDHD0qERERERkQns2bMH8fHxlg6DrFQTSwdAZOtmzZqFHj16YP/+/WjS5N6fnEajwWuvvYYXXngBAQEBFo6QiKjuSkpKYG9vD6WS3/cTEREZEz9ZqUZpaWlQKBTYtm0bXn31VbRu3RoODg4YMWIEzp07Z1B36NCh6NatG86cOYNhw4bByckJrVq1wrJlywzq3blzB/Pnz0ffvn3h7OyMpk2bYvDgwThw4IBBvfvv20lMTES7du3g5OSE0NBQXLp0CUIILF68GK1bt4ajoyPGjh2L/Pz8Cm346quvMHjwYDRt2hTNmzfH6NGj8eOPP1aot3PnTnTr1g0ODg7o1q0bduzYUWmfXL16FT///DN0Ol21fXfmzBmcOXMGU6dOlRJ0AHj++echhMAnn3xS7euJiO534MABKBSKSsemLVu2QKFQICMjAwDw888/49FHH4WrqyscHBwQGBiIL774wuA1+fn5mDVrFrp3745mzZpBo9EgPDwc33//vUG9ss+BrVu3Yu7cuWjVqhWcnJxQWFhousYS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jvD398e8efPg4+ODiIgIywZPREREREbBJJ2ISCZWr16NefPm4fnnn8e1a9fg4+OD5557DvPnz5fqzJ49G0VFRZg6dSoKCgowaNAg7N27Fw4ODhaMnIiIiIiMhUk6EZFMNG/eHKtWrcKqVauqrKNQKLBo0SIsWrTIfIERERERkdkwSSciIiIiIklNs7Or7cwUCFEjpay5ChERERERERGZA5N0IiIiIiIiIplgkk5EREREREQkE0zSiYiIiIiIiGSCSToRERERERGRTHB2dyIiIiIiMpuaZo8naux4Jp2IiIiIiIhIJpikExEREZHNWLJkCRQKBWJiYqSykpISREdHw83NDc2aNUNkZCTy8vIsFyQRUTWYpBMRERGRTTh27Bjefvtt9OjRw6B85syZ2LVrF7Zv34709HRcuXIF48aNs1CURETVY5JORERERFbv9u3bmDBhAt555x20aNFCKr958yY2bNiAFStWYPjw4ejbty+Sk5Nx+PBhHDlyxIIRExFVjhPHEREREZHVi46OxujRoxESEoJXXnlFKs/KyoJOp0NISIhUFhAQAD8/P2RkZODBBx+sdHtarRZarVZaLiwsBADodDrodDoTtcJ81Hai/q9VCoN/zc2a+r8sVmuK2ZLk3l/miotJOhERERFZta1bt+K7777DsWPHKqzLzc2Fvb09XFxcDMo9PT2Rm5tb5TYTEhIQHx9foXz//v1wcnJqcMyWtqx/w7exOFDf8I3Uw549eyyy34ZISUmxdAhWRa79VVxcbJb9MEknIiIiIqt16dIlvPDCC0hJSYGDg4PRthsXF4fY2FhpubCwEL6+vggNDYVGozHafiyl28J99X6tWimwOFCPeceV0OoVRoyqdk4vDDP7PutLp9MhJSUFI0eOhEqlsnQ4sif3/iq7osbUmKQTERERkdXKysrCtWvX0KdPH6mstLQUBw8exJo1a7Bv3z7cuXMHBQUFBmfT8/Ly4OXlVeV21Wo11Gp1hXKVSiXL5KGutKUNT661eoVRtlNX1tj/tvK+MRe59pe5YmKSTkRERERWa8SIETh16pRB2aRJkxAQEICXXnoJvr6+UKlUSE1NRWRkJAAgOzsbFy9eRHBwsCVCJiKqFpN0IiIiIrJazZs3R7du3QzKmjZtCjc3N6l88uTJiI2NhaurKzQaDWbMmIHg4OAqJ40jIrIkJulERERE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vONKaPWKSuucXhhWy1bJU1kbR44cadOP9mM7bUdD21h2RQ0REckTk3QiIhn6/fffcf36dXh7ewMAgoODUVBQgKysLPTt2xcA8M0330Cv1yMoKKjK7ajV6gqzxAP3njNfl4N7rV4BbWnlSbqtJEJ17RNrxXbajvq20db7hYjI2jFJJyIyg9u3b+PcuXPSck5ODk6ePAlXV1e4uroiPj4ekZGR8PLywvnz5zF79mx06NABYWH3zlJ37twZo0aNwpQpU7Bu3TrodDpMnz4d48eP58zuRERERDbE6LO7ExFRRcePH0fv3r3Ru3dvAEBsbCx69+6N+fPnw87ODj/88AP+/ve/44EHHsDkyZPRt29f/Pe//zU4C/7hhx8iICAAI0aMwN/+9jcMGjQI69evt1STiIiIiMgEeCadiMgMhg4dCiGqniF93759NW7D1dUVW7ZsMWZYRERERCQzPJNOREREREREJBNM0omIiIiIiIhkgkk6ERERERERkUwwSSciIiIiIiKSCSbpRERERERERDLBJJ2IiIiIiIhIJpikExEREREREckEk3QiIiIiIiIimWCSTkRERERERCQTTNKJiIiIiIiIZKKJpQMgorprO2e3pUMgIiIiIiIT4Jl0IiIiIiIiIplgkk5EREREVu3y5ct46qmn4ObmBkdHR3Tv3h3Hjx+X1gshMH/+fHh7e8PR0REhISE4e/asBSMmIqoak3QiIiIislo3btzAwIEDoVKp8NVXX+HMmTN444030KJFC6nOsmXL8NZbb2HdunXIzMxE06ZNERYWhpKSEgtGTkRUOd6TTkRERERWa+nSpfD19UVycrJU5u/vL/1fCIFVq1Zh7ty5GDt2LABg8+bN8PT0xM6dOzF+/Hizx0xEVB2eSSciIiIiq/XFF18gMDAQjz32GDw8PNC7d2+888470vqcnBzk5uYiJCREKnN2dkZQUBAyMjIsETIRUbVMcib98uXLeOmll/DVV1+huLgYHTp0QHJyMgIDAwHc+0ZzwYIFeOedd1BQUICBAwciKSkJHTt2NEU4RERERGSjfv31VyQlJSE2NhYvv/wyjh07hn/961+wt7dHVFQUcnNzAQCenp4Gr/P09JTWVUar1UKr1UrLhYWFAACdTgedTldtTGXr1UpRYx2qXFn/sJ/qh/3XMFX1n7n60+hJetl9QcOGDcNXX30Fd3d3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V0REto5FOhGRTMTFxWHNmjXYvHkzmjdvjoKCAgCAu7s7XFxccPbsWaxZswZDhw5Fy5YtcfToUUybNg39+/dH9+7dLRw9EREREZkDi3QiIplYvnw5AGDgwIFG7StXrsT48ePh5OSEnTt3YunSpSgpKYG/vz+io6Px5ptvWiBaIiIiImoMLNKJiGRCiJqvHO3v74/09PQmioaIiIiILIFFOhERERERWY3qLr6mdBBWcRcGubLlC/ZZGxbpTYBveCIiIiIiIjKFvaUDICIiIiIiIqJbuCediIiIiIhI5iqOzq04rD9o7g6jW0Py6FzbwT3pRERERERERDLBPelmUNs550RERERERDVhTUEVuCediIiIiIiISCa4J52IiIjo/3BPFhERWRr3pBMRERERERHJBIt0IiIiIiIiIplgkU5EREREREQkEyzSiYiIiIiIiGSCRToRERERERGRTPDq7kRERERERDaOd6+wHtyTTkRERERERCQTLNKJiIiIiIiIZIKHu1uB2g5NOffOsCaKhIiIiIiIiBoTi3QZ4PkhRERETePOz1ylg8CiPkDQ3B3QldtZKCoiIqLbWKTf5biXnoiIiIiIGqKxa4q7rWZhkW4DanrT2tobloiIiIiIyJaxSCciIiIj1rzHgqeQEdHdSs7znzV/rlgCi3QiIiKyGnL+J5SIiMgceAs2IiIiIiIiIpngnnQb19hXseWhK0TUEJxDLIN7o4mIqK4a87Ojqm3/s24B7q67b1i0SE9JScG7776LgoIC9OjRA8uWLUOfPn0sGRLdwZL/yDX2P+9Bc3fU+IUFiwOSK2uaO625GOQXCI2D40qWZE3zJxHdvSxWpK9btw4JCQlYsWIFQkJCsHTpUkRGRiInJwfe3t6WCovMjP+MEZkX507zkcMXCI11b+7Gnlsrxq4x7jEuh98L2SbOn0RkLSxWpL///vuYOHEinnnmGQDAihUr8N133+H/+//+P8ycOdNSYVETa+rDZv5J6dCw5/MLhvrhuDYM504iovrh/El097K2W1ZbpEi/ceMGsrKykJiYKLXZ29sjPDwcmZmZlfrrdDrodDpp+erVqwCAK1euQK/X1/p6er0epaWlcNTbo9xwd53PcCdHg0BpqcEmxuKeV76pcX1tb+6GjsXly5erXReSnFbjcw8khtW4vqHPr6uKv5HLly+j3+KMBr12bbHX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kAURERERUePinnQisohjx46hvLwcnTp1gpubm/RIT0/H2bNnAQAFBQWYOHEiYmNjcejQIaSnp8PJyQmPPfYY+P0iEREREdkiR0sHQER3p+vXr8PBwQFZWVlwcHAwWufm5gYASElJgbu7OxYtWiSt++qrr+Dv748DBw6gb9++TRozEREREVFjY5FORBbRq1cvlJeX49KlS3jwwQer7FNaWipdMK5CRUFvMBgaPUYiIiIioqbGw92JqNFcv34d2dnZyM7OBnDrlmrZ2dnIz89Hp06dEBMTg6effhobNmxAXl4eDh48iOTkZHz33XcAgGHDhuHQoUOYN28ecnNz8eOPP+KZZ55BQEAAevXqZcHMiIiIiIgaBy8cR0SNZs+ePXjooYcqtcfGxmLVqlXQ6/WYP38+vvjiC5w/fx5eXl7o27cvkpKS0K1bNwDA2rVrsWjRIpw+fRqurq7QaDRYuHAhOnfu3NTpEBERERE1OhbpRERERERERDLBw92JiIiIiIiIZIJFOhEREREREZFMsEgnIiIiIiIikgkW6UREREREREQywSKdiIiIiIiISCZYpBMRERERERHJBIt0IiIiIiIiIplgkU5EREREREQkEyzSiYiIiIiIiGSCRToRERERERGRTLBIJyIiIiIiIpIJFulEREREREREMvH/AxuAd1iuozb8AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -6312,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -6352,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -6386,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -6449,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -6470,10 +415,10 @@ " 9.05]),\n", " array([ 79.5, 81.5, 83.5, 85.5, 87.5, 89.5, 91.5, 93.5, 95.5,\n", " 97.5, 99.5, 101.5]),\n", - " )" + " )" ] }, - "execution_count": 54, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, @@ -6530,7 +475,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -6539,7 +484,7 @@ "" ] }, - "execution_count": 55, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, @@ -6587,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -6653,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -6704,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -6810,7 +755,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -6819,7 +764,7 @@ "0.6673272196886042" ] }, - "execution_count": 59, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -6839,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -6863,6 +808,7 @@ " \n", " \n", " \n", + " Unnamed: 0\n", " is_adult\n", " year\n", " length\n", @@ -6876,6 +822,19 @@ " \n", " \n", " \n", + " Unnamed: 0\n", + " 1.000000\n", + " NaN\n", + " 0.111334\n", + " -0.271571\n", + " -0.411800\n", + " -0.818634\n", + " 0.733054\n", + " -0.626876\n", + " -0.182300\n", + " -0.528328\n", + " \n", + " \n", " is_adult\n", " NaN\n", " NaN\n", @@ -6886,9 +845,11 @@ " NaN\n", " NaN\n", " NaN\n", + " NaN\n", " \n", " \n", " year\n", + " 0.111334\n", " NaN\n", " 1.000000\n", " -0.164026\n", @@ -6901,6 +862,7 @@ " \n", " \n", " length\n", + " -0.271571\n", " NaN\n", " -0.164026\n", " 1.000000\n", @@ -6913,6 +875,7 @@ " \n", " \n", " imdb_rating\n", + " -0.411800\n", " NaN\n", " -0.258788\n", " 0.264138\n", @@ -6925,6 +888,7 @@ " \n", " \n", " imdb_votes\n", + " -0.818634\n", " NaN\n", " -0.020599\n", " 0.325280\n", @@ -6937,6 +901,7 @@ " \n", " \n", " boxoffice_rank\n", + " 0.733054\n", " NaN\n", " 0.024687\n", " -0.227022\n", @@ -6949,6 +914,7 @@ " \n", " \n", " lifetime_gross\n", + " -0.626876\n", " NaN\n", " 0.105194\n", " 0.211506\n", @@ -6961,6 +927,7 @@ " \n", " \n", " tomatoes_rating\n", + " -0.182300\n", " NaN\n", " -0.143181\n", " 0.001890\n", @@ -6973,6 +940,7 @@ " \n", " \n", " tomatoes_votes\n", + " -0.528328\n", " NaN\n", " 0.583895\n", " 0.141379\n", @@ -6988,29 +956,32 @@ "" ], "text/plain": [ - " is_adult year length imdb_rating imdb_votes \\\n", - "is_adult NaN NaN NaN NaN NaN \n", - "year NaN 1.000000 -0.164026 -0.258788 -0.020599 \n", - "length NaN -0.164026 1.000000 0.264138 0.325280 \n", - "imdb_rating NaN -0.258788 0.264138 1.000000 0.465902 \n", - "imdb_votes NaN -0.020599 0.325280 0.465902 1.000000 \n", - "boxoffice_rank NaN 0.024687 -0.227022 -0.107621 -0.529907 \n", - "lifetime_gross NaN 0.105194 0.211506 0.202497 0.649080 \n", - "tomatoes_rating NaN -0.143181 0.001890 0.667327 0.167706 \n", - "tomatoes_votes NaN 0.583895 0.141379 0.075651 0.434226 \n", - "\n", - " boxoffice_rank lifetime_gross tomatoes_rating \\\n", - "is_adult NaN NaN NaN \n", - "year 0.024687 0.105194 -0.143181 \n", - "length -0.227022 0.211506 0.001890 \n", - "imdb_rating -0.107621 0.202497 0.667327 \n", - "imdb_votes -0.529907 0.649080 0.167706 \n", - "boxoffice_rank 1.000000 -0.612221 0.028940 \n", - "lifetime_gross -0.612221 1.000000 0.077516 \n", - "tomatoes_rating 0.028940 0.077516 1.000000 \n", - "tomatoes_votes -0.432609 0.499844 0.059786 \n", + " Unnamed: 0 is_adult year length imdb_rating \\\n", + "Unnamed: 0 1.000000 NaN 0.111334 -0.271571 -0.411800 \n", + "is_adult NaN NaN NaN NaN NaN \n", + "year 0.111334 NaN 1.000000 -0.164026 -0.258788 \n", + "length -0.271571 NaN -0.164026 1.000000 0.264138 \n", + "imdb_rating -0.411800 NaN -0.258788 0.264138 1.000000 \n", + "imdb_votes -0.818634 NaN -0.020599 0.325280 0.465902 \n", + "boxoffice_rank 0.733054 NaN 0.024687 -0.227022 -0.107621 \n", + "lifetime_gross -0.626876 NaN 0.105194 0.211506 0.202497 \n", + "tomatoes_rating -0.182300 NaN -0.143181 0.001890 0.667327 \n", + "tomatoes_votes -0.528328 NaN 0.583895 0.141379 0.075651 \n", + "\n", + " imdb_votes boxoffice_rank lifetime_gross tomatoes_rating \\\n", + "Unnamed: 0 -0.818634 0.733054 -0.626876 -0.182300 \n", + "is_adult NaN NaN NaN NaN \n", + "year -0.020599 0.024687 0.105194 -0.143181 \n", + "length 0.325280 -0.227022 0.211506 0.001890 \n", + "imdb_rating 0.465902 -0.107621 0.202497 0.667327 \n", + "imdb_votes 1.000000 -0.529907 0.649080 0.167706 \n", + "boxoffice_rank -0.529907 1.000000 -0.612221 0.028940 \n", + "lifetime_gross 0.649080 -0.612221 1.000000 0.077516 \n", + "tomatoes_rating 0.167706 0.028940 0.077516 1.000000 \n", + "tomatoes_votes 0.434226 -0.432609 0.499844 0.059786 \n", "\n", " tomatoes_votes \n", + "Unnamed: 0 -0.528328 \n", "is_adult NaN \n", "year 0.583895 \n", "length 0.141379 \n", @@ -7022,7 +993,7 @@ "tomatoes_votes 1.000000 " ] }, - "execution_count": 60, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -7064,7 +1035,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -7099,6 +1070,8 @@ " if pd.api.types.is_categorical_dtype(vector):\n", "c:\\Users\\janpi\\Documents\\code\\collaboration\\pyladies-kurz\\.venv\\Lib\\site-packages\\seaborn\\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", " if pd.api.types.is_categorical_dtype(vector):\n", + "c:\\Users\\janpi\\Documents\\code\\collaboration\\pyladies-kurz\\.venv\\Lib\\site-packages\\seaborn\\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", "c:\\Users\\janpi\\Documents\\code\\collaboration\\pyladies-kurz\\.venv\\Lib\\site-packages\\seaborn\\_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n", " with pd.option_context('mode.use_inf_as_na', True):\n", "c:\\Users\\janpi\\Documents\\code\\collaboration\\pyladies-kurz\\.venv\\Lib\\site-packages\\seaborn\\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", @@ -7204,10 +1177,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 61, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, @@ -7247,29 +1220,28 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tconst\n", - "tt0000009 (1890, 1900]\n", - "tt0000147 (1890, 1900]\n", - "tt0000335 (1890, 1900]\n", - "tt0000574 (1900, 1910]\n", - "tt0000615 (1900, 1910]\n", - " ... \n", - "tt9910930 (2010, 2020]\n", - "tt9911774 (2010, 2020]\n", - "tt9913056 (2010, 2020]\n", - "tt9913084 (2010, 2020]\n", - "tt9914286 (2010, 2020]\n", + "0 (1890, 1900]\n", + "1 (1890, 1900]\n", + "2 (1890, 1900]\n", + "3 (1900, 1910]\n", + "4 (1900, 1910]\n", + " ... \n", + "232491 (2010, 2020]\n", + "232492 (2010, 2020]\n", + "232493 (2010, 2020]\n", + "232494 (2010, 2020]\n", + "232495 (2010, 2020]\n", "Name: year, Length: 232496, dtype: category\n", "Categories (13, interval[int64, right]): [(1890, 1900] < (1900, 1910] < (1910, 1920] < (1920, 1930] ... (1980, 1990] < (1990, 2000] < (2000, 2010] < (2010, 2020]]" ] }, - "execution_count": 62, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -7290,29 +1262,28 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tconst\n", - "tt0000009 1890s\n", - "tt0000147 1890s\n", - "tt0000335 1890s\n", - "tt0000574 1900s\n", - "tt0000615 1900s\n", - " ... \n", - "tt9910930 2010s\n", - "tt9911774 2010s\n", - "tt9913056 2010s\n", - "tt9913084 2010s\n", - "tt9914286 2010s\n", + "0 1890s\n", + "1 1890s\n", + "2 1890s\n", + "3 1900s\n", + "4 1900s\n", + " ... \n", + "232491 2010s\n", + "232492 2010s\n", + "232493 2010s\n", + "232494 2010s\n", + "232495 2010s\n", "Name: year, Length: 232496, dtype: category\n", "Categories (13, object): ['1890s' < '1900s' < '1910s' < '1920s' ... '1980s' < '1990s' < '2000s' < '2010s']" ] }, - "execution_count": 63, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -7346,28 +1317,27 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tconst\n", - "tt0000009 Romance\n", - "tt0000147 Documentary\n", - "tt0000147 News\n", - "tt0000147 Sport\n", - "tt0000335 Biography\n", - " ... \n", - "tt9911774 Drama\n", - "tt9913056 Documentary\n", - "tt9913084 Documentary\n", - "tt9914286 Drama\n", - "tt9914286 Family\n", + "0 Romance\n", + "1 Documentary\n", + "1 News\n", + "1 Sport\n", + "2 Biography\n", + " ... \n", + "232492 Drama\n", + "232493 Documentary\n", + "232494 Documentary\n", + "232495 Drama\n", + "232495 Family\n", "Name: genres, Length: 397539, dtype: object" ] }, - "execution_count": 64, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -7388,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -7418,18 +1388,10 @@ " imdb_rating\n", " imdb_votes\n", " \n", - " \n", - " tconst\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " tt0000009\n", + " 0\n", " Miss Jerry\n", " Romance\n", " 1890s\n", @@ -7437,7 +1399,7 @@ " 77\n", " \n", " \n", - " tt0000147\n", + " 1\n", " The Corbett-Fitzsimmons Fight\n", " Documentary\n", " 1890s\n", @@ -7445,7 +1407,7 @@ " 289\n", " \n", " \n", - " tt0000147\n", + " 1\n", " The Corbett-Fitzsimmons Fight\n", " News\n", " 1890s\n", @@ -7453,7 +1415,7 @@ " 289\n", " \n", " \n", - " tt0000147\n", + " 1\n", " The Corbett-Fitzsimmons Fight\n", " Sport\n", " 1890s\n", @@ -7461,7 +1423,7 @@ " 289\n", " \n", " \n", - " tt0000335\n", + " 2\n", " Soldiers of the Cross\n", " Biography\n", " 1890s\n", @@ -7477,7 +1439,7 @@ " ...\n", " \n", " \n", - " tt9911774\n", + " 232492\n", " Padmavyuhathile Abhimanyu\n", " Drama\n", " 2010s\n", @@ -7485,7 +1447,7 @@ " 363\n", " \n", " \n", - " tt9913056\n", + " 232493\n", " Swarm Season\n", " Documentary\n", " 2010s\n", @@ -7493,7 +1455,7 @@ " 5\n", " \n", " \n", - " tt9913084\n", + " 232494\n", " Diabolik sono io\n", " Documentary\n", " 2010s\n", @@ -7501,7 +1463,7 @@ " 6\n", " \n", " \n", - " tt9914286\n", + " 232495\n", " Sokagin Çocuklari\n", " Drama\n", " 2010s\n", @@ -7509,7 +1471,7 @@ " 72\n", " \n", " \n", - " tt9914286\n", + " 232495\n", " Sokagin Çocuklari\n", " Family\n", " 2010s\n", @@ -7522,38 +1484,36 @@ "" ], "text/plain": [ - " title genre decade imdb_rating \\\n", - "tconst \n", - "tt0000009 Miss Jerry Romance 1890s 5.5 \n", - "tt0000147 The Corbett-Fitzsimmons Fight Documentary 1890s 5.2 \n", - "tt0000147 The Corbett-Fitzsimmons Fight News 1890s 5.2 \n", - "tt0000147 The Corbett-Fitzsimmons Fight Sport 1890s 5.2 \n", - "tt0000335 Soldiers of the Cross Biography 1890s 6.3 \n", - "... ... ... ... ... \n", - "tt9911774 Padmavyuhathile Abhimanyu Drama 2010s 8.5 \n", - "tt9913056 Swarm Season Documentary 2010s 6.2 \n", - "tt9913084 Diabolik sono io Documentary 2010s 6.2 \n", - "tt9914286 Sokagin Çocuklari Drama 2010s 9.8 \n", - "tt9914286 Sokagin Çocuklari Family 2010s 9.8 \n", - "\n", - " imdb_votes \n", - "tconst \n", - "tt0000009 77 \n", - "tt0000147 289 \n", - "tt0000147 289 \n", - "tt0000147 289 \n", - "tt0000335 39 \n", - "... ... \n", - "tt9911774 363 \n", - "tt9913056 5 \n", - "tt9913084 6 \n", - "tt9914286 72 \n", - "tt9914286 72 \n", + " title genre decade imdb_rating \\\n", + "0 Miss Jerry Romance 1890s 5.5 \n", + "1 The Corbett-Fitzsimmons Fight Documentary 1890s 5.2 \n", + "1 The Corbett-Fitzsimmons Fight News 1890s 5.2 \n", + "1 The Corbett-Fitzsimmons Fight Sport 1890s 5.2 \n", + "2 Soldiers of the Cross Biography 1890s 6.3 \n", + "... ... ... ... ... \n", + "232492 Padmavyuhathile Abhimanyu Drama 2010s 8.5 \n", + "232493 Swarm Season Documentary 2010s 6.2 \n", + "232494 Diabolik sono io Documentary 2010s 6.2 \n", + "232495 Sokagin Çocuklari Drama 2010s 9.8 \n", + "232495 Sokagin Çocuklari Family 2010s 9.8 \n", + "\n", + " imdb_votes \n", + "0 77 \n", + "1 289 \n", + "1 289 \n", + "1 289 \n", + "2 39 \n", + "... ... \n", + "232492 363 \n", + "232493 5 \n", + "232494 6 \n", + "232495 72 \n", + "232495 72 \n", "\n", "[397539 rows x 5 columns]" ] }, - "execution_count": 65, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -7583,7 +1543,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -7604,7 +1564,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -7725,7 +1685,7 @@ "2010s 7.350307 5.061069" ] }, - "execution_count": 67, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -7750,7 +1710,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 22, "metadata": { "scrolled": false }, @@ -7779,7 +1739,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -7838,7 +1798,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -7857,7 +1817,7 @@ "" ] }, - "execution_count": 70, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, @@ -7889,7 +1849,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -7908,7 +1868,7 @@ }, { "data": { - "image/png": "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Pf2abomeV/W1hS0ZPoCrshM1BVcXbxjjYJwhV5y7VoLBQZ2RX1qBbj5uRvvrJV7rDmciItQfa7/NxNzRDyPpSjEKSisxZVAgvk6tW3F9yqBABHi5Yn/6dfi4dUBWQRkWjOnVZu99mCknakNM6wI3ltbr5CpziJpi9f/rr/mOuWn72b5oFLr5uNWrGWxaL1ePzNW61Uv9W1s0FAtbalETkXnK+aPnOtwNYRzq1yq3hR7ite5wJtYdzmny81vz3ofD1w2wU06Ohply65gpt46ZctsxQ2UdM+VEDw4z5Q1jHJgpt8RRMuXslBtgp5yIiIiIiIhaU2P6oSyJRkRERERERGQn7JQTERERERER2Qk75URERERERER2wk45ERERERERkZ2wU05ERERERERkJ+yUExEREREREdkJO+VEREREREREdsJOOREREREREZGdsFNOREREREREZCfslBMRERERERHZCTvlRERERERERHbCTjkRERERERGRnbBTTkRERERERGQn7JQTERERERER2Ul7e3+AB01EAAC3b9+28ychIiIiIiIiPVD6n0p/1BrNd8rLysoAAMHBwXb+JERERERERKQnZWVl8PHxsbqPk9jSdXdgtbW1uH79Ory8vODk5GTvj4Pbt28jODgYP/30E7y9ve39cdoUxsY6xscyxsY6xsc6xscyxsY6xscyxsY6xscyxsY6xseythYbEUFZWRkCAwPh7Gx91rjmM+XOzs4ICgqy98eox9vbu000lraIsbGO8bGMsbGO8bGO8bGMsbGO8bGMsbGO8bGMsbGO8bGsLcWmoQy5ggu9EREREREREdkJO+VEREREREREdsJOeStzcXHBypUr4eLiYu+P0uYwNtYxPpYxNtYxPtYxPpYxNtYxPpYxNtYxPpYxNtYxPpY5cmw0v9AbERERERERUVvFTDkRERERERGRnbBTTkRERERERGQn7JQTERERERER2Qk75URERERERER2wk65DY4dO4bo6GgEBgbCyckJ//nPf4y237lzBzExMQgKCoKbmxsGDBiAf/zjH0b75OTk4KmnnoK/vz+8vb0xc+ZM3Lhxw2if4uJizJkzB97e3ujUqRNeeOEF3Llz50EfXrM1FJ8bN25g/vz5CAwMhLu7OyZNmoSLFy8a7VNZWYklS5bAz88Pnp6emDFjRr34XL16FVOmTIG7uzsC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MAH9+/dXF4BT9O/fH6mpqaisrFQfO3XqlNE+w4YNw48//oiHH3643ufw8PBokVgQERE5KnbKiYiIHJSnpydeeOEFLFu2DHFxcUhPT8f8+fPh7Fz39d63b1/MmTMH8+bNw1dffYVLly7hzJkzeO+99/D1118DAFasWIHExES8/PLLSE1NRWZmJv7+97/j5s2b6Ny5M/z8/PDpp58iOzsbcXFxWLp0qdFnmD17NpycnPDSSy/h/Pnz+Oabb7BmzRqjfZYsWYLi4mLMmjULiYmJyMnJwcGDB7FgwQJ1QTkiIiK9YqeciIjIgX3wwQd44oknEB0djcjISDz++OMYPny4un3z5s2YN28efv/73yMsLAzTpk1DYmIievToAaCu4/7tt9/i3LlzeOyxxzB69Gjs3r0b7du3h7OzM7Zt24akpCSEh4fjtddewwcffGD0/p6enti7dy/S0tIwdOhQ/OEPf6g3TD0wMBAnTpxATU0NoqKiMHDgQMTGxqJTp07qDwhERER6xdXXiYiIiIiIiOyEP08TERERERER2Qk75URERERERER2wk45ERERERERkZ2wU05ERERERERkJ+yUExEREREREdkJO+VEREREREREdsJOOREREREREZGdsFNOREREREREZCfslBMRERERERHZCTvlRERERERERHbCTjkRERERERGRnbBTTkRERERERGQn/x/4jGmr8xSBdAAAAABJRU5ErkJggg==", + "image/png": "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xYHxISJbU8ZNayc0I8uUa7DRr8PNuRcZ7X6llPd4bpFaR3amXFbPLfP9ykScRonRF0dysHp7Oh797CjW78vG6u3piP36FFZvT1d/VrbHHc5D3OG8Tn+usfs6USdkpG862xtjWY+ZciLqKMyUNx8z5fWYKW+ImfLGOUKmnGPKNdgoJyIiIiIioo7EMeVEDu54bhFCfNxw+lIJki4WY1SEP4K8XLEr7QpGRfij6GYVBoX4oLCsEkFerkjPL8XkgcGG+Hb0eG6RGgdlLc74jAKUlFerM2wCwOSBwfj2pzz0C/ICAHWWUj1TZiO19i26sj/Ex80QdaUljJppMNfSOBg5VkTN0VgvJYAZ8pYy0jXH/B6uDAnR9kI5nluEwrJKDAvzU+//RojRz8XleO7rkwjxdcPYPgEI8HRB0sVilFXWYFJkELIKy5BZUIaxfepjdaHoFsoqazBvdK9O24uHmXKiTkYZj9cael6XEmhbbD5YMFzXDXPzdaRDfNxM1r/VroML6L+utIR2bWkAhltnWtHSOBhxTW6ilmhqjXuA1+KWMNI1x3wN+w8WDEfs16cAQF3n3tIzkXKcnmNkaZ3yllDi1xHYfV2DjXJyRMyUW8dMuXXMlLceM+X1mCknsi1mym3LSNccZsqtc5RMORvlGmyUExERERERUUdqSTuUS6IRERERERER2Qkb5URERERERER2wkY5ERERERERkZ2wUU5ERERERERkJ2yUExEREREREdkJG+VEREREREREdsJGOREREREREZGdsFFOREREREREZCdslBMRERERERHZCRvlRERERERERHbCRjkRERERERGRnbBRTkRERERERGQnbJQTERERERER2Qkb5URERERERER20tXeH6C9iQgA4MaNG3b+JERERERERGQESvtTaY82RveN8rKyMgBAeHi4nT8JERERERERGUlZWRl8fHwaPcZJmtN0d2B1dXW4cuUKvLy84OTkZO+Pgxs3biA8PBw///wzvL297f1xOhXGpnGMj3WMTeMYn8YxPtYxNo1jfKxjbBrH+FjH2DSO8bGus8VGRFBWVobQ0FA4Ozc+alz3mXJnZ2eEhYXZ+2M04O3t3SkqS2fE2DSO8bGOsWkc49M4xsc6xqZxjI91jE3jGB/rGJvGMT7WdabYNJUhV3CiNyIiIiIiIiI7YaOciIiIiIiIyE7YKO9g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", "text/plain": [ "
" ] @@ -7936,7 +1896,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -7955,7 +1915,7 @@ "" ] }, - "execution_count": 72, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, @@ -8008,7 +1968,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -8038,7 +1998,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -8111,7 +2071,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 30, "metadata": {}, "outputs": [ { diff --git a/lessons/pydata/pandas_correlations/movies_complete.csv.gz b/lessons/pydata/pandas_correlations/movies_complete.csv.gz new file mode 100644 index 0000000..589ffc3 Binary files /dev/null and b/lessons/pydata/pandas_correlations/movies_complete.csv.gz differ diff --git a/lessons/pydata/pandas_correlations/movies_with_rating.csv.gz b/lessons/pydata/pandas_correlations/movies_with_rating.csv.gz new file mode 100644 index 0000000..cfdb7eb Binary files /dev/null and b/lessons/pydata/pandas_correlations/movies_with_rating.csv.gz differ diff --git a/lessons/pydata/pandas_correlations/boxoffice_march_2019.csv.gz b/lessons/pydata/pandas_joins/boxoffice_march_2019.csv.gz similarity index 100% rename from lessons/pydata/pandas_correlations/boxoffice_march_2019.csv.gz rename to lessons/pydata/pandas_joins/boxoffice_march_2019.csv.gz diff --git a/lessons/pydata/pandas_joins/index.ipynb b/lessons/pydata/pandas_joins/index.ipynb new file mode 100644 index 0000000..5c3a49d --- /dev/null +++ b/lessons/pydata/pandas_joins/index.ipynb @@ -0,0 +1,6118 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - spojování tabulek\n", + "\n", + "Tato lekce se nese ve znamení mnohosti a propojování - naučíš se pracovat s více tabulkami najednou. Při tom společně projdeme (ne poprvé a ne naposledy) čištění reálných datových sad." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Importy jako obvykle\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "toc-hr-collapsed": false + }, + "source": [ + "## Spojování tabulek\n", + "\n", + "V lekci, kde jsme zpracovávali data o počasí, jsme ti ukázali, že je pomocí funkce `concat` možné slepit dohromady několik objektů `DataFrame` či `Series`, pokud mají \"kompatibilní\" index. Nyní se na problematiku podíváme trochu blíže a ukážeme si, jak spojovat tabulky na základě různých sloupců, a co dělat, když řádky z jedné tabulky nepasují přesně na tabulku druhou.\n", + "\n", + "Obecně pro spojování `pandas` nabízí tři funkce / metody, z nichž každá má svoje typické využití (možnostmi se ovšem překrývají):\n", + "\n", + "- [`concat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html) je univerzální funkce pro slepování dvou či více tabulek / sloupců - pod sebe, vedle sebe, s přihlédnutím k indexům i bez něj. \n", + "- [`merge`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html) je univerzální funkce pro spojování tabulek na základě vazby mezi indexy nebo sloupci.\n", + "- [`join`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html) (metoda) zjednodušuje práci, když chceš spojit dvě tabulky na základě indexu.\n", + "\n", + "Detailní rozbor toho, co která umí, najdeš v [dokumentaci](https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html). My si je také postupně ukážeme." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Jednoduché skládání" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Pod sebou\n", + "\n", + "To je asi ten nejjednodušší případ - máme dva objekty `Series` nebo dva kusy tabulky se stejnými sloupci a chceme je spojit pod sebou. Na to se používá funkce [`concat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "a = pd.Series([\"jedna\", \"dvě\", \"tři\"])\n", + "b = pd.Series([\"čtyři\", \"pět\", \"šest\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 jedna\n", + "1 dvě\n", + "2 tři\n", + "0 čtyři\n", + "1 pět\n", + "2 šest\n", + "dtype: object" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.concat([a, b])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "💡 Vidíš, že se index opakuje? Vytvořili jsme dvě `Series`, u kterých jsme index neřešili. Jenže `pandas` na rozdíl od nás ano, a tak poslušně oba indexy spojil, i za cenu duplicitních hodnot. Za cenu použití dodatečného argumentu `ignore_index=True` se tomu lze vyhnout, což si ukážeme na příklady spojování dvou tabulek o stejných sloupcích:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 jedna\n", + "1 dvě\n", + "2 tři\n", + "3 jedna\n", + "4 dvě\n", + "5 tři\n", + "6 jedna\n", + "7 dvě\n", + "8 tři\n", + "9 jedna\n", + "10 dvě\n", + "11 tři\n", + "12 jedna\n", + "13 dvě\n", + "14 tři\n", + "dtype: object" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.concat([a, a, a, a, a], ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Vedle sebe\n", + "\n", + "Toto asi použijete zřídka, ale když chceme \"lepit\" doprava (třeba deset `Series`), stačí přidat nám dobře známý argument `axis`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01234
0jednajednajednajednajedna
1dvědvědvědvědvě
2třitřitřitřitři
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4\n", + "0 jedna jedna jedna jedna jedna\n", + "1 dvě dvě dvě dvě dvě\n", + "2 tři tři tři tři tři" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.concat([a, a, a, a, a], axis=\"columns\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Příklad:** Jak co nejrychleji \"nakreslit prázdnou šachovnici\" (obě slova jsou v uvozovkách)?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDEFGH
8
7
6
5
4
3
2
1
\n", + "
" + ], + "text/plain": [ + " A B C D E F G H\n", + "8 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", + "7 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", + "6 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", + "5 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", + "4 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", + "3 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜\n", + "2 ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛\n", + "1 ⬛ ⬜ ⬛ ⬜ ⬛ ⬜ ⬛ ⬜" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sachy = pd.concat(\n", + " [\n", + " pd.concat( \n", + " [pd.DataFrame([[\"⬜\", \"⬛\"], [\"⬛\", \"⬜\"]])] * 4,\n", + " axis=1)\n", + " ] * 4\n", + ")\n", + "sachy.index = list(range(8, 0, -1))\n", + "sachy.columns = list(\"ABCDEFGH\")\n", + "sachy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spojování různorodých tabulek" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "🎦 Pro spojování heterogenních dat (v datové hantýrce \"joinování\") sáhneme po trochu komplexnějších filmových datech..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Máme staženo několik souborů, načteme si je (zatím hrubě, \"raw\") - s přihlédnutím k tomu, že první dva nejsou v pravém slova smyslu \"comma-separated\", ale používají k oddělení hodnot tabulátor (tady pomůže argument `sep`). Také zohledníme, že v nich řetězec `\"\\N\"` představuje chybějící hodnoty (pomůže argument `na_values`):" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "imdb_titles_raw = pd.read_csv(\"title.basics.tsv.gz\", sep=\"\\t\", na_values=\"\\\\N\")\n", + "imdb_ratings_raw = pd.read_csv(\"title.ratings.tsv.gz\", sep=\"\\t\", na_values=\"\\\\N\")\n", + "boxoffice_raw = pd.read_csv(\"boxoffice_march_2019.csv.gz\")\n", + "rotten_tomatoes_raw = pd.read_csv(\"rotten_tomatoes_top_movies_2019-01-15.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Co který soubor obsahuje? \n", + "\n", + "- První dva soubory obsahují volně dostupná (byť \"jen\" pro nekomerční použití) data o filmech z IMDb (Internet Movie Database). My jsme si zvolili obecné informace a uživatelská (číselná) hodnocení. Detailní popis souborů, stejně jako odkazy na další soubory, najdeš na https://www.imdb.com/interfaces/. Z důvodů paměťové náročnosti jsme datovou sadu ořezali o epizody seriálů, protože nás nebudou zajímat a s trochu štěstí přežijeme i na počítačích s menší operační pamětí.\n", + "\n", + "- Soubor `boxoffice_march_2019.csv.gz` obsahuje informace o výdělcích jednotlivých filmů. Pochází z ukázkového datasetu pro soutěž \"TMDB Box Office Prediction\" na serveru Kaggle: https://www.kaggle.com/c/tmdb-box-office-prediction/data\n", + "\n", + "- Soubor `rotten_tomatoes_top_movies_2019-01-15.csv` obsahuje procentuální hodnocení filmů ze serveru Rotten Tomatoes, které se počítá jako podíl pozitivních hodnoceních od filmových kritiku (je to tedy jiný princip než na IMDb). Staženo z: https://data.world/prasert/rotten-tomatoes-top-movies-by-genre\n", + "\n", + "Pojďme se podívat na nedostatky těchto souborů a postupně je skládat dohromady. Zajímalo by nás (a snad i tebe!), jak souvisí hodnocení s komerční úspěšností filmu, jak se liší hodnocení rotten tomatoes od těch na IMDb." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tconsttitleTypeprimaryTitleoriginalTitleisAdultstartYearendYearruntimeMinutesgenres
0tt0000001shortCarmencitaCarmencita01894.0NaN1.0Documentary,Short
1tt0000002shortLe clown et ses chiensLe clown et ses chiens01892.0NaN5.0Animation,Short
2tt0000003shortPauvre PierrotPauvre Pierrot01892.0NaN4.0Animation,Comedy,Romance
3tt0000004shortUn bon bockUn bon bock01892.0NaNNaNAnimation,Short
4tt0000005shortBlacksmith SceneBlacksmith Scene01893.0NaN1.0Comedy,Short
..............................
1783511tt9916734videoManca: PeleoManca: Peleo02018.0NaNNaNMusic,Short
1783512tt9916754movieChico Albuquerque - RevelaçõesChico Albuquerque - Revelações02013.0NaNNaNDocumentary
1783513tt9916756shortPretty Pretty Black GirlPretty Pretty Black Girl02019.0NaNNaNShort
1783514tt9916764short383802018.0NaNNaNShort
1783515tt9916856shortThe WindThe Wind02015.0NaN27.0Short
\n", + "

1783516 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " tconst titleType primaryTitle \\\n", + "0 tt0000001 short Carmencita \n", + "1 tt0000002 short Le clown et ses chiens \n", + "2 tt0000003 short Pauvre Pierrot \n", + "3 tt0000004 short Un bon bock \n", + "4 tt0000005 short Blacksmith Scene \n", + "... ... ... ... \n", + "1783511 tt9916734 video Manca: Peleo \n", + "1783512 tt9916754 movie Chico Albuquerque - Revelações \n", + "1783513 tt9916756 short Pretty Pretty Black Girl \n", + "1783514 tt9916764 short 38 \n", + "1783515 tt9916856 short The Wind \n", + "\n", + " originalTitle isAdult startYear endYear \\\n", + "0 Carmencita 0 1894.0 NaN \n", + "1 Le clown et ses chiens 0 1892.0 NaN \n", + "2 Pauvre Pierrot 0 1892.0 NaN \n", + "3 Un bon bock 0 1892.0 NaN \n", + "4 Blacksmith Scene 0 1893.0 NaN \n", + "... ... ... ... ... \n", + "1783511 Manca: Peleo 0 2018.0 NaN \n", + "1783512 Chico Albuquerque - Revelações 0 2013.0 NaN \n", + "1783513 Pretty Pretty Black Girl 0 2019.0 NaN \n", + "1783514 38 0 2018.0 NaN \n", + "1783515 The Wind 0 2015.0 NaN \n", + "\n", + " runtimeMinutes genres \n", + "0 1.0 Documentary,Short \n", + "1 5.0 Animation,Short \n", + "2 4.0 Animation,Comedy,Romance \n", + "3 NaN Animation,Short \n", + "4 1.0 Comedy,Short \n", + "... ... ... \n", + "1783511 NaN Music,Short \n", + "1783512 NaN Documentary \n", + "1783513 NaN Short \n", + "1783514 NaN Short \n", + "1783515 27.0 Short \n", + "\n", + "[1783516 rows x 9 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles_raw" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "648.8971881866455" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Kolik tabulka zabírá megabajtů paměti? (1 MB = 2**20 bajtů)\n", + "imdb_titles_raw.memory_usage(deep=True).sum() / 2**20 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jistě budeme chtít převést sloupce na správné typy. Jaké jsou v základu?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tconst object\n", + "titleType object\n", + "primaryTitle object\n", + "originalTitle object\n", + "isAdult int64\n", + "startYear float64\n", + "endYear float64\n", + "runtimeMinutes float64\n", + "genres object\n", + "dtype: object" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles_raw.dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Na co budeme převádět?\n", + "\n", + "- `tconst` je řetězec, který posléze použijeme jako index, protože představuje unikátní identifikátor v databázi IMDb.\n", + "- `titleType`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "titleType\n", + "short 676930\n", + "movie 514654\n", + "video 227582\n", + "tvSeries 162781\n", + "tvMovie 126507\n", + "tvMiniSeries 25574\n", + "videoGame 23310\n", + "tvSpecial 17007\n", + "tvShort 9171\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles_raw[\"titleType\"].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jen devět různých hodnot ve skoro 2 milionech řádků? To je ideální kandidát na převedení na typ `\"category\"`.\n", + "\n", + "- `primaryTitle` a `originalTitle` vypadají jako obyčejné řetězce (pokud možno anglický a pokud možno původní název)\n", + "- `isAdult` určuje, zda se jedná o dílo pro dospělé. Tento sloupec bychom nejspíše měli převést na `bool`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "isAdult\n", + "0 1692292\n", + "1 91224\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles_raw[\"isAdult\"].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- `startYear` a `endYear` obsahují roky, t.j. celá čísla, ovšem kvůli chybějícím hodnotám je pro ně zvolen typ `float64`. V `pandas` raději zvolíme tzv. \"nullable integer\", který se zapisuje s velkým \"I\". Když nevíš, jaký podtyp konkrétně, sáhni po `Int64`.\n", + "- totéž platí pro `runtimeMinutes`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "startYear 2115.0\n", + "endYear 2027.0\n", + "runtimeMinutes 125156.0\n", + "dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles_raw[[\"startYear\", \"endYear\", \"runtimeMinutes\"]].max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mimochodem všimli jste si, že máme díla z budoucnosti (rok 2115)?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "startYear\n", + "2020.0 340\n", + "2021.0 36\n", + "2022.0 14\n", + "2023.0 1\n", + "2024.0 2\n", + "2025.0 1\n", + "2115.0 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGsCAYAAAAhYYazAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqCElEQVR4nO3de1zVdZ7H8fcB5SApqCHghcR7FxXJC8OkTU4kKg83c2bXtUxjtFnLGpKspAuMNSOaydqumpPrJXe2vOya06RihprrxOaKUNl6N8MLoKZyFAuQ89s/fHjqBCocjhz4+no+Hufx6HzP9/c7n9/3ceS8+57v7/ezWZZlCQAAwBB+vi4AAADAmwg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAoN3W42bZtm0aMGKF27drJZrNp7dq1td6HZVl644031L17d9ntdrVv315//OMfvV8sAACokSa+LsCXSktLFR0drd/85jcaNWqUR/tITk7WRx99pDfeeEO9evXSmTNndObMGS9XCgAAasrGjTMvs9lsev/99zVy5EhXW1lZmV566SW99957OnfunHr27KlZs2bpvvvukyTt2bNHvXv31u7du9WjRw/fFA4AANzc1D9LXc9TTz2lnJwcrVixQl988YX+/u//XkOHDtWBAwckSX/961/VuXNnffjhh+rUqZOioqI0ceJEZm4AAPAhws1VFBQUaOnSpVq9erUGDRqkLl26aOrUqRo4cKCWLl0qSTp8+LC++eYbrV69WsuXL9eyZcuUm5urX//61z6uHgCAm9dNvebmWr788ktVVlaqe/fubu1lZWW69dZbJUlOp1NlZWVavny5q9/ixYvVt29f7du3j5+qAADwAcLNVVy4cEH+/v7Kzc2Vv7+/22vNmzeXJLVt21ZNmjRxC0B33HGHpMszP4QbAADqH+HmKmJiYlRZWamTJ09q0KBB1fa55557dOnSJR06dEhdunSRJO3fv1+S1LFjx3qrFQAA/OCmPlvqwoULOnjwoKTLYSYzM1ODBw9W69atddttt2ns2LH629/+pjlz5igmJkanTp1Sdna2evfurcTERDmdTvXv31/NmzfX3Llz5XQ6NXnyZAUHB+ujjz7y8dEBAHBzuqnDzdatWzV48OAq7ePHj9eyZctUUVGhP/zh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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "imdb_titles_raw[\"startYear\"].plot.hist()\n", + "imdb_titles_raw.query(\"startYear > 2019\")[\"startYear\"].value_counts().sort_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Takhle nějak by přetypování mohlo vypadat:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tconst object\n", + "titleType category\n", + "primaryTitle object\n", + "originalTitle object\n", + "isAdult bool\n", + "startYear Int64\n", + "endYear Int64\n", + "runtimeMinutes Int64\n", + "genres object\n", + "dtype: object" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " imdb_titles_raw\n", + " .assign(\n", + " titleType=imdb_titles_raw[\"titleType\"].astype(\"category\"),\n", + " startYear=imdb_titles_raw[\"startYear\"].astype(\"Int64\"),\n", + " endYear=imdb_titles_raw[\"endYear\"].astype(\"Int64\"),\n", + " isAdult=imdb_titles_raw[\"isAdult\"].astype(bool),\n", + " runtimeMinutes=imdb_titles_raw[\"runtimeMinutes\"].astype(\"Int64\")\n", + " )\n", + ").dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Takhle už by to mohlo být. Jen si ještě:\n", + "\n", + "- pro přehlednost přejmenujeme některé sloupce (pomocí metody [`rename`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html))\n", + "- použijeme `tconst` jako index\n", + "\n", + "A tabulka `imdb_titles` bude připravená k použití!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
title_typetitleoriginal_titleis_adultstart_yearend_yearlengthgenres
tconst
tt0000001shortCarmencitaCarmencitaFalse1894<NA>1Documentary,Short
tt0000002shortLe clown et ses chiensLe clown et ses chiensFalse1892<NA>5Animation,Short
tt0000003shortPauvre PierrotPauvre PierrotFalse1892<NA>4Animation,Comedy,Romance
tt0000004shortUn bon bockUn bon bockFalse1892<NA><NA>Animation,Short
tt0000005shortBlacksmith SceneBlacksmith SceneFalse1893<NA>1Comedy,Short
...........................
tt9916734videoManca: PeleoManca: PeleoFalse2018<NA><NA>Music,Short
tt9916754movieChico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA><NA>Documentary
tt9916756shortPretty Pretty Black GirlPretty Pretty Black GirlFalse2019<NA><NA>Short
tt9916764short3838False2018<NA><NA>Short
tt9916856shortThe WindThe WindFalse2015<NA>27Short
\n", + "

1783516 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title_type title \\\n", + "tconst \n", + "tt0000001 short Carmencita \n", + "tt0000002 short Le clown et ses chiens \n", + "tt0000003 short Pauvre Pierrot \n", + "tt0000004 short Un bon bock \n", + "tt0000005 short Blacksmith Scene \n", + "... ... ... \n", + "tt9916734 video Manca: Peleo \n", + "tt9916754 movie Chico Albuquerque - Revelações \n", + "tt9916756 short Pretty Pretty Black Girl \n", + "tt9916764 short 38 \n", + "tt9916856 short The Wind \n", + "\n", + " original_title is_adult start_year end_year \\\n", + "tconst \n", + "tt0000001 Carmencita False 1894 \n", + "tt0000002 Le clown et ses chiens False 1892 \n", + "tt0000003 Pauvre Pierrot False 1892 \n", + "tt0000004 Un bon bock False 1892 \n", + "tt0000005 Blacksmith Scene False 1893 \n", + "... ... ... ... ... \n", + "tt9916734 Manca: Peleo False 2018 \n", + "tt9916754 Chico Albuquerque - Revelações False 2013 \n", + "tt9916756 Pretty Pretty Black Girl False 2019 \n", + "tt9916764 38 False 2018 \n", + "tt9916856 The Wind False 2015 \n", + "\n", + " length genres \n", + "tconst \n", + "tt0000001 1 Documentary,Short \n", + "tt0000002 5 Animation,Short \n", + "tt0000003 4 Animation,Comedy,Romance \n", + "tt0000004 Animation,Short \n", + "tt0000005 1 Comedy,Short \n", + "... ... ... \n", + "tt9916734 Music,Short \n", + "tt9916754 Documentary \n", + "tt9916756 Short \n", + "tt9916764 Short \n", + "tt9916856 27 Short \n", + "\n", + "[1783516 rows x 8 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_titles = (\n", + " imdb_titles_raw\n", + " .assign(\n", + " titleType=imdb_titles_raw[\"titleType\"].astype(\"category\"),\n", + " startYear=imdb_titles_raw[\"startYear\"].astype(\"Int64\"),\n", + " endYear=imdb_titles_raw[\"endYear\"].astype(\"Int64\"),\n", + " isAdult=imdb_titles_raw[\"isAdult\"].astype(bool),\n", + " runtimeMinutes=imdb_titles_raw[\"runtimeMinutes\"].astype(\"Int64\")\n", + " )\n", + " .rename({\n", + " \"primaryTitle\": \"title\",\n", + " \"originalTitle\": \"original_title\",\n", + " \"titleType\": \"title_type\",\n", + " \"runtimeMinutes\": \"length\",\n", + " \"startYear\": \"start_year\",\n", + " \"endYear\": \"end_year\",\n", + " \"isAdult\": \"is_adult\",\n", + " }, axis=\"columns\")\n", + " .set_index(\"tconst\")\n", + ")\n", + "imdb_titles" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "537.2908029556274" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Kolik tabulka zabírá megabajtů paměti?\n", + "imdb_titles.memory_usage(deep=True).sum() / 2**20 # O chlup méně, zase tolik jsme si ale nepomohli." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Připravíme si ještě speciální tabulku jenom pro filmy, protože další datové sady se zabývají jenom jimi.\n", + "\n", + "U této tabulky navíc vyhodíme zbytečné sloupce `title_type`, `end_year` a přejmenujeme `start_year` prostě na `year`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenres
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama
tt0000502BohemiosBohemiosFalse1905100NaN
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama
.....................
tt9916622Rodolpho Teóphilo - O Legado de um PioneiroRodolpho Teóphilo - O Legado de um PioneiroFalse2015<NA>Documentary
tt9916680De la ilusión al desconcierto: cine colombiano...De la ilusión al desconcierto: cine colombiano...False2007100Documentary
tt9916706Dankyavar DankaDankyavar DankaFalse2013<NA>Comedy
tt99167306 Gunn6 GunnFalse2017116NaN
tt9916754Chico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA>Documentary
\n", + "

514654 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " title \\\n", + "tconst \n", + "tt0000009 Miss Jerry \n", + "tt0000147 The Corbett-Fitzsimmons Fight \n", + "tt0000335 Soldiers of the Cross \n", + "tt0000502 Bohemios \n", + "tt0000574 The Story of the Kelly Gang \n", + "... ... \n", + "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro \n", + "tt9916680 De la ilusión al desconcierto: cine colombiano... \n", + "tt9916706 Dankyavar Danka \n", + "tt9916730 6 Gunn \n", + "tt9916754 Chico Albuquerque - Revelações \n", + "\n", + " original_title is_adult year \\\n", + "tconst \n", + "tt0000009 Miss Jerry False 1894 \n", + "tt0000147 The Corbett-Fitzsimmons Fight False 1897 \n", + "tt0000335 Soldiers of the Cross False 1900 \n", + "tt0000502 Bohemios False 1905 \n", + "tt0000574 The Story of the Kelly Gang False 1906 \n", + "... ... ... ... \n", + "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro False 2015 \n", + "tt9916680 De la ilusión al desconcierto: cine colombiano... False 2007 \n", + "tt9916706 Dankyavar Danka False 2013 \n", + "tt9916730 6 Gunn False 2017 \n", + "tt9916754 Chico Albuquerque - Revelações False 2013 \n", + "\n", + " length genres \n", + "tconst \n", + "tt0000009 45 Romance \n", + "tt0000147 20 Documentary,News,Sport \n", + "tt0000335 Biography,Drama \n", + "tt0000502 100 NaN \n", + "tt0000574 70 Biography,Crime,Drama \n", + "... ... ... \n", + "tt9916622 Documentary \n", + "tt9916680 100 Documentary \n", + "tt9916706 Comedy \n", + "tt9916730 116 NaN \n", + "tt9916754 Documentary \n", + "\n", + "[514654 rows x 6 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "movies = (\n", + " imdb_titles\n", + " .query(\"title_type == 'movie'\")\n", + " .drop([\"title_type\", \"end_year\"], axis=\"columns\")\n", + " .rename({\"start_year\": \"year\"}, axis=\"columns\")\n", + ")\n", + "movies" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(514654, 6)\n", + "title object\n", + "original_title object\n", + "is_adult bool\n", + "year Int64\n", + "length Int64\n", + "genres object\n", + "dtype: object\n" + ] + } + ], + "source": [ + "print(movies.shape)\n", + "print(movies.dtypes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nyní se podíváme na zoubek hodnocením z IMDb, na tabulky `imdb_ratings_raw`:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tconstaverageRatingnumVotes
0tt00000015.81486
1tt00000026.4179
2tt00000036.61117
3tt00000046.4109
4tt00000056.21820
............
923691tt99163809.758
923692tt99164207.05
923693tt99164609.212
923694tt99167205.211
923695tt99167667.25
\n", + "

923696 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " tconst averageRating numVotes\n", + "0 tt0000001 5.8 1486\n", + "1 tt0000002 6.4 179\n", + "2 tt0000003 6.6 1117\n", + "3 tt0000004 6.4 109\n", + "4 tt0000005 6.2 1820\n", + "... ... ... ...\n", + "923691 tt9916380 9.7 58\n", + "923692 tt9916420 7.0 5\n", + "923693 tt9916460 9.2 12\n", + "923694 tt9916720 5.2 11\n", + "923695 tt9916766 7.2 5\n", + "\n", + "[923696 rows x 3 columns]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_ratings_raw" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tconst object\n", + "averageRating float64\n", + "numVotes int64\n", + "dtype: object" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imdb_ratings_raw.dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To by vlastně skoro mohlo být!\n", + "\n", + "Tak jen nastavíme index (opět `tconst`) a přejmenujeme sloupce:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
imdb_ratingimdb_votes
tconst
tt00000015.81486
tt00000026.4179
tt00000036.61117
tt00000046.4109
tt00000056.21820
.........
tt99163809.758
tt99164207.05
tt99164609.212
tt99167205.211
tt99167667.25
\n", + "

923696 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " imdb_rating imdb_votes\n", + "tconst \n", + "tt0000001 5.8 1486\n", + "tt0000002 6.4 179\n", + "tt0000003 6.6 1117\n", + "tt0000004 6.4 109\n", + "tt0000005 6.2 1820\n", + "... ... ...\n", + "tt9916380 9.7 58\n", + "tt9916420 7.0 5\n", + "tt9916460 9.2 12\n", + "tt9916720 5.2 11\n", + "tt9916766 7.2 5\n", + "\n", + "[923696 rows x 2 columns]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ratings = (imdb_ratings_raw\n", + " .rename({\n", + " \"averageRating\": \"imdb_rating\",\n", + " \"numVotes\": \"imdb_votes\"\n", + " }, axis=\"columns\")\n", + " .set_index(\"tconst\")\n", + ")\n", + "ratings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### První join\n", + "\n", + "Máme připravené dvě krásné tabulky, které sdílejí stejný index, a můžeme vesele spojovat. Protože pomocí `join`, `merge` a `concat` lze volbou vhodných parametrů dosáhnout identického výsledku (což je jedním z nešvarů knihovny `pandas`), ukážeme si všechny tři alternativy podle subjektivního pořadí vhodnosti." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577.0
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289.0
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339.0
tt0000502BohemiosBohemiosFalse1905100NaNNaNNaN
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505.0
...........................
tt9916622Rodolpho Teóphilo - O Legado de um PioneiroRodolpho Teóphilo - O Legado de um PioneiroFalse2015<NA>DocumentaryNaNNaN
tt9916680De la ilusión al desconcierto: cine colombiano...De la ilusión al desconcierto: cine colombiano...False2007100DocumentaryNaNNaN
tt9916706Dankyavar DankaDankyavar DankaFalse2013<NA>ComedyNaNNaN
tt99167306 Gunn6 GunnFalse2017116NaNNaNNaN
tt9916754Chico Albuquerque - RevelaçõesChico Albuquerque - RevelaçõesFalse2013<NA>DocumentaryNaNNaN
\n", + "

514654 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title \\\n", + "tconst \n", + "tt0000009 Miss Jerry \n", + "tt0000147 The Corbett-Fitzsimmons Fight \n", + "tt0000335 Soldiers of the Cross \n", + "tt0000502 Bohemios \n", + "tt0000574 The Story of the Kelly Gang \n", + "... ... \n", + "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro \n", + "tt9916680 De la ilusión al desconcierto: cine colombiano... \n", + "tt9916706 Dankyavar Danka \n", + "tt9916730 6 Gunn \n", + "tt9916754 Chico Albuquerque - Revelações \n", + "\n", + " original_title is_adult year \\\n", + "tconst \n", + "tt0000009 Miss Jerry False 1894 \n", + "tt0000147 The Corbett-Fitzsimmons Fight False 1897 \n", + "tt0000335 Soldiers of the Cross False 1900 \n", + "tt0000502 Bohemios False 1905 \n", + "tt0000574 The Story of the Kelly Gang False 1906 \n", + "... ... ... ... \n", + "tt9916622 Rodolpho Teóphilo - O Legado de um Pioneiro False 2015 \n", + "tt9916680 De la ilusión al desconcierto: cine colombiano... False 2007 \n", + "tt9916706 Dankyavar Danka False 2013 \n", + "tt9916730 6 Gunn False 2017 \n", + "tt9916754 Chico Albuquerque - Revelações False 2013 \n", + "\n", + " length genres imdb_rating imdb_votes \n", + "tconst \n", + "tt0000009 45 Romance 5.5 77.0 \n", + "tt0000147 20 Documentary,News,Sport 5.2 289.0 \n", + "tt0000335 Biography,Drama 6.3 39.0 \n", + "tt0000502 100 NaN NaN NaN \n", + "tt0000574 70 Biography,Crime,Drama 6.2 505.0 \n", + "... ... ... ... ... \n", + "tt9916622 Documentary NaN NaN \n", + "tt9916680 100 Documentary NaN NaN \n", + "tt9916706 Comedy NaN NaN \n", + "tt9916730 116 NaN NaN NaN \n", + "tt9916754 Documentary NaN NaN \n", + "\n", + "[514654 rows x 8 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "movies.join(ratings)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "K tabulce se nenápadně přidaly dva sloupce z tabulky `ratings`, a to takovým způsobem, že se porovnaly hodnoty indexu (tedy `tconst`) a spárovaly se ty části řádku, kde se tento index shoduje.\n", + "\n", + "💡 Uvědom si (ačkoliv z volání funkcí v `pandas` to není úplně zřejmé), že se tady děje něco fundamentálně odlišného od \"nalepení doprava\" - tabulky tu nejsou chápány jako čtverečky, které jde skládat jako lego, nýbrž jako zdroj údajů o jednotlivých objektech, které je potřeba spojit sémanticky.\n", + "\n", + "Jak ale vidíš, tabulka obsahuje spoustu řádků, kde ve sloupcích s hodnocením chybí hodnoty (respektive nachází se `NaN`). To vychází ze způsobu, jakým metoda `join` ve výchozím nastavení \"joinuje\" - použije všechny řádky z levé tabulky bez ohledu na to, jestli jim odpovídá nějaký protějšek v tabulce pravé. Naštěstí lze pomocí argumentu `how` specifikovat i jiné způsoby spojování:\n", + "\n", + "- `left` (výchozí pro metodu `join`) - vezmou se všechny prvky z levé tabulky a jim odpovídající prvky z pravé tabulky (kde nejsou, doplní se `NaN`)\n", + "- `right` - vezmou se všechny prvky z pravé tabulky a jim odpovídající prvky z levé tabulky (kde nejsou, doplní se `NaN`)\n", + "- `inner` (výchozí pro funkci `merge`) - vezmou se jen ty prvky, které jsou v levé i pravé tabulce.\n", + "- `outer` (výchozí pro funkci `concat`) - vezmou se všechny prvky, z levé i pravé tabulky, kde něco chybí, doplní se `NaN`.\n", + "\n", + "V podobě Vennově diagramu, kde kruhy představují množiny řádků v obou zdrojových tabulkách a modrou barvou jsou zvýrazněny řádky v tabulce cílové:\n", + "\n", + "![Typy joinů](static/joins.svg)\n", + "\n", + "*Obrázek adaptován z https://upload.wikimedia.org/wikipedia/commons/9/9d/SQL_Joins.svg (autor: Arbeck)*\n", + "\n", + "💡 Až budeme probírat databáze, tyto čtyři typu joinů se nám znovu vynoří.\n", + "\n", + "Následující výpis ukáže, kolik řádků bychom dostali při použití různých hodnot `how`:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "movies.join(ratings, how=\"left\"): 514654 řádků.\n", + "movies.join(ratings, how=\"right\"): 923696 řádků.\n", + "movies.join(ratings, how=\"inner\"): 232496 řádků.\n", + "movies.join(ratings, how=\"outer\"): 1205854 řádků.\n" + ] + } + ], + "source": [ + "for how in [\"left\", \"right\", \"inner\", \"outer\"]:\n", + " print(f\"movies.join(ratings, how=\\\"{how}\\\"):\", movies.join(ratings, how=how).shape[0], \"řádků.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A teď tedy ty tři alternativy:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", + "

232496 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title \\\n", + "tconst \n", + "tt0000009 Miss Jerry Miss Jerry \n", + "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", + "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", + "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", + "tt0000615 Robbery Under Arms Robbery Under Arms \n", + "... ... ... \n", + "tt9910930 Jeg ser deg Jeg ser deg \n", + "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", + "tt9913056 Swarm Season Swarm Season \n", + "tt9913084 Diabolik sono io Diabolik sono io \n", + "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", + "\n", + " is_adult year length genres imdb_rating \\\n", + "tconst \n", + "tt0000009 False 1894 45 Romance 5.5 \n", + "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", + "tt0000335 False 1900 Biography,Drama 6.3 \n", + "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", + "tt0000615 False 1907 Drama 4.8 \n", + "... ... ... ... ... ... \n", + "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", + "tt9911774 False 2019 130 Drama 8.5 \n", + "tt9913056 False 2019 86 Documentary 6.2 \n", + "tt9913084 False 2019 75 Documentary 6.2 \n", + "tt9914286 False 2019 98 Drama,Family 9.8 \n", + "\n", + " imdb_votes \n", + "tconst \n", + "tt0000009 77 \n", + "tt0000147 289 \n", + "tt0000335 39 \n", + "tt0000574 505 \n", + "tt0000615 14 \n", + "... ... \n", + "tt9910930 5 \n", + "tt9911774 363 \n", + "tt9913056 5 \n", + "tt9913084 6 \n", + "tt9914286 72 \n", + "\n", + "[232496 rows x 8 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Alternativa 1 (preferovaná)\n", + "movies_with_rating = movies.join(ratings, how=\"inner\")\n", + "movies_with_rating" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", + "

232496 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title \\\n", + "tconst \n", + "tt0000009 Miss Jerry Miss Jerry \n", + "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", + "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", + "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", + "tt0000615 Robbery Under Arms Robbery Under Arms \n", + "... ... ... \n", + "tt9910930 Jeg ser deg Jeg ser deg \n", + "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", + "tt9913056 Swarm Season Swarm Season \n", + "tt9913084 Diabolik sono io Diabolik sono io \n", + "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", + "\n", + " is_adult year length genres imdb_rating \\\n", + "tconst \n", + "tt0000009 False 1894 45 Romance 5.5 \n", + "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", + "tt0000335 False 1900 Biography,Drama 6.3 \n", + "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", + "tt0000615 False 1907 Drama 4.8 \n", + "... ... ... ... ... ... \n", + "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", + "tt9911774 False 2019 130 Drama 8.5 \n", + "tt9913056 False 2019 86 Documentary 6.2 \n", + "tt9913084 False 2019 75 Documentary 6.2 \n", + "tt9914286 False 2019 98 Drama,Family 9.8 \n", + "\n", + " imdb_votes \n", + "tconst \n", + "tt0000009 77 \n", + "tt0000147 289 \n", + "tt0000335 39 \n", + "tt0000574 505 \n", + "tt0000615 14 \n", + "... ... \n", + "tt9910930 5 \n", + "tt9911774 363 \n", + "tt9913056 5 \n", + "tt9913084 6 \n", + "tt9914286 72 \n", + "\n", + "[232496 rows x 8 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Alternativa 2 (taky dobrá)\n", + "pd.merge(movies, ratings, left_index=True, right_index=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
tconst
tt0000009Miss JerryMiss JerryFalse189445Romance5.577
tt0000147The Corbett-Fitzsimmons FightThe Corbett-Fitzsimmons FightFalse189720Documentary,News,Sport5.2289
tt0000335Soldiers of the CrossSoldiers of the CrossFalse1900<NA>Biography,Drama6.339
tt0000574The Story of the Kelly GangThe Story of the Kelly GangFalse190670Biography,Crime,Drama6.2505
tt0000615Robbery Under ArmsRobbery Under ArmsFalse1907<NA>Drama4.814
...........................
tt9910930Jeg ser degJeg ser degFalse201975Crime,Documentary4.65
tt9911774Padmavyuhathile AbhimanyuPadmavyuhathile AbhimanyuFalse2019130Drama8.5363
tt9913056Swarm SeasonSwarm SeasonFalse201986Documentary6.25
tt9913084Diabolik sono ioDiabolik sono ioFalse201975Documentary6.26
tt9914286Sokagin ÇocuklariSokagin ÇocuklariFalse201998Drama,Family9.872
\n", + "

232496 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title \\\n", + "tconst \n", + "tt0000009 Miss Jerry Miss Jerry \n", + "tt0000147 The Corbett-Fitzsimmons Fight The Corbett-Fitzsimmons Fight \n", + "tt0000335 Soldiers of the Cross Soldiers of the Cross \n", + "tt0000574 The Story of the Kelly Gang The Story of the Kelly Gang \n", + "tt0000615 Robbery Under Arms Robbery Under Arms \n", + "... ... ... \n", + "tt9910930 Jeg ser deg Jeg ser deg \n", + "tt9911774 Padmavyuhathile Abhimanyu Padmavyuhathile Abhimanyu \n", + "tt9913056 Swarm Season Swarm Season \n", + "tt9913084 Diabolik sono io Diabolik sono io \n", + "tt9914286 Sokagin Çocuklari Sokagin Çocuklari \n", + "\n", + " is_adult year length genres imdb_rating \\\n", + "tconst \n", + "tt0000009 False 1894 45 Romance 5.5 \n", + "tt0000147 False 1897 20 Documentary,News,Sport 5.2 \n", + "tt0000335 False 1900 Biography,Drama 6.3 \n", + "tt0000574 False 1906 70 Biography,Crime,Drama 6.2 \n", + "tt0000615 False 1907 Drama 4.8 \n", + "... ... ... ... ... ... \n", + "tt9910930 False 2019 75 Crime,Documentary 4.6 \n", + "tt9911774 False 2019 130 Drama 8.5 \n", + "tt9913056 False 2019 86 Documentary 6.2 \n", + "tt9913084 False 2019 75 Documentary 6.2 \n", + "tt9914286 False 2019 98 Drama,Family 9.8 \n", + "\n", + " imdb_votes \n", + "tconst \n", + "tt0000009 77 \n", + "tt0000147 289 \n", + "tt0000335 39 \n", + "tt0000574 505 \n", + "tt0000615 14 \n", + "... ... \n", + "tt9910930 5 \n", + "tt9911774 363 \n", + "tt9913056 5 \n", + "tt9913084 6 \n", + "tt9914286 72 \n", + "\n", + "[232496 rows x 8 columns]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Alternativa 3 (méně \"sémantická\")\n", + "pd.concat([movies, ratings], axis=\"columns\", join=\"inner\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zkusme si zreprodukovat pořadí 250 nejlepších filmů z IMDb (viz https://www.imdb.com/chart/top/?ref_=nv_mv_250):" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
0The Chaos ClassHababam SinifiFalse197587Comedy,Drama9.433394
1The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.32071759
2The Mountain IIDag IIFalse2016135Action,Drama,War9.3100095
3CM101MMXI FundamentalsCM101MMXI FundamentalsFalse2013139Comedy,Documentary9.241327
4The GodfatherThe GodfatherFalse1972175Crime,Drama9.21421495
...........................
24512 Years a Slave12 Years a SlaveFalse2013134Biography,Drama,History8.1571204
246The Sixth SenseThe Sixth SenseFalse1999107Drama,Mystery,Thriller8.1836928
247The Passion of Joan of ArcLa passion de Jeanne d'ArcFalse1928110Biography,Drama,History8.140107
248Barfi!Barfi!False2012151Comedy,Drama,Romance8.168274
249PlatoonPlatoonFalse1986120Drama,War8.1348628
\n", + "

250 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year \\\n", + "0 The Chaos Class Hababam Sinifi False 1975 \n", + "1 The Shawshank Redemption The Shawshank Redemption False 1994 \n", + "2 The Mountain II Dag II False 2016 \n", + "3 CM101MMXI Fundamentals CM101MMXI Fundamentals False 2013 \n", + "4 The Godfather The Godfather False 1972 \n", + ".. ... ... ... ... \n", + "245 12 Years a Slave 12 Years a Slave False 2013 \n", + "246 The Sixth Sense The Sixth Sense False 1999 \n", + "247 The Passion of Joan of Arc La passion de Jeanne d'Arc False 1928 \n", + "248 Barfi! Barfi! False 2012 \n", + "249 Platoon Platoon False 1986 \n", + "\n", + " length genres imdb_rating imdb_votes \n", + "0 87 Comedy,Drama 9.4 33394 \n", + "1 142 Drama 9.3 2071759 \n", + "2 135 Action,Drama,War 9.3 100095 \n", + "3 139 Comedy,Documentary 9.2 41327 \n", + "4 175 Crime,Drama 9.2 1421495 \n", + ".. ... ... ... ... \n", + "245 134 Biography,Drama,History 8.1 571204 \n", + "246 107 Drama,Mystery,Thriller 8.1 836928 \n", + "247 110 Biography,Drama,History 8.1 40107 \n", + "248 151 Comedy,Drama,Romance 8.1 68274 \n", + "249 120 Drama,War 8.1 348628 \n", + "\n", + "[250 rows x 8 columns]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Ty nejlepší (do června 2019)\n", + "(movies_with_rating\n", + " .query(\"imdb_votes > 25000\") # Berou se jen filmy s více než 25000 hlasy\n", + " .sort_values(\"imdb_rating\", ascending=False) # IMDb tu použivá i váhu jednotlivých hlasů (kterou neznáme)\n", + " .reset_index(drop=True)\n", + ").iloc[:250]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Do výčtu se nám dostaly filmy, které hranici hlasů nepřekračují o moc. Máme důvodné podezření, že toto kritérium dávno změnili. S požadovanými 250 000 hlasy se už blížíme:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votes
0The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.32071759
1The GodfatherThe GodfatherFalse1972175Crime,Drama9.21421495
2The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.02037678
3The Godfather: Part IIThe Godfather: Part IIFalse1974202Crime,Drama9.0986451
4Pulp FictionPulp FictionFalse1994154Crime,Drama8.91620135
...........................
245Ocean's ElevenOcean's ElevenFalse2001116Crime,Thriller7.8470530
246Lost in TranslationLost in TranslationFalse2003102Drama7.8371577
247Donnie BrascoDonnie BrascoFalse1997127Biography,Crime,Drama7.8253811
248Captain PhillipsCaptain PhillipsFalse2013134Biography,Drama,Thriller7.8384378
249How to Train Your Dragon 2How to Train Your Dragon 2False2014102Action,Adventure,Animation7.8273406
\n", + "

250 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year \\\n", + "0 The Shawshank Redemption The Shawshank Redemption False 1994 \n", + "1 The Godfather The Godfather False 1972 \n", + "2 The Dark Knight The Dark Knight False 2008 \n", + "3 The Godfather: Part II The Godfather: Part II False 1974 \n", + "4 Pulp Fiction Pulp Fiction False 1994 \n", + ".. ... ... ... ... \n", + "245 Ocean's Eleven Ocean's Eleven False 2001 \n", + "246 Lost in Translation Lost in Translation False 2003 \n", + "247 Donnie Brasco Donnie Brasco False 1997 \n", + "248 Captain Phillips Captain Phillips False 2013 \n", + "249 How to Train Your Dragon 2 How to Train Your Dragon 2 False 2014 \n", + "\n", + " length genres imdb_rating imdb_votes \n", + "0 142 Drama 9.3 2071759 \n", + "1 175 Crime,Drama 9.2 1421495 \n", + "2 152 Action,Crime,Drama 9.0 2037678 \n", + "3 202 Crime,Drama 9.0 986451 \n", + "4 154 Crime,Drama 8.9 1620135 \n", + ".. ... ... ... ... \n", + "245 116 Crime,Thriller 7.8 470530 \n", + "246 102 Drama 7.8 371577 \n", + "247 127 Biography,Crime,Drama 7.8 253811 \n", + "248 134 Biography,Drama,Thriller 7.8 384378 \n", + "249 102 Action,Adventure,Animation 7.8 273406 \n", + "\n", + "[250 rows x 8 columns]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(movies_with_rating\n", + " .query(\"imdb_votes > 250000\")\n", + " .sort_values(\"imdb_rating\", ascending=False)\n", + " .reset_index(drop=True)\n", + ").iloc[:250]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Druhý join\n", + "\n", + "Co tabulka s výdělky (`boxoffice_raw`)?" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ranktitlestudiolifetime_grossyear
01Star Wars: The Force AwakensBV9366622252015
12AvatarFox7605076252009
23Black PantherBV7000595662018
34Avengers: Infinity WarBV6788154822018
45TitanicPar.6593639441997
..................
1626216263Dog Eat DogIFC802009
1626316264Paranoid GirlsNaN782015
1626416265Confession of a Child of the CenturyCohen742015
1626516266Storage 24Magn.722013
1626616267Zyzzyx RoadReg.302006
\n", + "

16267 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " rank title studio lifetime_gross \\\n", + "0 1 Star Wars: The Force Awakens BV 936662225 \n", + "1 2 Avatar Fox 760507625 \n", + "2 3 Black Panther BV 700059566 \n", + "3 4 Avengers: Infinity War BV 678815482 \n", + "4 5 Titanic Par. 659363944 \n", + "... ... ... ... ... \n", + "16262 16263 Dog Eat Dog IFC 80 \n", + "16263 16264 Paranoid Girls NaN 78 \n", + "16264 16265 Confession of a Child of the Century Cohen 74 \n", + "16265 16266 Storage 24 Magn. 72 \n", + "16266 16267 Zyzzyx Road Reg. 30 \n", + "\n", + " year \n", + "0 2015 \n", + "1 2009 \n", + "2 2018 \n", + "3 2018 \n", + "4 1997 \n", + "... ... \n", + "16262 2009 \n", + "16263 2015 \n", + "16264 2015 \n", + "16265 2013 \n", + "16266 2006 \n", + "\n", + "[16267 rows x 5 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "boxoffice_raw" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rank int64\n", + "title object\n", + "studio object\n", + "lifetime_gross int64\n", + "year int64\n", + "dtype: object" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "boxoffice_raw.dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "S tím bychom v podstatně mohli být spokojení, jen přejmenujeme `rank`, abychom při joinování věděli, odkud daný sloupec pochází." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "boxoffice = (boxoffice_raw\n", + " .rename({\n", + " \"rank\": \"boxoffice_rank\"\n", + " }, axis=\"columns\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A zkusíme joinovat. V tomto případě se nemůžeme opřít o index (`boxoffice` pochází z jiného zdroje a o nějakém ID filmu z IMDb nemá ani tuchy), ale explicitně specifikujeme, který sloupec (či sloupce) se musí shodovat - na to slouží argument `on`:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyear (imdb)lengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grossyear (boxoffice)
1643PinocchioPinocchioFalse194088Animation,Comedy,Family7.5114689885Dis.842541671940
1644PinocchioPinocchioFalse194088Animation,Comedy,Family7.51146896108Mira.36843052002
1645PinocchioTurlis AbenteuerFalse196775Adventure,Family,Fantasy7.219885Dis.842541671940
1646PinocchioTurlis AbenteuerFalse196775Adventure,Family,Fantasy7.2196108Mira.36843052002
1647PinocchioPinocchioFalse197179Comedy,Fantasy3.5123885Dis.842541671940
1648PinocchioPinocchioFalse197179Comedy,Fantasy3.51236108Mira.36843052002
1649PinocchioPinocchioFalse191150Fantasy5.969885Dis.842541671940
1650PinocchioPinocchioFalse191150Fantasy5.9696108Mira.36843052002
1651PinocchioPinocchioFalse2002108Comedy,Family,Fantasy4.37192885Dis.842541671940
1652PinocchioPinocchioFalse2002108Comedy,Family,Fantasy4.371926108Mira.36843052002
1653PinocchioUn burattino di nome PinocchioFalse197196Animation,Family,Fantasy7.0117885Dis.842541671940
1654PinocchioUn burattino di nome PinocchioFalse197196Animation,Family,Fantasy7.01176108Mira.36843052002
1655PinocchioPinocchioFalse201275Animation,Family,Fantasy6.3218885Dis.842541671940
1656PinocchioPinocchioFalse201275Animation,Family,Fantasy6.32186108Mira.36843052002
1657PinocchioPinocchioFalse2015<NA>Family,Fantasy4.943885Dis.842541671940
1658PinocchioPinocchioFalse2015<NA>Family,Fantasy4.9436108Mira.36843052002
1659PinocchioPinocchioFalse201575Documentary6.88885Dis.842541671940
1660PinocchioPinocchioFalse201575Documentary6.886108Mira.36843052002
\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year (imdb) \\\n", + "1643 Pinocchio Pinocchio False 1940 \n", + "1644 Pinocchio Pinocchio False 1940 \n", + "1645 Pinocchio Turlis Abenteuer False 1967 \n", + "1646 Pinocchio Turlis Abenteuer False 1967 \n", + "1647 Pinocchio Pinocchio False 1971 \n", + "1648 Pinocchio Pinocchio False 1971 \n", + "1649 Pinocchio Pinocchio False 1911 \n", + "1650 Pinocchio Pinocchio False 1911 \n", + "1651 Pinocchio Pinocchio False 2002 \n", + "1652 Pinocchio Pinocchio False 2002 \n", + "1653 Pinocchio Un burattino di nome Pinocchio False 1971 \n", + "1654 Pinocchio Un burattino di nome Pinocchio False 1971 \n", + "1655 Pinocchio Pinocchio False 2012 \n", + "1656 Pinocchio Pinocchio False 2012 \n", + "1657 Pinocchio Pinocchio False 2015 \n", + "1658 Pinocchio Pinocchio False 2015 \n", + "1659 Pinocchio Pinocchio False 2015 \n", + "1660 Pinocchio Pinocchio False 2015 \n", + "\n", + " length genres imdb_rating imdb_votes \\\n", + "1643 88 Animation,Comedy,Family 7.5 114689 \n", + "1644 88 Animation,Comedy,Family 7.5 114689 \n", + "1645 75 Adventure,Family,Fantasy 7.2 19 \n", + "1646 75 Adventure,Family,Fantasy 7.2 19 \n", + "1647 79 Comedy,Fantasy 3.5 123 \n", + "1648 79 Comedy,Fantasy 3.5 123 \n", + "1649 50 Fantasy 5.9 69 \n", + "1650 50 Fantasy 5.9 69 \n", + "1651 108 Comedy,Family,Fantasy 4.3 7192 \n", + "1652 108 Comedy,Family,Fantasy 4.3 7192 \n", + "1653 96 Animation,Family,Fantasy 7.0 117 \n", + "1654 96 Animation,Family,Fantasy 7.0 117 \n", + "1655 75 Animation,Family,Fantasy 6.3 218 \n", + "1656 75 Animation,Family,Fantasy 6.3 218 \n", + "1657 Family,Fantasy 4.9 43 \n", + "1658 Family,Fantasy 4.9 43 \n", + "1659 75 Documentary 6.8 8 \n", + "1660 75 Documentary 6.8 8 \n", + "\n", + " boxoffice_rank studio lifetime_gross year (boxoffice) \n", + "1643 885 Dis. 84254167 1940 \n", + "1644 6108 Mira. 3684305 2002 \n", + "1645 885 Dis. 84254167 1940 \n", + "1646 6108 Mira. 3684305 2002 \n", + "1647 885 Dis. 84254167 1940 \n", + "1648 6108 Mira. 3684305 2002 \n", + "1649 885 Dis. 84254167 1940 \n", + "1650 6108 Mira. 3684305 2002 \n", + "1651 885 Dis. 84254167 1940 \n", + "1652 6108 Mira. 3684305 2002 \n", + "1653 885 Dis. 84254167 1940 \n", + "1654 6108 Mira. 3684305 2002 \n", + "1655 885 Dis. 84254167 1940 \n", + "1656 6108 Mira. 3684305 2002 \n", + "1657 885 Dis. 84254167 1940 \n", + "1658 6108 Mira. 3684305 2002 \n", + "1659 885 Dis. 84254167 1940 \n", + "1660 6108 Mira. 3684305 2002 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.merge(\n", + " movies_with_rating,\n", + " boxoffice,\n", + " suffixes=[\" (imdb)\", \" (boxoffice)\"],\n", + " on=\"title\"\n", + ").query(\"title == 'Pinocchio'\") # \"Jeden\" ukázkový film" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jejda, to jsme asi nechtěli. Existuje spousta různých Pinocchiů a ke každému z nich se připojili vždy oba snímky tohoto jména z `boxoffice`. Z toho vyplývá poučení, že při joinování je dobré se zamyslet nad jedinečností hodnot ve sloupci, který používáme jako klíč. Jméno filmu takové očividně není.\n", + "\n", + "V našem konkrétním případě jsme si problému všimli sami, ale pokud bude duplikátní klíč utopen někde v milionech hodnot, rádi bychom, aby to počítač poznal za nás. K tomu slouží argument `validate` - podle toho, jaký vztah mezi tabulkami očekáš, jsou přípustné hodnoty `\"one_to_one\"`, `\"one_to_many\"`, `\"many_to_one\"` nebo `\"many_to_many\"`:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyear (imdb)lengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grossyear (boxoffice)
0Oliver TwistOliver TwistFalse1912<NA>Drama4.7196826Sony20803212005
1Oliver TwistOliver TwistFalse1912<NA>Drama4.4126826Sony20803212005
2Oliver TwistOliver TwistFalse191650Drama6.6166826Sony20803212005
3Oliver TwistOliver TwistFalse192298Drama6.86576826Sony20803212005
4Oliver TwistOliver TwistFalse193380Drama5.02926826Sony20803212005
.......................................
20562BTS World Tour: Love Yourself in SeoulBTS World Tour: Love Yourself in SeoulFalse2019112Documentary,Music8.54396173Fathom35099172019
20563Mojin: The Worm ValleyYun nan chong guFalse2018110Action,Fantasy4.712011240WGUSA1015162019
20564Extreme JobGeukhanjikeobFalse2019111Action,Comedy7.39057212CJ15488162019
20565Peppa Celebrates Chinese New Yearxiao zhu pei qi guo da nianFalse201981Animation,Family3.44110811STX1312252019
20566Avant qu'on exploseAvant qu'on exploseFalse2019108Comedy6.94110995EOne1165762019
\n", + "

20567 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " title \\\n", + "0 Oliver Twist \n", + "1 Oliver Twist \n", + "2 Oliver Twist \n", + "3 Oliver Twist \n", + "4 Oliver Twist \n", + "... ... \n", + "20562 BTS World Tour: Love Yourself in Seoul \n", + "20563 Mojin: The Worm Valley \n", + "20564 Extreme Job \n", + "20565 Peppa Celebrates Chinese New Year \n", + "20566 Avant qu'on explose \n", + "\n", + " original_title is_adult year (imdb) length \\\n", + "0 Oliver Twist False 1912 \n", + "1 Oliver Twist False 1912 \n", + "2 Oliver Twist False 1916 50 \n", + "3 Oliver Twist False 1922 98 \n", + "4 Oliver Twist False 1933 80 \n", + "... ... ... ... ... \n", + "20562 BTS World Tour: Love Yourself in Seoul False 2019 112 \n", + "20563 Yun nan chong gu False 2018 110 \n", + "20564 Geukhanjikeob False 2019 111 \n", + "20565 xiao zhu pei qi guo da nian False 2019 81 \n", + "20566 Avant qu'on explose False 2019 108 \n", + "\n", + " genres imdb_rating imdb_votes boxoffice_rank studio \\\n", + "0 Drama 4.7 19 6826 Sony \n", + "1 Drama 4.4 12 6826 Sony \n", + "2 Drama 6.6 16 6826 Sony \n", + "3 Drama 6.8 657 6826 Sony \n", + "4 Drama 5.0 292 6826 Sony \n", + "... ... ... ... ... ... \n", + "20562 Documentary,Music 8.5 439 6173 Fathom \n", + "20563 Action,Fantasy 4.7 120 11240 WGUSA \n", + "20564 Action,Comedy 7.3 905 7212 CJ \n", + "20565 Animation,Family 3.4 41 10811 STX \n", + "20566 Comedy 6.9 41 10995 EOne \n", + "\n", + " lifetime_gross year (boxoffice) \n", + "0 2080321 2005 \n", + "1 2080321 2005 \n", + "2 2080321 2005 \n", + "3 2080321 2005 \n", + "4 2080321 2005 \n", + "... ... ... \n", + "20562 3509917 2019 \n", + "20563 101516 2019 \n", + "20564 1548816 2019 \n", + "20565 131225 2019 \n", + "20566 116576 2019 \n", + "\n", + "[20567 rows x 12 columns]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.merge(\n", + " movies_with_rating,\n", + " boxoffice,\n", + " on=\"title\",\n", + " suffixes=[\" (imdb)\", \" (boxoffice)\"],\n", + "# validate=\"one_to_one\" # Odkomentuj a vyskočí chyba!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Řešení je jednoduché - budeme joinovat přes dva různé sloupce (argument `on` to unese ;-)). Při té příležitosti navíc zjišťujeme, že nedává smysl spojovat filmy, které rok vůbec uvedený nemají, a proto je vyhodíme:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
6926PlaybackPlaybackFalse201298Horror,Thriller4.3447816256Magn.264
6927PlaybackPlaybackFalse2012113Drama4.92716256Magn.264
6928PlaybackDur d'être DieuFalse201266Documentary5.2816256Magn.264
\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year length genres \\\n", + "6926 Playback Playback False 2012 98 Horror,Thriller \n", + "6927 Playback Playback False 2012 113 Drama \n", + "6928 Playback Dur d'être Dieu False 2012 66 Documentary \n", + "\n", + " imdb_rating imdb_votes boxoffice_rank studio lifetime_gross \n", + "6926 4.3 4478 16256 Magn. 264 \n", + "6927 4.9 27 16256 Magn. 264 \n", + "6928 5.2 8 16256 Magn. 264 " + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " pd.merge(\n", + " movies_with_rating.dropna(subset=[\"year\"]), # Vyhoď všechny řádky bez roku\n", + " boxoffice,\n", + " on=[\"title\", \"year\"],\n", + " validate=\"many_to_one\", # movies_with_rating pořád nejsou unikátní!\n", + " )\n", + ").query(\"title == 'Playback'\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pořád nejsou unikátní! Co s tím?\n", + "\n", + "**Hypotéza:** Vstupujeme na nebezpečnou půdu a zkusíme spekulovat, že informace o ziscích budeme mít nejspíš jen o nejpopulárnějších filmech. Možná máme pravdu, možná ne a nejspíš nějakou drobnou nepřesnost zaneseme, ale dobrat se tady skutečné pravdy je \"drahé\" (a možná i skutečně drahé), z nabízených datových sad to věrohodně možné není.\n", + "\n", + "Abychom se co nejvíc přiblížili realitě, z každé opakující se dvojice (název, rok) vybereme film s nejvyšším `imdb_votes`. Nejdříve si pomocí `sort_values` srovnáme všechny filmy a pak zavoláme `drop_duplicates(..., keep=\"first\")`, což nám ponechá vždy jen jeden z řady duplikátů:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
0The Shawshank RedemptionThe Shawshank RedemptionFalse1994142Drama9.320717592792Col.28341469
1The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.0203767810WB535234033
2InceptionInceptionFalse2010148Action,Adventure,Sci-Fi8.8181636085WB292576195
3Fight ClubFight ClubFalse1999139Drama8.816578572248Fox37030102
4Pulp FictionPulp FictionFalse1994154Crime,Drama8.91620135629Mira.107928762
....................................
8996GirlfriendsGirlfriendsFalse1996<NA>NaN8.6713930FRun18000
8997SacredSacredFalse2017<NA>Action,Drama,Romance8.2613950Argo.17740
8998The Professor: Tai Chi's Journey WestThe Professor: Tai Chi's Journey WestFalse201672Documentary7.2615820FRun2852
8999After LoveAfter LoveFalse2017<NA>Drama,Romance,Thriller7.6514299Distrib.13693
9000Still, the Children Are HereStill, the Children Are HereFalse200485Documentary6.6515653Icar.3685
\n", + "

9001 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " title \\\n", + "0 The Shawshank Redemption \n", + "1 The Dark Knight \n", + "2 Inception \n", + "3 Fight Club \n", + "4 Pulp Fiction \n", + "... ... \n", + "8996 Girlfriends \n", + "8997 Sacred \n", + "8998 The Professor: Tai Chi's Journey West \n", + "8999 After Love \n", + "9000 Still, the Children Are Here \n", + "\n", + " original_title is_adult year length \\\n", + "0 The Shawshank Redemption False 1994 142 \n", + "1 The Dark Knight False 2008 152 \n", + "2 Inception False 2010 148 \n", + "3 Fight Club False 1999 139 \n", + "4 Pulp Fiction False 1994 154 \n", + "... ... ... ... ... \n", + "8996 Girlfriends False 1996 \n", + "8997 Sacred False 2017 \n", + "8998 The Professor: Tai Chi's Journey West False 2016 72 \n", + "8999 After Love False 2017 \n", + "9000 Still, the Children Are Here False 2004 85 \n", + "\n", + " genres imdb_rating imdb_votes boxoffice_rank \\\n", + "0 Drama 9.3 2071759 2792 \n", + "1 Action,Crime,Drama 9.0 2037678 10 \n", + "2 Action,Adventure,Sci-Fi 8.8 1816360 85 \n", + "3 Drama 8.8 1657857 2248 \n", + "4 Crime,Drama 8.9 1620135 629 \n", + "... ... ... ... ... \n", + "8996 NaN 8.6 7 13930 \n", + "8997 Action,Drama,Romance 8.2 6 13950 \n", + "8998 Documentary 7.2 6 15820 \n", + "8999 Drama,Romance,Thriller 7.6 5 14299 \n", + "9000 Documentary 6.6 5 15653 \n", + "\n", + " studio lifetime_gross \n", + "0 Col. 28341469 \n", + "1 WB 535234033 \n", + "2 WB 292576195 \n", + "3 Fox 37030102 \n", + "4 Mira. 107928762 \n", + "... ... ... \n", + "8996 FRun 18000 \n", + "8997 Argo. 17740 \n", + "8998 FRun 2852 \n", + "8999 Distrib. 13693 \n", + "9000 Icar. 3685 \n", + "\n", + "[9001 rows x 11 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "movies_with_rating_and_boxoffice = (\n", + " pd.merge(\n", + " movies_with_rating\n", + " .dropna(subset=[\"year\"])\n", + " .sort_values(\"imdb_votes\", ascending=False)\n", + " .drop_duplicates(\n", + " subset=[\"title\", \"year\"],\n", + " keep=\"first\"\n", + " ),\n", + " boxoffice,\n", + " on=[\"title\", \"year\"],\n", + " validate=\"one_to_one\",\n", + " )\n", + ")\n", + "movies_with_rating_and_boxoffice" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_gross
5831PlaybackPlaybackFalse201298Horror,Thriller4.3447816256Magn.264
\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year length genres \\\n", + "5831 Playback Playback False 2012 98 Horror,Thriller \n", + "\n", + " imdb_rating imdb_votes boxoffice_rank studio lifetime_gross \n", + "5831 4.3 4478 16256 Magn. 264 " + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# To už by šlo!\n", + "movies_with_rating_and_boxoffice.query(\"title == 'Playback'\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Úkol:** Seřaď filmy podle toho, kolik vydělaly (nabízí se hned dvě možnosti)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Otázka:** Které filmy nám vypadly a proč?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Třetí join" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RankTitleRatingTomatometerNo. of ReviewsGenres
01Black Panther (2018)97444action|adventure
12Mad Max: Fury Road (2015)97394action|adventure
23Wonder Woman (2017)93410action|adventure
34Metropolis (1927)99118action|adventure
45Coco (2017)97308action|adventure
..................
158570Priest (2011)1597western
158671American Outlaws (2001)14103western
158772September Dawn (2007)1554western
158873Jonah Hex (2010)12147western
158974Texas Rangers (2001)251western
\n", + "

1590 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " Rank Title RatingTomatometer No. of Reviews \\\n", + "0 1 Black Panther (2018) 97 444 \n", + "1 2 Mad Max: Fury Road (2015) 97 394 \n", + "2 3 Wonder Woman (2017) 93 410 \n", + "3 4 Metropolis (1927) 99 118 \n", + "4 5 Coco (2017) 97 308 \n", + "... ... ... ... ... \n", + "1585 70 Priest (2011) 15 97 \n", + "1586 71 American Outlaws (2001) 14 103 \n", + "1587 72 September Dawn (2007) 15 54 \n", + "1588 73 Jonah Hex (2010) 12 147 \n", + "1589 74 Texas Rangers (2001) 2 51 \n", + "\n", + " Genres \n", + "0 action|adventure \n", + "1 action|adventure \n", + "2 action|adventure \n", + "3 action|adventure \n", + "4 action|adventure \n", + "... ... \n", + "1585 western \n", + "1586 western \n", + "1587 western \n", + "1588 western \n", + "1589 western \n", + "\n", + "[1590 rows x 5 columns]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rotten_tomatoes_raw" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Title\n", + "Yellow Submarine (1968) 6\n", + "101 Dalmatians (1961) 5\n", + "Fantasia (1940) 5\n", + "Harry Potter and the Deathly Hallows - Part 2 (2011) 5\n", + "Miracle on 34th Street (1947) 5\n", + " ..\n", + "Misery (1990) 1\n", + "The Dead Zone (1983) 1\n", + "The Conjuring (2013) 1\n", + "The Exorcist (1973) 1\n", + "Texas Rangers (2001) 1\n", + "Name: count, Length: 947, dtype: int64" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rotten_tomatoes_raw[\"Title\"].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A zase duplicity, některé názvy se nám opakují :-(\n", + "\n", + "**Otázka:** Dokážeš zjistit proč? Nápověda: podívej se na nějaký konkrétní film." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Naštěstí už víme, jak na to - použijeme metodu `drop_duplicates`, tentokrát přes sloupec `\"Title\"`. (Poznámka: druhou možností by bylo sloučit všechny různé žánry daného filmu do jedné buňky)." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TitleRatingTomatometerNo. of Reviews
0Black Panther (2018)97444
1Mad Max: Fury Road (2015)97394
2Wonder Woman (2017)93410
3Metropolis (1927)99118
4Coco (2017)97308
............
1585Priest (2011)1597
1586American Outlaws (2001)14103
1587September Dawn (2007)1554
1588Jonah Hex (2010)12147
1589Texas Rangers (2001)251
\n", + "

947 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " Title RatingTomatometer No. of Reviews\n", + "0 Black Panther (2018) 97 444\n", + "1 Mad Max: Fury Road (2015) 97 394\n", + "2 Wonder Woman (2017) 93 410\n", + "3 Metropolis (1927) 99 118\n", + "4 Coco (2017) 97 308\n", + "... ... ... ...\n", + "1585 Priest (2011) 15 97\n", + "1586 American Outlaws (2001) 14 103\n", + "1587 September Dawn (2007) 15 54\n", + "1588 Jonah Hex (2010) 12 147\n", + "1589 Texas Rangers (2001) 2 51\n", + "\n", + "[947 rows x 3 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rotten_tomatoes_nodup = (\n", + " rotten_tomatoes_raw\n", + " .drop_duplicates(\n", + " subset=\"Title\",\n", + " keep=\"first\" # Vybereme první výskyt, lze i \"last\" (anebo False => vyhodit všechny)\n", + " )\n", + " .drop(\"Genres\", axis=\"columns\") # Informační hodnotu jsme už ztratili\n", + " .drop(\"Rank\", axis=\"columns\") # Mělo smysl jen v rámci žánru\n", + ")\n", + "rotten_tomatoes_nodup" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
title_typetitleoriginal_titleis_adultstart_yearend_yearlengthgenresTitleRatingTomatometerNo. of Reviews
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [title_type, title, original_title, is_adult, start_year, end_year, length, genres, Title, RatingTomatometer, No. of Reviews]\n", + "Index: []" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Ready to merge?\n", + "pd.merge(imdb_titles, rotten_tomatoes_nodup, left_on=\"title\", right_on=\"Title\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0 řádků!\n", + "\n", + "Dosud jsme manipulovali s řádky a sloupci jako celky, nicméně teď musíme zasahovat přímo do hodnot v buňkách. I to se při slučování dat z různých zdrojů nezřídka stává. Stojíme před úkolem převést řetězce typu \"Black Panther (2018)\" na dvě hodnoty: název \"Black Panther\" a rok 2018 (jeden sloupec na dva). \n", + "\n", + "Naštěstí si ty sloupce umíme jednoduše vyrobit pomocí řetězcové metody [`.str.slice`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.slice.html), která z každého řetězce vyřízne nějakou jeho část (a zase pracuje na celém sloupci - výsledkem bude nový sloupec s funkcí aplikovanou na každou z hodnot). Budeme věřit, že předposlední čtyři znaky představují rok a zbytek, až na nějaké ty závorky, tvoří skutečný název:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tomatoes_ratingtomatoes_votestitleyear
097444Black Panther2018
197394Mad Max: Fury Road2015
293410Wonder Woman2017
399118Metropolis1927
497308Coco2017
...............
15851597Priest2011
158614103American Outlaws2001
15871554September Dawn2007
158812147Jonah Hex2010
1589251Texas Rangers2001
\n", + "

947 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " tomatoes_rating tomatoes_votes title year\n", + "0 97 444 Black Panther 2018\n", + "1 97 394 Mad Max: Fury Road 2015\n", + "2 93 410 Wonder Woman 2017\n", + "3 99 118 Metropolis 1927\n", + "4 97 308 Coco 2017\n", + "... ... ... ... ...\n", + "1585 15 97 Priest 2011\n", + "1586 14 103 American Outlaws 2001\n", + "1587 15 54 September Dawn 2007\n", + "1588 12 147 Jonah Hex 2010\n", + "1589 2 51 Texas Rangers 2001\n", + "\n", + "[947 rows x 4 columns]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rotten_tomatoes_beta = (rotten_tomatoes_nodup\n", + " .assign(\n", + " title=rotten_tomatoes_nodup[\"Title\"].str.slice(0, -7), \n", + " year=rotten_tomatoes_nodup[\"Title\"].str.slice(-5, -1).astype(int)\n", + " )\n", + " .rename({\n", + " \"RatingTomatometer\": \"tomatoes_rating\",\n", + " \"No. of Reviews\": \"tomatoes_votes\",\n", + " }, axis=\"columns\")\n", + " .drop([\"Title\"], axis=\"columns\")\n", + ")\n", + "rotten_tomatoes_beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Závorková odysea nekončí, někdo nám proaktivně do závorek nacpal i originální název naanglickojazyčných filmů. Pojďme se o tom přesvědčit pomocí metody [`.str.contains`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html) (protože tato metoda ve výchozím stavu používá pro vyhledávání regulární výrazy, které jsme se zatím nenaučili používat, musíme jí to explicitně zakázat argumentem `regex=False`):" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tomatoes_ratingtomatoes_votestitleyear
1510058Seven Samurai (Shichinin no Samurai)1956
519846Aguirre, the Wrath of God (Aguirre, der Zorn G...1972
619771Ghostbusters (1984 Original)1984
699847A Fistful of Dollars (Per un Pugno di Dollari)1964
9996139Embrace Of The Serpent (El Abrazo De La Serpie...2016
...............
13689759To Be and to Have (Etre et Avoir)2003
14574382Goal! The Dream Begins (Goal!: The Impossible ...2005
15027152Only Human (Seres queridos)2006
15478364The Good, the Bad, the Weird (Joheun-nom, Nabb...2010
15597462Fah talai jone (Tears of the Black Tiger)2007
\n", + "

66 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " tomatoes_rating tomatoes_votes \\\n", + "15 100 58 \n", + "51 98 46 \n", + "61 97 71 \n", + "69 98 47 \n", + "99 96 139 \n", + "... ... ... \n", + "1368 97 59 \n", + "1457 43 82 \n", + "1502 71 52 \n", + "1547 83 64 \n", + "1559 74 62 \n", + "\n", + " title year \n", + "15 Seven Samurai (Shichinin no Samurai) 1956 \n", + "51 Aguirre, the Wrath of God (Aguirre, der Zorn G... 1972 \n", + "61 Ghostbusters (1984 Original) 1984 \n", + "69 A Fistful of Dollars (Per un Pugno di Dollari) 1964 \n", + "99 Embrace Of The Serpent (El Abrazo De La Serpie... 2016 \n", + "... ... ... \n", + "1368 To Be and to Have (Etre et Avoir) 2003 \n", + "1457 Goal! The Dream Begins (Goal!: The Impossible ... 2005 \n", + "1502 Only Human (Seres queridos) 2006 \n", + "1547 The Good, the Bad, the Weird (Joheun-nom, Nabb... 2010 \n", + "1559 Fah talai jone (Tears of the Black Tiger) 2007 \n", + "\n", + "[66 rows x 4 columns]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rotten_tomatoes_beta[rotten_tomatoes_beta[\"title\"].str.contains(\")\", regex=False)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "V rámci zjednodušení proto ještě odstraníme všechny takové závorky. K tomu pomůže funkce [`.str.rsplit`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.rsplit.html), která rozdělí zprava řetězec na několik částí podle oddělovače a vloží je do seznamu - my za ten oddělovač zvolíme levou závorku `\"(\"`, omezíme počet částí na jednu až dvě (`n=1`):" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "41 [Marvel's The Avengers]\n", + "61 [Ghostbusters , 1984 Original)]\n", + "81 [Mad Max 2: The Road Warrior]\n", + "Name: title, dtype: object" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "split_title = (\n", + " rotten_tomatoes_beta[\"title\"]\n", + " .str.rsplit(\"(\", n=1)\n", + ")\n", + "split_title.loc[[41, 61, 81]] # Některé seznamy obsahují jeden prvek, jiné dva" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A jak teď vybrat první prvek z každého seznamu?\n", + "\n", + "💡 Metoda [`apply`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.apply.html) umožňuje použít libovolnou transformaci (definovanou jako funkci) na každý řádek v tabulce či hodnotu v `Series`. Obvykle se bez ní obejdeme a měli bychom (proto se jí tolik speciálně nevěnujeme), protože není příliš výpočetně efektivní. Tady nám ale usnadní pochopení, co se vlastně dělá, t.j. vybírá první prvek nějakého seznamu:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tomatoes_ratingtomatoes_votestitleyear
097444Black Panther2018
197394Mad Max: Fury Road2015
293410Wonder Woman2017
399118Metropolis1927
497308Coco2017
...............
15851597Priest2011
158614103American Outlaws2001
15871554September Dawn2007
158812147Jonah Hex2010
1589251Texas Rangers2001
\n", + "

947 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " tomatoes_rating tomatoes_votes title year\n", + "0 97 444 Black Panther 2018\n", + "1 97 394 Mad Max: Fury Road 2015\n", + "2 93 410 Wonder Woman 2017\n", + "3 99 118 Metropolis 1927\n", + "4 97 308 Coco 2017\n", + "... ... ... ... ...\n", + "1585 15 97 Priest 2011\n", + "1586 14 103 American Outlaws 2001\n", + "1587 15 54 September Dawn 2007\n", + "1588 12 147 Jonah Hex 2010\n", + "1589 2 51 Texas Rangers 2001\n", + "\n", + "[947 rows x 4 columns]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def take_first(a_list): # Funkce, kterou použijeme v apply\n", + " return a_list[0]\n", + "\n", + "rotten_tomatoes = (rotten_tomatoes_beta\n", + " .assign(\n", + " title=split_title.apply(take_first)\n", + " )\n", + ")\n", + "rotten_tomatoes" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tomatoes_ratingtomatoes_votestitleyear
15398842The Magnificent Seven1960
156063289The Magnificent Seven2016
\n", + "
" + ], + "text/plain": [ + " tomatoes_rating tomatoes_votes title year\n", + "1539 88 42 The Magnificent Seven 1960\n", + "1560 63 289 The Magnificent Seven 2016" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Zbavení se duplikátů hned na začátku nám zachovalo filmy se stejným jménem :-)\n", + "rotten_tomatoes.query(\"title == 'The Magnificent Seven'\")" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenrestomatoes_ratingtomatoes_votes
0The Birth of a NationThe Birth of a NationFalse1915195Drama,History,War9840
1Battleship PotemkinBronenosets PotemkinFalse192575Drama,History10045
2The Gold RushThe Gold RushFalse192595Adventure,Comedy,Drama10043
3MetropolisMetropolisFalse1927153Drama,Sci-Fi99118
4All Quiet on the Western FrontAll Quiet on the Western FrontFalse1930136Drama,War10042
...........................
654Three Identical StrangersThree Identical StrangersFalse201896Biography,Documentary,Drama96157
655SearchingSearchingFalse2018102Drama,Mystery,Thriller92214
656Won't You Be My Neighbor?Won't You Be My Neighbor?False201894Biography,Documentary98216
657RBGRBGFalse201898Biography,Documentary95153
658HereditaryHereditaryFalse2018127Drama,Horror,Mystery89317
\n", + "

659 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " title original_title is_adult \\\n", + "0 The Birth of a Nation The Birth of a Nation False \n", + "1 Battleship Potemkin Bronenosets Potemkin False \n", + "2 The Gold Rush The Gold Rush False \n", + "3 Metropolis Metropolis False \n", + "4 All Quiet on the Western Front All Quiet on the Western Front False \n", + ".. ... ... ... \n", + "654 Three Identical Strangers Three Identical Strangers False \n", + "655 Searching Searching False \n", + "656 Won't You Be My Neighbor? Won't You Be My Neighbor? False \n", + "657 RBG RBG False \n", + "658 Hereditary Hereditary False \n", + "\n", + " year length genres tomatoes_rating \\\n", + "0 1915 195 Drama,History,War 98 \n", + "1 1925 75 Drama,History 100 \n", + "2 1925 95 Adventure,Comedy,Drama 100 \n", + "3 1927 153 Drama,Sci-Fi 99 \n", + "4 1930 136 Drama,War 100 \n", + ".. ... ... ... ... \n", + "654 2018 96 Biography,Documentary,Drama 96 \n", + "655 2018 102 Drama,Mystery,Thriller 92 \n", + "656 2018 94 Biography,Documentary 98 \n", + "657 2018 98 Biography,Documentary 95 \n", + "658 2018 127 Drama,Horror,Mystery 89 \n", + "\n", + " tomatoes_votes \n", + "0 40 \n", + "1 45 \n", + "2 43 \n", + "3 118 \n", + "4 42 \n", + ".. ... \n", + "654 157 \n", + "655 214 \n", + "656 216 \n", + "657 153 \n", + "658 317 \n", + "\n", + "[659 rows x 8 columns]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.merge(\n", + " movies.dropna(subset=[\"year\"]),\n", + " rotten_tomatoes,\n", + " on=[\"title\", \"year\"],\n", + " how=\"inner\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Když sloučíme filmy a hodnocení na Rotten Tomatoes, z 947 filmů se nám skoro tři sta ztratí. Bohužel zde je na vině především nestejnost zápisu názvu, různé uřčité členy, interpunkce, podnázvy apod. Coby řešení se tady nabízí spousta a spousta manuální práce, případně nějaká heuristika, která by na sebe pasovala \"hodně podobné\" názvy.\n", + "\n", + "*Mimochodem, obtížnost manuální práce se mezi vývojáři někdy přeceňuje: Opravit 288 názvů filmů může být práce na hodinu až dvě, zatímco psát algoritmus na \"řešení problému\" může trvat stejně dlouho, ne-li déle.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Čtvrtý (a poslední) join\n", + "\n", + "Dokončíme slučování všech čtyř tabulek:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleoriginal_titleis_adultyearlengthgenresimdb_ratingimdb_votesboxoffice_rankstudiolifetime_grosstomatoes_ratingtomatoes_votes
0Black PantherBlack PantherFalse2018134Action,Adventure,Sci-Fi7.34899773BV70005956697444
1Avengers: Infinity WarAvengers: Infinity WarFalse2018149Action,Adventure,Sci-Fi8.56160504BV67881548284408
2TitanicTitanicFalse1997194Drama,Romance7.89458895Par.65936394489184
3Incredibles 2Incredibles 2False2018118Action,Adventure,Animation7.71923019BV60858174494332
4The Dark KnightThe Dark KnightFalse2008152Action,Crime,Drama9.0203767810WB53523403394332
..........................................
469Boxing GymBoxing GymFalse201091Documentary7.138912999Zipp.324769542
470Red HillRed HillFalse201095Thriller,Western6.4784413681Strand210877865
471City LightsCity LightsFalse193187Comedy,Drama,Romance8.514426113827UA191819845
472Minding the GapMinding the GapFalse201893Documentary8.1411914471Magn.1199810063
473The Autopsy of Jane DoeThe Autopsy of Jane DoeFalse201686Horror,Mystery,Thriller6.87396514657IFC104748798
\n", + "

474 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " title original_title is_adult year length \\\n", + "0 Black Panther Black Panther False 2018 134 \n", + "1 Avengers: Infinity War Avengers: Infinity War False 2018 149 \n", + "2 Titanic Titanic False 1997 194 \n", + "3 Incredibles 2 Incredibles 2 False 2018 118 \n", + "4 The Dark Knight The Dark Knight False 2008 152 \n", + ".. ... ... ... ... ... \n", + "469 Boxing Gym Boxing Gym False 2010 91 \n", + "470 Red Hill Red Hill False 2010 95 \n", + "471 City Lights City Lights False 1931 87 \n", + "472 Minding the Gap Minding the Gap False 2018 93 \n", + "473 The Autopsy of Jane Doe The Autopsy of Jane Doe False 2016 86 \n", + "\n", + " genres imdb_rating imdb_votes boxoffice_rank \\\n", + "0 Action,Adventure,Sci-Fi 7.3 489977 3 \n", + "1 Action,Adventure,Sci-Fi 8.5 616050 4 \n", + "2 Drama,Romance 7.8 945889 5 \n", + "3 Action,Adventure,Animation 7.7 192301 9 \n", + "4 Action,Crime,Drama 9.0 2037678 10 \n", + ".. ... ... ... ... \n", + "469 Documentary 7.1 389 12999 \n", + "470 Thriller,Western 6.4 7844 13681 \n", + "471 Comedy,Drama,Romance 8.5 144261 13827 \n", + "472 Documentary 8.1 4119 14471 \n", + "473 Horror,Mystery,Thriller 6.8 73965 14657 \n", + "\n", + " studio lifetime_gross tomatoes_rating tomatoes_votes \n", + "0 BV 700059566 97 444 \n", + "1 BV 678815482 84 408 \n", + "2 Par. 659363944 89 184 \n", + "3 BV 608581744 94 332 \n", + "4 WB 535234033 94 332 \n", + ".. ... ... ... ... \n", + "469 Zipp. 32476 95 42 \n", + "470 Strand 21087 78 65 \n", + "471 UA 19181 98 45 \n", + "472 Magn. 11998 100 63 \n", + "473 IFC 10474 87 98 \n", + "\n", + "[474 rows x 13 columns]" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "movies_complete = pd.merge(\n", + " movies_with_rating_and_boxoffice,\n", + " rotten_tomatoes,\n", + " on=[\"title\", \"year\"],\n", + " how=\"inner\"\n", + ")\n", + "movies_complete.sort_values(\"boxoffice_rank\").reset_index(drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A přišli jsme o dalších 175 filmů. \n", + "\n", + "Co dál? Pokud by toto byl skutečný úkol, museli bychom se s tím nějak vypořádat - zkoumat, proč které řádky nesedí, v čem se liší názvy stejného filmu v různých datových sadách, jinými slovy *manuální práce, práce, práce...*\n", + "\n", + "Naštěstí to je úkol jen ukázkový, a my můžeme být spokojeni, že máme sice neúplnou, ale přesto použitelnou datovou sadu :-)" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/lessons/pydata/pandas_joins/info.yml b/lessons/pydata/pandas_joins/info.yml new file mode 100644 index 0000000..1e45f47 --- /dev/null +++ b/lessons/pydata/pandas_joins/info.yml @@ -0,0 +1,4 @@ +title: Pandas - spojování tabulek a vztahy mezi více proměnnými +style: ipynb +attribution: Pro PyDataCZ napsal Jan Pipek, 2020. +license: cc-by-sa-40 \ No newline at end of file diff --git a/lessons/pydata/pandas_correlations/rotten_tomatoes_top_movies_2019-01-15.csv b/lessons/pydata/pandas_joins/rotten_tomatoes_top_movies_2019-01-15.csv similarity index 100% rename from lessons/pydata/pandas_correlations/rotten_tomatoes_top_movies_2019-01-15.csv rename to lessons/pydata/pandas_joins/rotten_tomatoes_top_movies_2019-01-15.csv diff --git a/lessons/pydata/pandas_correlations/static/joins.svg b/lessons/pydata/pandas_joins/static/joins.svg similarity index 100% rename from lessons/pydata/pandas_correlations/static/joins.svg rename to lessons/pydata/pandas_joins/static/joins.svg diff --git a/lessons/pydata/pandas_correlations/title.basics.tsv.gz b/lessons/pydata/pandas_joins/title.basics.tsv.gz similarity index 100% rename from lessons/pydata/pandas_correlations/title.basics.tsv.gz rename to lessons/pydata/pandas_joins/title.basics.tsv.gz diff --git a/lessons/pydata/pandas_correlations/title.ratings.tsv.gz b/lessons/pydata/pandas_joins/title.ratings.tsv.gz similarity index 100% rename from lessons/pydata/pandas_correlations/title.ratings.tsv.gz rename to lessons/pydata/pandas_joins/title.ratings.tsv.gz