{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas : Examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reading CSV"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Name \n",
" City \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Donald Duck \n",
" Copenhagen \n",
" \n",
" \n",
" 1 \n",
" Goofy \n",
" Aarhus \n",
" \n",
" \n",
" 2 \n",
" Mickey Mouse \n",
" Aarhus \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name City\n",
"0 Donald Duck Copenhagen\n",
"1 Goofy Aarhus\n",
"2 Mickey Mouse Aarhus"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"students = pd.read_csv('students.csv')\n",
"students"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading Pandas data frames from sqlite3"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import sqlite3\n",
"\n",
"connection = sqlite3.connect('example.sqlite')\n",
"\n",
"countries = pd.read_sql_query('SELECT * FROM country', connection)\n",
"cities = pd.read_sql_query('SELECT * FROM city', connection)\n",
"\n",
"students.to_sql('students', connection, if_exists='replace')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(pandas.core.frame.DataFrame,\n",
" pandas.core.frame.DataFrame,\n",
" pandas.core.frame.DataFrame)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(countries), type(cities), type(students) # Pandas data frame"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" population \n",
" area \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Denmark \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" \n",
" \n",
" 1 \n",
" Germany \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" \n",
" \n",
" 2 \n",
" USA \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" \n",
" \n",
" 3 \n",
" Iceland \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population area capital\n",
"0 Denmark 5748769 42931 Copenhagen\n",
"1 Germany 82800000 357168 Berlin\n",
"2 USA 325719178 9833520 Washington, D.C.\n",
"3 Iceland 334252 102775 Reykjavik"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries # looks nice, because of Jupyter notebook integration"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" name population area capital\n",
"0 Denmark 5748769 42931 Copenhagen\n",
"1 Germany 82800000 357168 Berlin\n",
"2 USA 325719178 9833520 Washington, D.C.\n",
"3 Iceland 334252 102775 Reykjavik\n"
]
}
],
"source": [
"print(countries) # does not exploit Jupyter notebook integration"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" country \n",
" population \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" \n",
" \n",
" 1 \n",
" Aarhus \n",
" Denmark \n",
" 273077 \n",
" 750 \n",
" \n",
" \n",
" 2 \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" \n",
" \n",
" 3 \n",
" Munich \n",
" Germany \n",
" 1464301 \n",
" 1158 \n",
" \n",
" \n",
" 4 \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" \n",
" \n",
" 5 \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" \n",
" \n",
" 6 \n",
" New Orleans \n",
" USA \n",
" 343829 \n",
" 1718 \n",
" \n",
" \n",
" 7 \n",
" San Francisco \n",
" USA \n",
" 884363 \n",
" 1776 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name country population established\n",
"0 Copenhagen Denmark 775033 800\n",
"1 Aarhus Denmark 273077 750\n",
"2 Berlin Germany 3711930 1237\n",
"3 Munich Germany 1464301 1158\n",
"4 Reykjavik Iceland 126100 874\n",
"5 Washington, D.C. USA 693972 1790\n",
"6 New Orleans USA 343829 1718\n",
"7 San Francisco USA 884363 1776"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Indexing data frames"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 Denmark\n",
"1 Germany\n",
"2 USA\n",
"3 Iceland\n",
"Name: name, dtype: object"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries['name'] # single column"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 Denmark\n",
"1 Germany\n",
"2 USA\n",
"3 Iceland\n",
"Name: name, dtype: object"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.name # can also access columns by .name"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Denmark \n",
" Copenhagen \n",
" \n",
" \n",
" 1 \n",
" Germany \n",
" Berlin \n",
" \n",
" \n",
" 2 \n",
" USA \n",
" Washington, D.C. \n",
" \n",
" \n",
" 3 \n",
" Iceland \n",
" Reykjavik \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name capital\n",
"0 Denmark Copenhagen\n",
"1 Germany Berlin\n",
"2 USA Washington, D.C.\n",
"3 Iceland Reykjavik"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries[['name', 'capital']] # select multiple columns"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" population \n",
" area \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Denmark \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" \n",
" \n",
" 1 \n",
" Germany \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population area capital\n",
"0 Denmark 5748769 42931 Copenhagen\n",
"1 Germany 82800000 357168 Berlin"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.head(2) # first two rows"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" population \n",
" area \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 3 \n",
" Iceland \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population area capital\n",
"3 Iceland 334252 102775 Reykjavik"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.tail(1) # not a row but a data frame with one row\n",
" # notice row label is unchanged"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" population \n",
" area \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" Germany \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" \n",
" \n",
" 2 \n",
" USA \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population area capital\n",
"1 Germany 82800000 357168 Berlin\n",
"2 USA 325719178 9833520 Washington, D.C."
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries[1:3] # row slicing by row lables"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" population \n",
" area \n",
" capital \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Denmark \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" \n",
" \n",
" 2 \n",
" USA \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population area capital\n",
"0 Denmark 5748769 42931 Copenhagen\n",
"2 USA 325719178 9833520 Washington, D.C."
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries[::2] # every 2nd row"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Washington, D.C.'"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.at[2, 'capital'] # use .at to lookup single cell"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"name Aarhus\n",
"country Denmark\n",
"population 273077\n",
"established 750\n",
"Name: 1, dtype: object"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities.loc[1] # single row is accessed using .loc[row lable]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Aarhus'"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities.loc[1]['name'] # another way to get a single value"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Aarhus'"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities.loc[1, 'name'] # and yet another way"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" country \n",
" name \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" Denmark \n",
" Aarhus \n",
" \n",
" \n",
" 3 \n",
" Germany \n",
" Munich \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country name\n",
"1 Denmark Aarhus\n",
"3 Germany Munich"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities.loc[[1, 3], ['country', 'name']] # extract sub data frame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Masking rows"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 True\n",
"1 True\n",
"2 False\n",
"3 False\n",
"4 False\n",
"5 False\n",
"6 False\n",
"7 False\n",
"Name: country, dtype: bool"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mask = cities['country'] == 'Denmark'\n",
"mask"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" country \n",
" population \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" \n",
" \n",
" 1 \n",
" Aarhus \n",
" Denmark \n",
" 273077 \n",
" 750 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name country population established\n",
"0 Copenhagen Denmark 775033 800\n",
"1 Aarhus Denmark 273077 750"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities[mask] # use a boolean data frame as a mask"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" country \n",
" population \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" \n",
" \n",
" 1 \n",
" Aarhus \n",
" Denmark \n",
" 273077 \n",
" 750 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name country population established\n",
"0 Copenhagen Denmark 775033 800\n",
"1 Aarhus Denmark 273077 750"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities[cities.country == 'Denmark'] # or shorter"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name \n",
" country \n",
" population \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" Aarhus \n",
" Denmark \n",
" 273077 \n",
" 750 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name country population established\n",
"1 Aarhus Denmark 273077 750"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# can also do operations on columns +, -, &, |, ...\n",
"cities[(cities.country == 'Denmark') & (cities.established < 800)]"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 775833\n",
"1 273827\n",
"2 3713167\n",
"3 1465459\n",
"4 126974\n",
"5 695762\n",
"6 345547\n",
"7 886139\n",
"dtype: int64"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities.population + cities.established # not very meaningfull but you can do it.."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Creating data frames from data"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 10 \n",
" \n",
" \n",
" 1 \n",
" 11 \n",
" \n",
" \n",
" 2 \n",
" 12 \n",
" \n",
" \n",
" 3 \n",
" 13 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"0 10\n",
"1 11\n",
"2 12\n",
"3 13"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame([10, 11, 12, 13]) # one dimensional data"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" one \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" two \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" three \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B\n",
"0 1 one\n",
"1 2 two\n",
"2 3 three"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame({'A': [1,2,3], 'B': ['one', 'two', 'three']}) # data frame from dictionary"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 10 \n",
" 11 \n",
" \n",
" \n",
" 1 \n",
" 12 \n",
" 13 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1\n",
"0 10 11\n",
"1 12 13"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame([[10, 11], [12, 13]]) # two dimensional list"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 10 \n",
" 11 \n",
" \n",
" \n",
" 1 \n",
" 12 \n",
" 13 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B\n",
"0 10 11\n",
"1 12 13"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame([[10, 11], [12, 13]], columns=['A', 'B']) # name columns"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" x \n",
" 10 \n",
" 11 \n",
" \n",
" \n",
" y \n",
" 12 \n",
" 13 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B\n",
"x 10 11\n",
"y 12 13"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame([[10, 11], [12, 13]], \n",
" columns=['A', 'B'],\n",
" index=['x', 'y']) # can also assign row labels"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.57252247, 0.60743944, 0.05473956, 0.79662469],\n",
" [0.04944432, 0.15741632, 0.13890316, 0.81421765],\n",
" [0.98212556, 0.77183968, 0.06285572, 0.31457113]])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"A = np.random.random((3, 4))\n",
"A"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.572522 \n",
" 0.607439 \n",
" 0.054740 \n",
" 0.796625 \n",
" \n",
" \n",
" 1 \n",
" 0.049444 \n",
" 0.157416 \n",
" 0.138903 \n",
" 0.814218 \n",
" \n",
" \n",
" 2 \n",
" 0.982126 \n",
" 0.771840 \n",
" 0.062856 \n",
" 0.314571 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2 3\n",
"0 0.572522 0.607439 0.054740 0.796625\n",
"1 0.049444 0.157416 0.138903 0.814218\n",
"2 0.982126 0.771840 0.062856 0.314571"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(A)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" y \n",
" 0.572522 \n",
" 0.607439 \n",
" 0.054740 \n",
" 0.796625 \n",
" \n",
" \n",
" x \n",
" 0.049444 \n",
" 0.157416 \n",
" 0.138903 \n",
" 0.814218 \n",
" \n",
" \n",
" z \n",
" 0.982126 \n",
" 0.771840 \n",
" 0.062856 \n",
" 0.314571 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"y 0.572522 0.607439 0.054740 0.796625\n",
"x 0.049444 0.157416 0.138903 0.814218\n",
"z 0.982126 0.771840 0.062856 0.314571"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R = pd.DataFrame(A, columns=list('ABCD'), index=list('yxz'))\n",
"R"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Labelled rows .loc and .iloc"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" B \n",
" C \n",
" \n",
" \n",
" \n",
" \n",
" x \n",
" 0.157416 \n",
" 0.138903 \n",
" \n",
" \n",
" z \n",
" 0.771840 \n",
" 0.062856 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" B C\n",
"x 0.157416 0.138903\n",
"z 0.771840 0.062856"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R.loc['x':'z', ['B', 'C']] # row slicing is now by labels (inclusive)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.13890315739933812"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R.iloc[1, 2] # .iloc can be used to index with integer numbers"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" y \n",
" 0.572522 \n",
" 0.607439 \n",
" \n",
" \n",
" x \n",
" 0.049444 \n",
" 0.157416 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B\n",
"y 0.572522 0.607439\n",
"x 0.049444 0.157416"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R.iloc[:2, :2] # two first first rows and columns\n",
"# R[:2, :2] is invalid !!!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mering two data frames"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" name_x \n",
" population_x \n",
" area \n",
" capital \n",
" name_y \n",
" country \n",
" population_y \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Denmark \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" \n",
" \n",
" 1 \n",
" Germany \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" \n",
" \n",
" 2 \n",
" USA \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" \n",
" \n",
" 3 \n",
" Iceland \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name_x population_x area capital name_y \\\n",
"0 Denmark 5748769 42931 Copenhagen Copenhagen \n",
"1 Germany 82800000 357168 Berlin Berlin \n",
"2 USA 325719178 9833520 Washington, D.C. Washington, D.C. \n",
"3 Iceland 334252 102775 Reykjavik Reykjavik \n",
"\n",
" country population_y established \n",
"0 Denmark 775033 800 \n",
"1 Germany 3711930 1237 \n",
"2 USA 693972 1790 \n",
"3 Iceland 126100 874 "
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# data frames can be merged\n",
"# note that 'name' and 'population' are in both original data frames\n",
"M = pd.merge(countries, cities, left_on='capital', right_on='name')\n",
"M "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Renaming, dropping and adding columns"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" country_population \n",
" area \n",
" capital \n",
" country \n",
" capital_population \n",
" established \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" \n",
" \n",
" 1 \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" \n",
" \n",
" 2 \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" \n",
" \n",
" 3 \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country_population area capital country capital_population \\\n",
"0 5748769 42931 Copenhagen Denmark 775033 \n",
"1 82800000 357168 Berlin Germany 3711930 \n",
"2 325719178 9833520 Washington, D.C. USA 693972 \n",
"3 334252 102775 Reykjavik Iceland 126100 \n",
"\n",
" established \n",
"0 800 \n",
"1 1237 \n",
"2 1790 \n",
"3 874 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"M1 = M.rename(columns={\n",
" 'population_x': 'country_population',\n",
" 'population_y': 'capital_population'\n",
"})\n",
"M2 = M1.drop(columns=['name_x', 'name_y'])\n",
"M2"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" country_population \n",
" area \n",
" capital \n",
" country \n",
" capital_population \n",
" established \n",
" empty column \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" None \n",
" \n",
" \n",
" 1 \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" None \n",
" \n",
" \n",
" 2 \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" None \n",
" \n",
" \n",
" 3 \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" None \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country_population area capital country capital_population \\\n",
"0 5748769 42931 Copenhagen Denmark 775033 \n",
"1 82800000 357168 Berlin Germany 3711930 \n",
"2 325719178 9833520 Washington, D.C. USA 693972 \n",
"3 334252 102775 Reykjavik Iceland 126100 \n",
"\n",
" established empty column \n",
"0 800 None \n",
"1 1237 None \n",
"2 1790 None \n",
"3 874 None "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"M2['empty column'] = None # add new column to existing data frame\n",
"M2"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" country_population \n",
" area \n",
" capital \n",
" country \n",
" capital_population \n",
" established \n",
" empty column \n",
" %pop in capital \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" None \n",
" 0.134817 \n",
" \n",
" \n",
" 1 \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" None \n",
" 0.044830 \n",
" \n",
" \n",
" 2 \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" None \n",
" 0.002131 \n",
" \n",
" \n",
" 3 \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" None \n",
" 0.377260 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country_population area capital country capital_population \\\n",
"0 5748769 42931 Copenhagen Denmark 775033 \n",
"1 82800000 357168 Berlin Germany 3711930 \n",
"2 325719178 9833520 Washington, D.C. USA 693972 \n",
"3 334252 102775 Reykjavik Iceland 126100 \n",
"\n",
" established empty column %pop in capital \n",
"0 800 None 0.134817 \n",
"1 1237 None 0.044830 \n",
"2 1790 None 0.002131 \n",
"3 874 None 0.377260 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# add new column based on column computation\n",
"M2['%pop in capital'] = M2.capital_population / M2.country_population\n",
"M2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sorting rows"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" country_population \n",
" area \n",
" capital \n",
" country \n",
" capital_population \n",
" established \n",
" empty column \n",
" %pop in capital \n",
" \n",
" \n",
" \n",
" \n",
" 3 \n",
" 334252 \n",
" 102775 \n",
" Reykjavik \n",
" Iceland \n",
" 126100 \n",
" 874 \n",
" None \n",
" 0.377260 \n",
" \n",
" \n",
" 0 \n",
" 5748769 \n",
" 42931 \n",
" Copenhagen \n",
" Denmark \n",
" 775033 \n",
" 800 \n",
" None \n",
" 0.134817 \n",
" \n",
" \n",
" 1 \n",
" 82800000 \n",
" 357168 \n",
" Berlin \n",
" Germany \n",
" 3711930 \n",
" 1237 \n",
" None \n",
" 0.044830 \n",
" \n",
" \n",
" 2 \n",
" 325719178 \n",
" 9833520 \n",
" Washington, D.C. \n",
" USA \n",
" 693972 \n",
" 1790 \n",
" None \n",
" 0.002131 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" country_population area capital country capital_population \\\n",
"3 334252 102775 Reykjavik Iceland 126100 \n",
"0 5748769 42931 Copenhagen Denmark 775033 \n",
"1 82800000 357168 Berlin Germany 3711930 \n",
"2 325719178 9833520 Washington, D.C. USA 693972 \n",
"\n",
" established empty column %pop in capital \n",
"3 874 None 0.377260 \n",
"0 800 None 0.134817 \n",
"1 1237 None 0.044830 \n",
"2 1790 None 0.002131 "
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 'inplace' changes existing data frame without creating new data frame,\n",
"# otherwise a new data frame is created and returned\n",
"M2.sort_values('%pop in capital', ascending=False, inplace=True)\n",
"M2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas and Matplotlib integration"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('
');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '
');\n",
" var titletext = $(\n",
" '
');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('
');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $(' ');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $(' ');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('
');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $(' ');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $(' ');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $(' ');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $(' ');\n",
"\n",
" var fmt_picker = $(' ');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" ' ', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"
\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html(' ');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = ' ';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('
');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $(' ');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $(' ');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('
');\n",
" var button = $(' ');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib notebook\n",
"\n",
"cities.plot(kind='scatter', x='name', y='population', rot=15) # data frames have a .plot attribute"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## pandas_datareader and matplotlib integration"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\users\\au121\\appdata\\local\\programs\\python\\python38-32\\lib\\site-packages\\pandas_datareader\\compat\\__init__.py:7: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
" from pandas.util.testing import assert_frame_equal\n"
]
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('
');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '
');\n",
" var titletext = $(\n",
" '
');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('
');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $(' ');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $(' ');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('
');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $(' ');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $(' ');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $(' ');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $(' ');\n",
"\n",
" var fmt_picker = $(' ');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" ' ', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"
\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html(' ');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = ' ';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('
');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $(' ');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $(' ');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('
');\n",
" var button = $(' ');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas_datareader # module giving access to a lot of standard data sources, eg. World Bank\n",
"\n",
"#df = pandas_datareader.data.DataReader(['AAPL', 'GOOGL', 'MSFT', 'ZM'], 'stooq') # ignores start=...\n",
"\n",
"stocks = pandas_datareader.stooq.StooqDailyReader(['AAPL', 'GOOGL', 'MSFT', 'ZM'], start='2000-01-01').read()\n",
"stocks['Close'].plot()\n",
"plt.legend()\n",
"None # avoid print result of plt.legend() to terminal"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Hierarchical / Multi-level indexing (MultiIndex)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['name', 'population', 'area', 'capital'], dtype='object')"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.columns # a standard index"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RangeIndex(start=0, stop=4, step=1)"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"countries.index # standard row labels"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" Attributes \n",
" Close \n",
" High \n",
" Low \n",
" Open \n",
" Volume \n",
" \n",
" \n",
" Symbols \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" \n",
" \n",
" Date \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 2000-01-03 \n",
" 3.4698 \n",
" NaN \n",
" 42.148 \n",
" NaN \n",
" 3.4869 \n",
" NaN \n",
" 42.895 \n",
" NaN \n",
" 3.1522 \n",
" NaN \n",
" 40.495 \n",
" NaN \n",
" 3.2516 \n",
" NaN \n",
" 42.446 \n",
" NaN \n",
" 154312168.0 \n",
" NaN \n",
" 73600921.0 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-04 \n",
" 3.1771 \n",
" NaN \n",
" 40.730 \n",
" NaN \n",
" 3.4300 \n",
" NaN \n",
" 42.350 \n",
" NaN \n",
" 3.1374 \n",
" NaN \n",
" 40.592 \n",
" NaN \n",
" 3.3554 \n",
" NaN \n",
" 41.066 \n",
" NaN \n",
" 147567311.0 \n",
" NaN \n",
" 74832390.0 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-05 \n",
" 3.2242 \n",
" NaN \n",
" 41.157 \n",
" NaN \n",
" 3.4276 \n",
" NaN \n",
" 42.085 \n",
" NaN \n",
" 3.1932 \n",
" NaN \n",
" 39.549 \n",
" NaN \n",
" 3.2168 \n",
" NaN \n",
" 40.180 \n",
" NaN \n",
" 224160517.0 \n",
" NaN \n",
" 88577634.0 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-06 \n",
" 2.9452 \n",
" NaN \n",
" 39.779 \n",
" NaN \n",
" 3.3171 \n",
" NaN \n",
" 41.181 \n",
" NaN \n",
" 2.9452 \n",
" NaN \n",
" 39.190 \n",
" NaN \n",
" 3.2898 \n",
" NaN \n",
" 40.568 \n",
" NaN \n",
" 221180021.0 \n",
" NaN \n",
" 76018229.0 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-07 \n",
" 3.0853 \n",
" NaN \n",
" 40.296 \n",
" NaN \n",
" 3.1311 \n",
" NaN \n",
" 40.592 \n",
" NaN \n",
" 2.9614 \n",
" NaN \n",
" 38.802 \n",
" NaN \n",
" 2.9913 \n",
" NaN \n",
" 39.278 \n",
" NaN \n",
" 132693820.0 \n",
" NaN \n",
" 85748546.0 \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2020-04-27 \n",
" 283.1700 \n",
" 1270.86 \n",
" 174.050 \n",
" 164.60 \n",
" 284.5400 \n",
" 1294.10 \n",
" 176.900 \n",
" 167.85 \n",
" 279.9500 \n",
" 1265.06 \n",
" 173.300 \n",
" 155.0000 \n",
" 281.8000 \n",
" 1292.00 \n",
" 176.590 \n",
" 156.59 \n",
" 29271893.0 \n",
" 2209333.0 \n",
" 33194384.0 \n",
" 19783693.0 \n",
" \n",
" \n",
" 2020-04-28 \n",
" 278.5800 \n",
" 1232.59 \n",
" 169.810 \n",
" 156.72 \n",
" 285.8300 \n",
" 1284.76 \n",
" 175.670 \n",
" 166.00 \n",
" 278.2000 \n",
" 1230.38 \n",
" 169.390 \n",
" 155.2500 \n",
" 285.0800 \n",
" 1283.20 \n",
" 175.590 \n",
" 165.00 \n",
" 28001187.0 \n",
" 4035007.0 \n",
" 34392694.0 \n",
" 13477842.0 \n",
" \n",
" \n",
" 2020-04-29 \n",
" 287.7300 \n",
" 1342.18 \n",
" 177.430 \n",
" 146.48 \n",
" 289.6700 \n",
" 1360.15 \n",
" 177.680 \n",
" 151.00 \n",
" 283.8900 \n",
" 1326.73 \n",
" 171.880 \n",
" 143.3800 \n",
" 284.7300 \n",
" 1345.00 \n",
" 173.220 \n",
" 147.98 \n",
" 34320204.0 \n",
" 5417888.0 \n",
" 51286559.0 \n",
" 22033320.0 \n",
" \n",
" \n",
" 2020-04-30 \n",
" 293.8000 \n",
" 1346.70 \n",
" 179.210 \n",
" 135.17 \n",
" 294.5300 \n",
" 1350.00 \n",
" 180.400 \n",
" 143.80 \n",
" 288.3500 \n",
" 1321.50 \n",
" 176.230 \n",
" 133.6801 \n",
" 289.9600 \n",
" 1331.36 \n",
" 180.000 \n",
" 139.99 \n",
" 45765968.0 \n",
" 2792124.0 \n",
" 53875857.0 \n",
" 16682256.0 \n",
" \n",
" \n",
" 2020-05-01 \n",
" 289.0700 \n",
" 1317.32 \n",
" 174.570 \n",
" 138.56 \n",
" 299.0000 \n",
" 1351.43 \n",
" 178.640 \n",
" 141.63 \n",
" 285.8500 \n",
" 1309.66 \n",
" 174.010 \n",
" 132.6700 \n",
" 286.2500 \n",
" 1324.09 \n",
" 175.800 \n",
" 136.00 \n",
" 60154175.0 \n",
" 2443554.0 \n",
" 39370474.0 \n",
" 13806992.0 \n",
" \n",
" \n",
"
\n",
"
5115 rows × 20 columns
\n",
"
"
],
"text/plain": [
"Attributes Close High \\\n",
"Symbols AAPL GOOGL MSFT ZM AAPL GOOGL MSFT \n",
"Date \n",
"2000-01-03 3.4698 NaN 42.148 NaN 3.4869 NaN 42.895 \n",
"2000-01-04 3.1771 NaN 40.730 NaN 3.4300 NaN 42.350 \n",
"2000-01-05 3.2242 NaN 41.157 NaN 3.4276 NaN 42.085 \n",
"2000-01-06 2.9452 NaN 39.779 NaN 3.3171 NaN 41.181 \n",
"2000-01-07 3.0853 NaN 40.296 NaN 3.1311 NaN 40.592 \n",
"... ... ... ... ... ... ... ... \n",
"2020-04-27 283.1700 1270.86 174.050 164.60 284.5400 1294.10 176.900 \n",
"2020-04-28 278.5800 1232.59 169.810 156.72 285.8300 1284.76 175.670 \n",
"2020-04-29 287.7300 1342.18 177.430 146.48 289.6700 1360.15 177.680 \n",
"2020-04-30 293.8000 1346.70 179.210 135.17 294.5300 1350.00 180.400 \n",
"2020-05-01 289.0700 1317.32 174.570 138.56 299.0000 1351.43 178.640 \n",
"\n",
"Attributes Low Open \\\n",
"Symbols ZM AAPL GOOGL MSFT ZM AAPL GOOGL \n",
"Date \n",
"2000-01-03 NaN 3.1522 NaN 40.495 NaN 3.2516 NaN \n",
"2000-01-04 NaN 3.1374 NaN 40.592 NaN 3.3554 NaN \n",
"2000-01-05 NaN 3.1932 NaN 39.549 NaN 3.2168 NaN \n",
"2000-01-06 NaN 2.9452 NaN 39.190 NaN 3.2898 NaN \n",
"2000-01-07 NaN 2.9614 NaN 38.802 NaN 2.9913 NaN \n",
"... ... ... ... ... ... ... ... \n",
"2020-04-27 167.85 279.9500 1265.06 173.300 155.0000 281.8000 1292.00 \n",
"2020-04-28 166.00 278.2000 1230.38 169.390 155.2500 285.0800 1283.20 \n",
"2020-04-29 151.00 283.8900 1326.73 171.880 143.3800 284.7300 1345.00 \n",
"2020-04-30 143.80 288.3500 1321.50 176.230 133.6801 289.9600 1331.36 \n",
"2020-05-01 141.63 285.8500 1309.66 174.010 132.6700 286.2500 1324.09 \n",
"\n",
"Attributes Volume \n",
"Symbols MSFT ZM AAPL GOOGL MSFT ZM \n",
"Date \n",
"2000-01-03 42.446 NaN 154312168.0 NaN 73600921.0 NaN \n",
"2000-01-04 41.066 NaN 147567311.0 NaN 74832390.0 NaN \n",
"2000-01-05 40.180 NaN 224160517.0 NaN 88577634.0 NaN \n",
"2000-01-06 40.568 NaN 221180021.0 NaN 76018229.0 NaN \n",
"2000-01-07 39.278 NaN 132693820.0 NaN 85748546.0 NaN \n",
"... ... ... ... ... ... ... \n",
"2020-04-27 176.590 156.59 29271893.0 2209333.0 33194384.0 19783693.0 \n",
"2020-04-28 175.590 165.00 28001187.0 4035007.0 34392694.0 13477842.0 \n",
"2020-04-29 173.220 147.98 34320204.0 5417888.0 51286559.0 22033320.0 \n",
"2020-04-30 180.000 139.99 45765968.0 2792124.0 53875857.0 16682256.0 \n",
"2020-05-01 175.800 136.00 60154175.0 2443554.0 39370474.0 13806992.0 \n",
"\n",
"[5115 rows x 20 columns]"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks # notice hierarchical headings"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" Symbols \n",
" AAPL \n",
" GOOGL \n",
" MSFT \n",
" ZM \n",
" \n",
" \n",
" Date \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 2000-01-03 \n",
" 3.4698 \n",
" NaN \n",
" 42.148 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-04 \n",
" 3.1771 \n",
" NaN \n",
" 40.730 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-05 \n",
" 3.2242 \n",
" NaN \n",
" 41.157 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-06 \n",
" 2.9452 \n",
" NaN \n",
" 39.779 \n",
" NaN \n",
" \n",
" \n",
" 2000-01-07 \n",
" 3.0853 \n",
" NaN \n",
" 40.296 \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2020-04-27 \n",
" 283.1700 \n",
" 1270.86 \n",
" 174.050 \n",
" 164.60 \n",
" \n",
" \n",
" 2020-04-28 \n",
" 278.5800 \n",
" 1232.59 \n",
" 169.810 \n",
" 156.72 \n",
" \n",
" \n",
" 2020-04-29 \n",
" 287.7300 \n",
" 1342.18 \n",
" 177.430 \n",
" 146.48 \n",
" \n",
" \n",
" 2020-04-30 \n",
" 293.8000 \n",
" 1346.70 \n",
" 179.210 \n",
" 135.17 \n",
" \n",
" \n",
" 2020-05-01 \n",
" 289.0700 \n",
" 1317.32 \n",
" 174.570 \n",
" 138.56 \n",
" \n",
" \n",
"
\n",
"
5115 rows × 4 columns
\n",
"
"
],
"text/plain": [
"Symbols AAPL GOOGL MSFT ZM\n",
"Date \n",
"2000-01-03 3.4698 NaN 42.148 NaN\n",
"2000-01-04 3.1771 NaN 40.730 NaN\n",
"2000-01-05 3.2242 NaN 41.157 NaN\n",
"2000-01-06 2.9452 NaN 39.779 NaN\n",
"2000-01-07 3.0853 NaN 40.296 NaN\n",
"... ... ... ... ...\n",
"2020-04-27 283.1700 1270.86 174.050 164.60\n",
"2020-04-28 278.5800 1232.59 169.810 156.72\n",
"2020-04-29 287.7300 1342.18 177.430 146.48\n",
"2020-04-30 293.8000 1346.70 179.210 135.17\n",
"2020-05-01 289.0700 1317.32 174.570 138.56\n",
"\n",
"[5115 rows x 4 columns]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks.Close # one top level group of the columns"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Date\n",
"2000-01-03 NaN\n",
"2000-01-04 NaN\n",
"2000-01-05 NaN\n",
"2000-01-06 NaN\n",
"2000-01-07 NaN\n",
" ... \n",
"2020-04-27 1270.86\n",
"2020-04-28 1232.59\n",
"2020-04-29 1342.18\n",
"2020-04-30 1346.70\n",
"2020-05-01 1317.32\n",
"Name: GOOGL, Length: 5115, dtype: float64"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks.Close.GOOGL # selecting a single column"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Date\n",
"2000-01-03 NaN\n",
"2000-01-04 NaN\n",
"2000-01-05 NaN\n",
"2000-01-06 NaN\n",
"2000-01-07 NaN\n",
" ... \n",
"2020-04-27 1270.86\n",
"2020-04-28 1232.59\n",
"2020-04-29 1342.18\n",
"2020-04-30 1346.70\n",
"2020-05-01 1317.32\n",
"Name: GOOGL, Length: 5115, dtype: float64"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks['Close']['GOOGL'] # same as above"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"MultiIndex([( 'Close', 'AAPL'),\n",
" ( 'Close', 'GOOGL'),\n",
" ( 'Close', 'MSFT'),\n",
" ( 'Close', 'ZM'),\n",
" ( 'High', 'AAPL'),\n",
" ( 'High', 'GOOGL'),\n",
" ( 'High', 'MSFT'),\n",
" ( 'High', 'ZM'),\n",
" ( 'Low', 'AAPL'),\n",
" ( 'Low', 'GOOGL'),\n",
" ( 'Low', 'MSFT'),\n",
" ( 'Low', 'ZM'),\n",
" ( 'Open', 'AAPL'),\n",
" ( 'Open', 'GOOGL'),\n",
" ( 'Open', 'MSFT'),\n",
" ( 'Open', 'ZM'),\n",
" ('Volume', 'AAPL'),\n",
" ('Volume', 'GOOGL'),\n",
" ('Volume', 'MSFT'),\n",
" ('Volume', 'ZM')],\n",
" names=['Attributes', 'Symbols'])"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks.columns # has a MultiIndex"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06',\n",
" '2000-01-07', '2000-01-10', '2000-01-11', '2000-01-12',\n",
" '2000-01-13', '2000-01-14',\n",
" ...\n",
" '2020-04-20', '2020-04-21', '2020-04-22', '2020-04-23',\n",
" '2020-04-24', '2020-04-27', '2020-04-28', '2020-04-29',\n",
" '2020-04-30', '2020-05-01'],\n",
" dtype='datetime64[ns]', name='Date', length=5115, freq=None)"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stocks.index"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" Attributes \n",
" Close \n",
" High \n",
" Low \n",
" Open \n",
" Volume \n",
" \n",
" \n",
" Symbols \n",
" GOOGL \n",
" GOOGL \n",
" GOOGL \n",
" GOOGL \n",
" GOOGL \n",
" \n",
" \n",
" Date \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 2000-01-03 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2000-01-04 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2000-01-05 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2000-01-06 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2000-01-07 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2020-04-27 \n",
" 1270.86 \n",
" 1294.10 \n",
" 1265.06 \n",
" 1292.00 \n",
" 2209333.0 \n",
" \n",
" \n",
" 2020-04-28 \n",
" 1232.59 \n",
" 1284.76 \n",
" 1230.38 \n",
" 1283.20 \n",
" 4035007.0 \n",
" \n",
" \n",
" 2020-04-29 \n",
" 1342.18 \n",
" 1360.15 \n",
" 1326.73 \n",
" 1345.00 \n",
" 5417888.0 \n",
" \n",
" \n",
" 2020-04-30 \n",
" 1346.70 \n",
" 1350.00 \n",
" 1321.50 \n",
" 1331.36 \n",
" 2792124.0 \n",
" \n",
" \n",
" 2020-05-01 \n",
" 1317.32 \n",
" 1351.43 \n",
" 1309.66 \n",
" 1324.09 \n",
" 2443554.0 \n",
" \n",
" \n",
"
\n",
"
5115 rows × 5 columns
\n",
"
"
],
"text/plain": [
"Attributes Close High Low Open Volume\n",
"Symbols GOOGL GOOGL GOOGL GOOGL GOOGL\n",
"Date \n",
"2000-01-03 NaN NaN NaN NaN NaN\n",
"2000-01-04 NaN NaN NaN NaN NaN\n",
"2000-01-05 NaN NaN NaN NaN NaN\n",
"2000-01-06 NaN NaN NaN NaN NaN\n",
"2000-01-07 NaN NaN NaN NaN NaN\n",
"... ... ... ... ... ...\n",
"2020-04-27 1270.86 1294.10 1265.06 1292.00 2209333.0\n",
"2020-04-28 1232.59 1284.76 1230.38 1283.20 4035007.0\n",
"2020-04-29 1342.18 1360.15 1326.73 1345.00 5417888.0\n",
"2020-04-30 1346.70 1350.00 1321.50 1331.36 2792124.0\n",
"2020-05-01 1317.32 1351.43 1309.66 1324.09 2443554.0\n",
"\n",
"[5115 rows x 5 columns]"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# select all rows and columns with 1st level = all, 2nd level = 'GOOGLE'\n",
"stocks.loc[:, pd.IndexSlice[:,'GOOGL']] "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Creating your own multi index"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" one \n",
" two \n",
" \n",
" \n",
" \n",
" \n",
" a \n",
" b \n",
" a \n",
" b \n",
" c \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" x \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" y \n",
" 5 \n",
" 6 \n",
" 7 \n",
" 8 \n",
" 9 \n",
" \n",
" \n",
" B \n",
" x \n",
" 10 \n",
" 11 \n",
" 12 \n",
" 13 \n",
" 14 \n",
" \n",
" \n",
" y \n",
" 15 \n",
" 16 \n",
" 17 \n",
" 18 \n",
" 19 \n",
" \n",
" \n",
" C \n",
" x \n",
" 20 \n",
" 21 \n",
" 22 \n",
" 23 \n",
" 24 \n",
" \n",
" \n",
" y \n",
" 25 \n",
" 26 \n",
" 27 \n",
" 28 \n",
" 29 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two \n",
" a b a b c\n",
"A x 0 1 2 3 4\n",
" y 5 6 7 8 9\n",
"B x 10 11 12 13 14\n",
" y 15 16 17 18 19\n",
"C x 20 21 22 23 24\n",
" y 25 26 27 28 29"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"column_index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),\n",
" ('two', 'a'), ('two', 'b'), ('two', 'c')])\n",
"\n",
"row_index = pd.MultiIndex.from_tuples((x, y) for x in 'ABC' for y in 'xy')\n",
"\n",
"H = pd.DataFrame(np.arange(30).reshape(6, 5), columns=column_index, index=row_index)\n",
"H"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reorganizing hierarcical labels - stack and unstack"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" one \n",
" two \n",
" \n",
" \n",
" \n",
" \n",
" a \n",
" b \n",
" a \n",
" b \n",
" c \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" x \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" y \n",
" 5 \n",
" 6 \n",
" 7 \n",
" 8 \n",
" 9 \n",
" \n",
" \n",
" B \n",
" x \n",
" 10 \n",
" 11 \n",
" 12 \n",
" 13 \n",
" 14 \n",
" \n",
" \n",
" y \n",
" 15 \n",
" 16 \n",
" 17 \n",
" 18 \n",
" 19 \n",
" \n",
" \n",
" C \n",
" x \n",
" 20 \n",
" 21 \n",
" 22 \n",
" 23 \n",
" 24 \n",
" \n",
" \n",
" y \n",
" 25 \n",
" 26 \n",
" 27 \n",
" 28 \n",
" 29 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two \n",
" a b a b c\n",
"A x 0 1 2 3 4\n",
" y 5 6 7 8 9\n",
"B x 10 11 12 13 14\n",
" y 15 16 17 18 19\n",
"C x 20 21 22 23 24\n",
" y 25 26 27 28 29"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"H"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" a \n",
" b \n",
" c \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" x \n",
" one \n",
" 0 \n",
" 1 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 2 \n",
" 3 \n",
" 4.0 \n",
" \n",
" \n",
" y \n",
" one \n",
" 5 \n",
" 6 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 7 \n",
" 8 \n",
" 9.0 \n",
" \n",
" \n",
" B \n",
" x \n",
" one \n",
" 10 \n",
" 11 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 12 \n",
" 13 \n",
" 14.0 \n",
" \n",
" \n",
" y \n",
" one \n",
" 15 \n",
" 16 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 17 \n",
" 18 \n",
" 19.0 \n",
" \n",
" \n",
" C \n",
" x \n",
" one \n",
" 20 \n",
" 21 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 22 \n",
" 23 \n",
" 24.0 \n",
" \n",
" \n",
" y \n",
" one \n",
" 25 \n",
" 26 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" 27 \n",
" 28 \n",
" 29.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" a b c\n",
"A x one 0 1 NaN\n",
" two 2 3 4.0\n",
" y one 5 6 NaN\n",
" two 7 8 9.0\n",
"B x one 10 11 NaN\n",
" two 12 13 14.0\n",
" y one 15 16 NaN\n",
" two 17 18 19.0\n",
"C x one 20 21 NaN\n",
" two 22 23 24.0\n",
" y one 25 26 NaN\n",
" two 27 28 29.0"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"H.stack(level=0) # move one level of indexing from columns to last rows (missing columns filled with NaN)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" one \n",
" two \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" x \n",
" a \n",
" 0.0 \n",
" 2 \n",
" \n",
" \n",
" b \n",
" 1.0 \n",
" 3 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 4 \n",
" \n",
" \n",
" y \n",
" a \n",
" 5.0 \n",
" 7 \n",
" \n",
" \n",
" b \n",
" 6.0 \n",
" 8 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 9 \n",
" \n",
" \n",
" B \n",
" x \n",
" a \n",
" 10.0 \n",
" 12 \n",
" \n",
" \n",
" b \n",
" 11.0 \n",
" 13 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 14 \n",
" \n",
" \n",
" y \n",
" a \n",
" 15.0 \n",
" 17 \n",
" \n",
" \n",
" b \n",
" 16.0 \n",
" 18 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 19 \n",
" \n",
" \n",
" C \n",
" x \n",
" a \n",
" 20.0 \n",
" 22 \n",
" \n",
" \n",
" b \n",
" 21.0 \n",
" 23 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 24 \n",
" \n",
" \n",
" y \n",
" a \n",
" 25.0 \n",
" 27 \n",
" \n",
" \n",
" b \n",
" 26.0 \n",
" 28 \n",
" \n",
" \n",
" c \n",
" NaN \n",
" 29 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two\n",
"A x a 0.0 2\n",
" b 1.0 3\n",
" c NaN 4\n",
" y a 5.0 7\n",
" b 6.0 8\n",
" c NaN 9\n",
"B x a 10.0 12\n",
" b 11.0 13\n",
" c NaN 14\n",
" y a 15.0 17\n",
" b 16.0 18\n",
" c NaN 19\n",
"C x a 20.0 22\n",
" b 21.0 23\n",
" c NaN 24\n",
" y a 25.0 27\n",
" b 26.0 28\n",
" c NaN 29"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"H.stack(level=1)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" one \n",
" two \n",
" \n",
" \n",
" \n",
" a \n",
" b \n",
" a \n",
" b \n",
" c \n",
" \n",
" \n",
" \n",
" A \n",
" B \n",
" C \n",
" A \n",
" B \n",
" C \n",
" A \n",
" B \n",
" C \n",
" A \n",
" B \n",
" C \n",
" A \n",
" B \n",
" C \n",
" \n",
" \n",
" \n",
" \n",
" x \n",
" 0 \n",
" 10 \n",
" 20 \n",
" 1 \n",
" 11 \n",
" 21 \n",
" 2 \n",
" 12 \n",
" 22 \n",
" 3 \n",
" 13 \n",
" 23 \n",
" 4 \n",
" 14 \n",
" 24 \n",
" \n",
" \n",
" y \n",
" 5 \n",
" 15 \n",
" 25 \n",
" 6 \n",
" 16 \n",
" 26 \n",
" 7 \n",
" 17 \n",
" 27 \n",
" 8 \n",
" 18 \n",
" 28 \n",
" 9 \n",
" 19 \n",
" 29 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two \n",
" a b a b c \n",
" A B C A B C A B C A B C A B C\n",
"x 0 10 20 1 11 21 2 12 22 3 13 23 4 14 24\n",
"y 5 15 25 6 16 26 7 17 27 8 18 28 9 19 29"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"H.unstack(level=0) # and unstack moves row level to column last level"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## And there are much more ... see the Pandas documentation"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}