{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data - an introduction to the world of Pandas\n", "\n", "**Note:** This is an edited version of [Cliburn Chan's](http://people.duke.edu/~ccc14/sta-663-2017/07_Data.html) original tutorial, as part of his Stat-663 course at Duke. All changes remain licensed as the original, under the terms of the MIT license.\n", "\n", "Additionally, sections have been merged from [Chris Fonnesbeck's Pandas tutorial from the NGCM Summer Academy](https://github.com/fonnesbeck/ngcm_pandas_2017/blob/master/notebooks/1.%20Introduction%20to%20NumPy%20and%20Pandas.ipynb), which are licensed under [CC0 terms](https://creativecommons.org/share-your-work/public-domain/cc0) (aka 'public domain')." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Resources\n", "\n", "- [The Introduction to Pandas chapter](http://proquest.safaribooksonline.com/9781491957653/pandas_html) in the Python for Data Analysis book by Wes McKinney is essential reading for this topic. This is the [companion notebook](https://github.com/wesm/pydata-book/blob/2nd-edition/ch05.ipynb) for that chapter.\n", "- [Pandas documentation](http://pandas.pydata.org/pandas-docs/stable/)\n", "- [QGrid](https://github.com/quantopian/qgrid)\n", "\n", "\n", "## Pandas\n", "\n", "**pandas** is a Python package providing fast, flexible, and expressive data structures designed to work with *relational* or *labeled* data both. It is a fundamental high-level building block for doing practical, real world data analysis in Python. \n", "\n", "pandas is well suited for:\n", "\n", "- **Tabular** data with heterogeneously-typed columns, as you might find in an SQL table or Excel spreadsheet\n", "- Ordered and unordered (not necessarily fixed-frequency) **time series** data.\n", "- Arbitrary **matrix** data with row and column labels\n", "\n", "Virtually any statistical dataset, labeled or unlabeled, can be converted to a pandas data structure for cleaning, transformation, and analysis.\n", "\n", "\n", "### Key features\n", " \n", "- Easy handling of **missing data**\n", "- **Size mutability**: columns can be inserted and deleted from DataFrame and higher dimensional objects\n", "- Automatic and explicit **data alignment**: objects can be explicitly aligned to a set of labels, or the data can be aligned automatically\n", "- Powerful, flexible **group by functionality** to perform split-apply-combine operations on data sets\n", "- Intelligent label-based **slicing, fancy indexing, and subsetting** of large data sets\n", "- Intuitive **merging and joining** data sets\n", "- Flexible **reshaping and pivoting** of data sets\n", "- **Hierarchical labeling** of axes\n", "- Robust **IO tools** for loading data from flat files, Excel files, databases, and HDF5\n", "- **Time series functionality**: date range generation and frequency conversion, moving window statistics, moving window linear regressions, date shifting and lagging, etc." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "from pandas import Series, DataFrame" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "plt.style.use('seaborn-dark')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Working with Series\n", "\n", "* A pandas Series is a generationalization of 1d numpy array\n", "* A series has an *index* that labels each element in the vector.\n", "* A `Series` can be thought of as an ordered key-value store." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([5, 6, 7, 8, 9])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(range(5,10))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "x = Series(range(5,10))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "0 5\n", "1 6\n", "2 7\n", "3 8\n", "4 9\n", "dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### We can treat Series objects much like numpy vectors" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(35, 7.0, 1.5811388300841898)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x.sum(), x.mean(), x.std()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 25\n", "1 36\n", "2 49\n", "3 64\n", "4 81\n", "dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x**2" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3 8\n", "4 9\n", "dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[x >= 8]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Series can also contain more information than numpy vectors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### You can always use standard positional indexing" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 6\n", "2 7\n", "3 8\n", "dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[1:4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Series index\n", "\n", "But you can also assign labeled indexes." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 5\n", "b 6\n", "c 7\n", "d 8\n", "e 9\n", "dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x.index = list('abcde')\n", "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Note that with labels, the end index is included" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "b 6\n", "c 7\n", "d 8\n", "dtype: int64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x['b':'d']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Even when you have a labeled index, positional arguments still work" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "b 6\n", "c 7\n", "d 8\n", "dtype: int64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[1:4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Working with missing data\n", "\n", "Missing data is indicated with NaN (not a number)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 10.0\n", "1 NaN\n", "2 NaN\n", "3 13.0\n", "4 14.0\n", "dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = Series([10, np.nan, np.nan, 13, 14])\n", "y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Concatenating two series" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 5.0\n", "b 6.0\n", "c 7.0\n", "d 8.0\n", "e 9.0\n", "0 10.0\n", "1 NaN\n", "2 NaN\n", "3 13.0\n", "4 14.0\n", "dtype: float64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = pd.concat([x, y])\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Reset index to default" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "6 NaN\n", "7 NaN\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = z.reset_index(drop=True)\n", "z" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 25.0\n", "1 36.0\n", "2 49.0\n", "3 64.0\n", "4 81.0\n", "5 100.0\n", "6 NaN\n", "7 NaN\n", "8 169.0\n", "9 196.0\n", "dtype: float64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `pandas` aggregate functions ignore missing data" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(72.0, 9.0, 3.2071349029490928)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.sum(), z.mean(), z.std()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Selecting missing values" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6 NaN\n", "7 NaN\n", "dtype: float64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[z.isnull()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Selecting non-missing values" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[z.notnull()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Replacement of missing values" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "6 0.0\n", "7 0.0\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.fillna(0)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "6 10.0\n", "7 10.0\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.fillna(method='ffill')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "6 13.0\n", "7 13.0\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.fillna(method='bfill')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.0\n", "1 6.0\n", "2 7.0\n", "3 8.0\n", "4 9.0\n", "5 10.0\n", "6 9.0\n", "7 9.0\n", "8 13.0\n", "9 14.0\n", "dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.fillna(z.mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Working with dates / times\n", "\n", "We will see more date/time handling in the DataFrame section." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "z.index = pd.date_range('01-Jan-2016', periods=len(z))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-01-01 5.0\n", "2016-01-02 6.0\n", "2016-01-03 7.0\n", "2016-01-04 8.0\n", "2016-01-05 9.0\n", "2016-01-06 10.0\n", "2016-01-07 NaN\n", "2016-01-08 NaN\n", "2016-01-09 13.0\n", "2016-01-10 14.0\n", "Freq: D, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Intelligent aggregation over datetime ranges" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-01-03 18.0\n", "2016-01-10 54.0\n", "Freq: W-SUN, dtype: float64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z.resample('W').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Formatting datetime objects (see http://strftime.org)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Jan 01, 2016', 'Jan 02, 2016', 'Jan 03, 2016', 'Jan 04, 2016',\n", " 'Jan 05, 2016', 'Jan 06, 2016', 'Jan 07, 2016', 'Jan 08, 2016',\n", " 'Jan 09, 2016', 'Jan 10, 2016'],\n", " dtype='\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
\n", "" ], "text/plain": [ " survived pclass sex age sibsp parch fare embarked class \\\n", "0 0 3 male 22.0 1 0 7.2500 S Third \n", "1 1 1 female 38.0 1 0 71.2833 C First \n", "2 1 3 female 26.0 0 0 7.9250 S Third \n", "3 1 1 female 35.0 1 0 53.1000 S First \n", "4 0 3 male 35.0 0 0 8.0500 S Third \n", "\n", " who adult_male deck embark_town alive alone \n", "0 man True NaN Southampton no False \n", "1 woman False C Cherbourg yes False \n", "2 woman False NaN Southampton yes True \n", "3 woman False C Southampton yes False \n", "4 man True NaN Southampton no True " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv'\n", "titanic = pd.read_csv(url)\n", "titanic.head()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(891, 15)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.shape" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13365" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.size" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare',\n", " 'embarked', 'class', 'who', 'adult_male', 'deck', 'embark_town',\n", " 'alive', 'alone'],\n", " dtype='object')" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.columns" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# For display purposes, we will drop some columns\n", "titanic = titanic[['survived', 'sex', 'age', 'fare',\n", " 'embarked', 'class', 'who', 'deck', 'embark_town',]]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "survived int64\n", "sex object\n", "age float64\n", "fare float64\n", "embarked object\n", "class object\n", "who object\n", "deck object\n", "embark_town object\n", "dtype: object" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summarizing a data frame" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedagefare
count891.000000714.000000891.000000
mean0.38383829.69911832.204208
std0.48659214.52649749.693429
min0.0000000.4200000.000000
25%0.00000020.1250007.910400
50%0.00000028.00000014.454200
75%1.00000038.00000031.000000
max1.00000080.000000512.329200
\n", "
" ], "text/plain": [ " survived age fare\n", "count 891.000000 714.000000 891.000000\n", "mean 0.383838 29.699118 32.204208\n", "std 0.486592 14.526497 49.693429\n", "min 0.000000 0.420000 0.000000\n", "25% 0.000000 20.125000 7.910400\n", "50% 0.000000 28.000000 14.454200\n", "75% 1.000000 38.000000 31.000000\n", "max 1.000000 80.000000 512.329200" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.describe()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_town
00male22.07.2500SThirdmanNaNSouthampton
11female38.071.2833CFirstwomanCCherbourg
21female26.07.9250SThirdwomanNaNSouthampton
31female35.053.1000SFirstwomanCSouthampton
40male35.08.0500SThirdmanNaNSouthampton
50maleNaN8.4583QThirdmanNaNQueenstown
60male54.051.8625SFirstmanESouthampton
70male2.021.0750SThirdchildNaNSouthampton
81female27.011.1333SThirdwomanNaNSouthampton
91female14.030.0708CSecondchildNaNCherbourg
101female4.016.7000SThirdchildGSouthampton
111female58.026.5500SFirstwomanCSouthampton
120male20.08.0500SThirdmanNaNSouthampton
130male39.031.2750SThirdmanNaNSouthampton
140female14.07.8542SThirdchildNaNSouthampton
151female55.016.0000SSecondwomanNaNSouthampton
160male2.029.1250QThirdchildNaNQueenstown
171maleNaN13.0000SSecondmanNaNSouthampton
180female31.018.0000SThirdwomanNaNSouthampton
191femaleNaN7.2250CThirdwomanNaNCherbourg
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton\n", "1 1 female 38.0 71.2833 C First woman C Cherbourg\n", "2 1 female 26.0 7.9250 S Third woman NaN Southampton\n", "3 1 female 35.0 53.1000 S First woman C Southampton\n", "4 0 male 35.0 8.0500 S Third man NaN Southampton\n", "5 0 male NaN 8.4583 Q Third man NaN Queenstown\n", "6 0 male 54.0 51.8625 S First man E Southampton\n", "7 0 male 2.0 21.0750 S Third child NaN Southampton\n", "8 1 female 27.0 11.1333 S Third woman NaN Southampton\n", "9 1 female 14.0 30.0708 C Second child NaN Cherbourg\n", "10 1 female 4.0 16.7000 S Third child G Southampton\n", "11 1 female 58.0 26.5500 S First woman C Southampton\n", "12 0 male 20.0 8.0500 S Third man NaN Southampton\n", "13 0 male 39.0 31.2750 S Third man NaN Southampton\n", "14 0 female 14.0 7.8542 S Third child NaN Southampton\n", "15 1 female 55.0 16.0000 S Second woman NaN Southampton\n", "16 0 male 2.0 29.1250 Q Third child NaN Queenstown\n", "17 1 male NaN 13.0000 S Second man NaN Southampton\n", "18 0 female 31.0 18.0000 S Third woman NaN Southampton\n", "19 1 female NaN 7.2250 C Third woman NaN Cherbourg" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.head(20)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_town
8860male27.013.00SSecondmanNaNSouthampton
8871female19.030.00SFirstwomanBSouthampton
8880femaleNaN23.45SThirdwomanNaNSouthampton
8891male26.030.00CFirstmanCCherbourg
8900male32.07.75QThirdmanNaNQueenstown
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town\n", "886 0 male 27.0 13.00 S Second man NaN Southampton\n", "887 1 female 19.0 30.00 S First woman B Southampton\n", "888 0 female NaN 23.45 S Third woman NaN Southampton\n", "889 1 male 26.0 30.00 C First man C Cherbourg\n", "890 0 male 32.0 7.75 Q Third man NaN Queenstown" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.tail(5)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['survived', 'sex', 'age', 'fare', 'embarked', 'class', 'who', 'deck',\n", " 'embark_town'],\n", " dtype='object')" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.columns" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=891, step=1)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Indexing\n", "\n", "The default indexing mode for dataframes with `df[X]` is to access the DataFrame's *columns*:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sexageclass
0male22.0Third
1female38.0First
2female26.0Third
3female35.0First
4male35.0Third
\n", "
" ], "text/plain": [ " sex age class\n", "0 male 22.0 Third\n", "1 female 38.0 First\n", "2 female 26.0 Third\n", "3 female 35.0 First\n", "4 male 35.0 Third" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic[['sex', 'age', 'class']].head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Using the `iloc` helper for indexing" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_town
00male22.07.2500SThirdmanNaNSouthampton
11female38.071.2833CFirstwomanCCherbourg
21female26.07.9250SThirdwomanNaNSouthampton
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton\n", "1 1 female 38.0 71.2833 C First woman C Cherbourg\n", "2 1 female 26.0 7.9250 S Third woman NaN Southampton" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.head(3)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "survived 0\n", "sex male\n", "age 22\n", "fare 7.25\n", "embarked S\n", "class Third\n", "who man\n", "deck NaN\n", "embark_town Southampton\n", "Name: 0, dtype: object" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc[0]" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_town
00male22.07.2500SThirdmanNaNSouthampton
11female38.071.2833CFirstwomanCCherbourg
21female26.07.9250SThirdwomanNaNSouthampton
31female35.053.1000SFirstwomanCSouthampton
40male35.08.0500SThirdmanNaNSouthampton
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton\n", "1 1 female 38.0 71.2833 C First woman C Cherbourg\n", "2 1 female 26.0 7.9250 S Third woman NaN Southampton\n", "3 1 female 35.0 53.1000 S First woman C Southampton\n", "4 0 male 35.0 8.0500 S Third man NaN Southampton" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc[0:5]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_town
00male22.07.2500SThirdmanNaNSouthampton
101female4.016.7000SThirdchildGSouthampton
11female38.071.2833CFirstwomanCCherbourg
50maleNaN8.4583QThirdmanNaNQueenstown
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton\n", "10 1 female 4.0 16.7000 S Third child G Southampton\n", "1 1 female 38.0 71.2833 C First woman C Cherbourg\n", "5 0 male NaN 8.4583 Q Third man NaN Queenstown" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc[ [0, 10, 1, 5] ]" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10 4.0\n", "11 58.0\n", "12 20.0\n", "13 39.0\n", "14 14.0\n", "Name: age, dtype: float64" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc[10:15]['age']" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age
104.0
1158.0
1220.0
1339.0
1414.0
\n", "
" ], "text/plain": [ " age\n", "10 4.0\n", "11 58.0\n", "12 20.0\n", "13 39.0\n", "14 14.0" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.iloc[10:15][ ['age'] ]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m titanic[titanic. < 2]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "titanic[titanic. < 2]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "titanic[\"new column\"] = 0" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 0\n", "2 0\n", "3 0\n", "4 0\n", "5 0\n", "6 0\n", "7 0\n", "8 0\n", "9 0\n", "Name: new column, dtype: int64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic[\"new column\"][:10]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([78, 164, 172, 183, 305, 381, 386, 469, 644, 755, 788, 803, 827,\n", " 831],\n", " dtype='int64')" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic[titanic.age < 2].index" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameage
id
123Alice20
989Bob30
\n", "
" ], "text/plain": [ " name age\n", "id \n", "123 Alice 20\n", "989 Bob 30" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(dict(name=['Alice', 'Bob'], age=[20, 30]), \n", " columns = ['name', 'age'], # enforce column order\n", " index=pd.Series([123, 989], name='id'))\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `.iloc` vs `.loc`\n", "\n", "These are two accessors with a key difference:\n", "\n", "* `.iloc` indexes *positionally*\n", "* `.loc` indexes *by label*" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name Alice\n", "age 20\n", "Name: 123, dtype: object" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#df[0] # error\n", "#df[123] # error\n", "df.iloc[0]" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name Alice\n", "age 20\n", "Name: 123, dtype: object" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[123]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameage
id
123Alice20
\n", "
" ], "text/plain": [ " name age\n", "id \n", "123 Alice 20" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[ [123] ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Sorting and ordering data" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNaNSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
21female26.07.9250SThirdwomanNaNSouthampton0
31female35.053.1000SFirstwomanCSouthampton0
40male35.08.0500SThirdmanNaNSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "2 1 female 26.0 7.9250 S Third woman NaN Southampton \n", "3 1 female 35.0 53.1000 S First woman C Southampton \n", "4 0 male 35.0 8.0500 S Third man NaN Southampton \n", "\n", " new column \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `sort_index` method is designed to sort a DataFrame by either its index or its columns:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
8900male32.07.75QThirdmanNaNQueenstown0
8891male26.030.00CFirstmanCCherbourg0
8880femaleNaN23.45SThirdwomanNaNSouthampton0
8871female19.030.00SFirstwomanBSouthampton0
8860male27.013.00SSecondmanNaNSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "890 0 male 32.0 7.75 Q Third man NaN Queenstown \n", "889 1 male 26.0 30.00 C First man C Cherbourg \n", "888 0 female NaN 23.45 S Third woman NaN Southampton \n", "887 1 female 19.0 30.00 S First woman B Southampton \n", "886 0 male 27.0 13.00 S Second man NaN Southampton \n", "\n", " new column \n", "890 0 \n", "889 0 \n", "888 0 \n", "887 0 \n", "886 0 " ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.sort_index(ascending=False).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the Titanic index is already sorted, it's easier to illustrate how to use it for the index with a small test DF:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A
1001
292
2343
14
1505
\n", "
" ], "text/plain": [ " A\n", "100 1\n", "29 2\n", "234 3\n", "1 4\n", "150 5" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame([1, 2, 3, 4, 5], index=[100, 29, 234, 1, 150], columns=['A'])\n", "df" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A
14
292
1001
1505
2343
\n", "
" ], "text/plain": [ " A\n", "1 4\n", "29 2\n", "100 1\n", "150 5\n", "234 3" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index() # same as df.sort_index('index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas also makes it easy to sort on the *values* of the DF:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
8031male0.428.5167CThirdchildNaNCherbourg0
7551male0.6714.5000SSecondchildNaNSouthampton0
6441female0.7519.2583CThirdchildNaNCherbourg0
4691female0.7519.2583CThirdchildNaNCherbourg0
781male0.8329.0000SSecondchildNaNSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck \\\n", "803 1 male 0.42 8.5167 C Third child NaN \n", "755 1 male 0.67 14.5000 S Second child NaN \n", "644 1 female 0.75 19.2583 C Third child NaN \n", "469 1 female 0.75 19.2583 C Third child NaN \n", "78 1 male 0.83 29.0000 S Second child NaN \n", "\n", " embark_town new column \n", "803 Cherbourg 0 \n", "755 Southampton 0 \n", "644 Cherbourg 0 \n", "469 Cherbourg 0 \n", "78 Southampton 0 " ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.sort_values('age', ascending=True).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can sort on more than one column in a single call:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
1640male1.039.6875SThirdchildNaNSouthampton0
3860male1.046.9000SThirdchildNaNSouthampton0
70male2.021.0750SThirdchildNaNSouthampton0
160male2.029.1250QThirdchildNaNQueenstown0
1190female2.031.2750SThirdchildNaNSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "164 0 male 1.0 39.6875 S Third child NaN Southampton \n", "386 0 male 1.0 46.9000 S Third child NaN Southampton \n", "7 0 male 2.0 21.0750 S Third child NaN Southampton \n", "16 0 male 2.0 29.1250 Q Third child NaN Queenstown \n", "119 0 female 2.0 31.2750 S Third child NaN Southampton \n", "\n", " new column \n", "164 0 \n", "386 0 \n", "7 0 \n", "16 0 \n", "119 0 " ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.sort_values(['survived', 'age'], ascending=[True, True]).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note:* both the index and the columns can be named:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
id
8510male74.07.7750SThirdmanNaNSouthampton0
960male71.034.6542CFirstmanACherbourg0
4930male71.049.5042CFirstmanNaNCherbourg0
1160male70.57.7500QThirdmanNaNQueenstown0
6720male70.010.5000SSecondmanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "id \n", "851 0 male 74.0 7.7750 S Third man NaN \n", "96 0 male 71.0 34.6542 C First man A \n", "493 0 male 71.0 49.5042 C First man NaN \n", "116 0 male 70.5 7.7500 Q Third man NaN \n", "672 0 male 70.0 10.5000 S Second man NaN \n", "\n", "attributes embark_town new column \n", "id \n", "851 Southampton 0 \n", "96 Cherbourg 0 \n", "493 Cherbourg 0 \n", "116 Queenstown 0 \n", "672 Southampton 0 " ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = titanic.sort_values(['survived', 'age'], ascending=[True, False])\n", "t.index.name = 'id'\n", "t.columns.name = 'attributes'\n", "t.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Grouping data" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "sex_class = titanic.groupby(['sex', 'class'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is a GroubBy object?" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name: ('female', 'First') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
11female38.071.2833CFirstwomanCCherbourg0
31female35.053.1000SFirstwomanCSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "1 1 female 38.0 71.2833 C First woman C \n", "3 1 female 35.0 53.1000 S First woman C \n", "\n", "attributes embark_town new column \n", "1 Cherbourg 0 \n", "3 Southampton 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "name: ('female', 'Second') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
91female14.030.0708CSecondchildNaNCherbourg0
151female55.016.0000SSecondwomanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "9 1 female 14.0 30.0708 C Second child NaN \n", "15 1 female 55.0 16.0000 S Second woman NaN \n", "\n", "attributes embark_town new column \n", "9 Cherbourg 0 \n", "15 Southampton 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "name: ('female', 'Third') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
21female26.07.9250SThirdwomanNaNSouthampton0
81female27.011.1333SThirdwomanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "2 1 female 26.0 7.9250 S Third woman NaN \n", "8 1 female 27.0 11.1333 S Third woman NaN \n", "\n", "attributes embark_town new column \n", "2 Southampton 0 \n", "8 Southampton 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "name: ('male', 'First') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
60male54.051.8625SFirstmanESouthampton0
231male28.035.5000SFirstmanASouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "6 0 male 54.0 51.8625 S First man E \n", "23 1 male 28.0 35.5000 S First man A \n", "\n", "attributes embark_town new column \n", "6 Southampton 0 \n", "23 Southampton 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "name: ('male', 'Second') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
171maleNaN13.0SSecondmanNaNSouthampton0
200male35.026.0SSecondmanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "17 1 male NaN 13.0 S Second man NaN \n", "20 0 male 35.0 26.0 S Second man NaN \n", "\n", "attributes embark_town new column \n", "17 Southampton 0 \n", "20 Southampton 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "name: ('male', 'Third') \n", "group:\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.25SThirdmanNaNSouthampton0
40male35.08.05SThirdmanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.25 S Third man NaN Southampton \n", "4 0 male 35.0 8.05 S Third man NaN Southampton \n", "\n", "attributes new column \n", "0 0 \n", "4 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display\n", "\n", "for name, group in sex_class:\n", " print('name:', name, '\\ngroup:\\n')\n", " display(group.head(2))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodeckembark_townnew column
91female14.030.0708CSecondchildNaNCherbourg0
151female55.016.0000SSecondwomanNaNSouthampton0
410female27.021.0000SSecondwomanNaNSouthampton0
431female3.041.5792CSecondchildNaNCherbourg0
531female29.026.0000SSecondwomanNaNSouthampton0
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck \\\n", "9 1 female 14.0 30.0708 C Second child NaN \n", "15 1 female 55.0 16.0000 S Second woman NaN \n", "41 0 female 27.0 21.0000 S Second woman NaN \n", "43 1 female 3.0 41.5792 C Second child NaN \n", "53 1 female 29.0 26.0000 S Second woman NaN \n", "\n", "attributes embark_town new column \n", "9 Cherbourg 0 \n", "15 Southampton 0 \n", "41 Southampton 0 \n", "43 Cherbourg 0 \n", "53 Southampton 0 " ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class.get_group(('female', 'Second')).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The GroubBy object has a number of aggregation methods that will then compute summary statistics over the group members, e.g.:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedagefareembarkedwhodeckembark_townnew column
sexclass
femaleFirst9485949294819294
Second7674767676107676
Third1441021441441446144144
maleFirst12210112212212294122122
Second108991081081086108108
Third3472533473473476347347
\n", "
" ], "text/plain": [ "attributes survived age fare embarked who deck embark_town \\\n", "sex class \n", "female First 94 85 94 92 94 81 92 \n", " Second 76 74 76 76 76 10 76 \n", " Third 144 102 144 144 144 6 144 \n", "male First 122 101 122 122 122 94 122 \n", " Second 108 99 108 108 108 6 108 \n", " Third 347 253 347 347 347 6 347 \n", "\n", "attributes new column \n", "sex class \n", "female First 94 \n", " Second 76 \n", " Third 144 \n", "male First 122 \n", " Second 108 \n", " Third 347 " ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Why Kate Winslett survived and Leonardo DiCaprio didn't" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvived
sexclass
femaleFirst0.968085
Second0.921053
Third0.500000
maleFirst0.368852
Second0.157407
Third0.135447
\n", "
" ], "text/plain": [ "attributes survived\n", "sex class \n", "female First 0.968085\n", " Second 0.921053\n", " Third 0.500000\n", "male First 0.368852\n", " Second 0.157407\n", " Third 0.135447" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class.mean()[['survived']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Of the females who were in first class, count the number from each embarking town" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributessurvivedsexagefareembarkedclasswhodecknew column
embark_town
Cherbourg434338434343433543
Queenstown111111111
Southampton484844484848484348
\n", "
" ], "text/plain": [ "attributes survived sex age fare embarked class who deck new column\n", "embark_town \n", "Cherbourg 43 43 38 43 43 43 43 35 43\n", "Queenstown 1 1 1 1 1 1 1 1 1\n", "Southampton 48 48 44 48 48 48 48 43 48" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class.get_group(('female', 'First')).groupby('embark_town').count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since `count` counts non-missing data, we're really interested in the maximum value for each row, which we can obtain directly:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "embark_town\n", "Cherbourg 43\n", "Queenstown 1\n", "Southampton 48\n", "dtype: int64" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sex_class.get_group(('female', 'First')).groupby('embark_town').count().max('columns')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Cross-tabulation" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
classFirstSecondThird
survived
08097372
113687119
\n", "
" ], "text/plain": [ "class First Second Third\n", "survived \n", "0 80 97 372\n", "1 136 87 119" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.crosstab(titanic.survived, titanic['class'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### We can also get multiple summaries at the same time\n", "\n", "The `agg` method is the most flexible, as it allows us to specify directly which functions we want to call, and where:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "def my_func(x):\n", " return np.max(x)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
embarkedagesurvived
countmeanmedianmy_funcsum
embark_town
Cherbourg4336.05263237.060.042
Queenstown133.00000033.033.01
Southampton4832.70454533.063.046
\n", "
" ], "text/plain": [ " embarked age survived\n", " count mean median my_func sum\n", "embark_town \n", "Cherbourg 43 36.052632 37.0 60.0 42\n", "Queenstown 1 33.000000 33.0 33.0 1\n", "Southampton 48 32.704545 33.0 63.0 46" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mapped_funcs = {'embarked': 'count', \n", " 'age': ('mean', 'median', my_func), \n", " 'survived': sum}\n", "\n", "sex_class.get_group(('female', 'First')).groupby('embark_town').agg(mapped_funcs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making plots with `pandas`\n", "\n", "Note: you may need to run\n", "\n", "```\n", "pip install pandas-datareader\n", "```\n", "\n", "to install the specialized readers." ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "from pandas_datareader import data as web\n", "import datetime" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "try:\n", " apple = pd.read_csv('data/apple.csv', index_col=0, parse_dates=True)\n", "except:\n", " apple = web.DataReader('AAPL', 'yahoo', \n", " start = datetime.datetime(2015, 1, 1),\n", " end = datetime.datetime(2015, 12, 31))\n", " # Let's save this data to a CSV file so we don't need to re-download it on every run:\n", " apple.to_csv('data/apple.csv')" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseAdj CloseVolume
Date
2015-01-02111.389999111.440002107.349998109.330002103.86647053204600
2015-01-05108.290001108.650002105.410004106.250000100.94039264285500
2015-01-06106.540001107.430000104.629997106.260002100.94989065797100
2015-01-07107.199997108.199997106.699997107.750000102.36544040105900
2015-01-08109.230003112.150002108.699997111.889999106.29853159364500
\n", "
" ], "text/plain": [ " Open High Low Close Adj Close \\\n", "Date \n", "2015-01-02 111.389999 111.440002 107.349998 109.330002 103.866470 \n", "2015-01-05 108.290001 108.650002 105.410004 106.250000 100.940392 \n", "2015-01-06 106.540001 107.430000 104.629997 106.260002 100.949890 \n", "2015-01-07 107.199997 108.199997 106.699997 107.750000 102.365440 \n", "2015-01-08 109.230003 112.150002 108.699997 111.889999 106.298531 \n", "\n", " Volume \n", "Date \n", "2015-01-02 53204600 \n", "2015-01-05 64285500 \n", "2015-01-06 65797100 \n", "2015-01-07 40105900 \n", "2015-01-08 59364500 " ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apple.head()" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseAdj CloseVolume
Date
2015-12-24109.000000109.000000107.949997108.029999104.38011213570400
2015-12-28107.589996107.690002106.180000106.820000103.21099926704200
2015-12-29106.959999109.430000106.860001108.739998105.06611630931200
2015-12-30108.580002108.699997107.180000107.320000103.69410725213800
2015-12-31107.010002107.029999104.820000105.260002101.70369740635300
\n", "
" ], "text/plain": [ " Open High Low Close Adj Close \\\n", "Date \n", "2015-12-24 109.000000 109.000000 107.949997 108.029999 104.380112 \n", "2015-12-28 107.589996 107.690002 106.180000 106.820000 103.210999 \n", "2015-12-29 106.959999 109.430000 106.860001 108.739998 105.066116 \n", "2015-12-30 108.580002 108.699997 107.180000 107.320000 103.694107 \n", "2015-12-31 107.010002 107.029999 104.820000 105.260002 101.703697 \n", "\n", " Volume \n", "Date \n", "2015-12-24 13570400 \n", "2015-12-28 26704200 \n", "2015-12-29 30931200 \n", "2015-12-30 25213800 \n", "2015-12-31 40635300 " ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apple.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's save this data to a CSV file so we don't need to re-download it on every run:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots()\n", "apple.plot.line(y='Close', marker='o', markersize=3, linewidth=0.5, ax=ax);" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEZCAYAAABl1cWuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXl8VPW5/z/nzJ5lMtmTSSbsa2AQ\nAqKCvQJWrIgBKlHRuKMWi632avXX2tpe9HrlXtpbWrRiay3WBRUEi16lghuyJpqJ7AlkIZOVLLMk\ns53z/f1x5pzMTCYhk8wkM8n3/XrZkpmTc75zcuY5z3mWz8MQQggoFAqFEtOww70ACoVCoQweaswp\nFAplBECNOYVCoYwAqDGnUCiUEQA15hQKhTICoMacQqFQRgDUmFMGhNvtxsKFC3H//fcPel9TpkxB\na2trGFYF3HvvvQPe1+HDh3HjjTdecru1a9eioqIipH3v2rULN910EwoLC3HrrbeivLxceu/Pf/4z\nrr/+enz/+9/H5s2bEVgt/NVXX6GwsNDvteeffx7XXHMNCgsLUVhYiJ/+9KchrYcy8pAP9wIoscne\nvXsxdepUfPfdd6isrMSECROGe0kAgAMHDkT8GFu3bg1p+3PnzmHjxo3YsWMHMjIy8Pnnn2P9+vX4\n7LPP8Pnnn+Ojjz7Cjh07IJPJcN9992HChAm44YYb4HA48OKLL+KNN95AZmam3z6/+eYbbNq0CXPm\nzAnnR6PEMNQzpwyIN998E0uWLMENN9yA1157DYDg2a5evRo/+clPsHz5cqxevRqVlZUAgCeffBK/\n/vWvccstt+Daa6/Fr3/9a7jd7h77feedd7Bq1SqsWLECd999t/T7vtjtdjzyyCMoLCzEypUr8ctf\n/hI8z+Opp54CANx1112or6/H2bNnUVxcjOXLl+Omm27C+++/L+3j3XffxbJly7B8+XLceeedqK+v\n9zvGsWPHcM0116C0tLTH8RcvXozy8nIcPnwYt956Kx5//HGsWLECN954I0pKSnpsr1QqsWHDBmRk\nZAAAZsyYgZaWFrhcLuzduxc33ngj4uLioFKpsGrVKuzevRuA4JF3dXXh+eef99ufy+XCiRMn8Mor\nr2D58uVYv349zGZz738syuiAUCghcvbsWZKfn09aW1tJWVkZMRqNpLW1lRw6dIhMnTqVHD16lBBC\nyBtvvEFWrlxJCCHk5z//OVmxYgWx2WzE6XSS22+/nWzbto0QQsjkyZPJxYsXyeHDh8maNWtIZ2cn\nIYSQL7/8klx//fU9jr9z505y7733EkII8Xg85Be/+AWpqqry25fb7SZLliwhH3/8MSGEkIaGBnL1\n1VeT0tJScvLkSTJ//nxiNpsJIYS8+uqr5OmnnyaHDh0iy5YtIwcPHiTXXnstOXnyZNDPv2jRImIy\nmcihQ4fItGnTyIkTJwghhPzlL38ht99+e5/njud58rOf/YysX7+eEELIvffeS/75z39K7x84cICs\nWLHC73fEdYnU1NSQ+++/n5w+fZrwPE+2bt1KCgsLCc/zfR6bMrKhnjklZN58800sWrQIycnJMBqN\nyM3Nxfbt2wEAU6dOxdy5cwEAP/zhD3Hy5Em0tbUBAFauXIn4+HgolUoUFhbiq6++8tvvZ599hurq\natx6660oLCzExo0bYbFY0N7e7rddQUEBKioqUFxcjJdffhl33XUXxowZ47dNVVUVnE4nrrvuOgBA\nZmYmrrvuOnz55Zc4ePAgFi5ciOzsbADA3Xffjd/+9rcAgIaGBjz00EO49tprMXXq1EueC71ej2nT\npgEApk+fjo6Ojl637ezsxE9+8hPU1NRgw4YNAABCCBiGkbYhhIBl+/5aGgwGbN26FZMnTwbDMLjv\nvvtQU1ODCxcuXHK9lJELNeaUkOjs7MSuXbtQUlKCxYsXY/HixWhubsbrr78Oj8cDmUzW43fE13zf\nC2a0eJ5HYWEhdu3ahV27dmHnzp147733kJSU5LedwWDA3r178cADD8Bms+Gee+7Bvn37/LbhOM7P\nSIrHFNfo+57D4ZDCOTKZDH/961+xc+dOlJWVXfJ8qNVq6d8Mw/RIXoqYzWbceuutkMlk+Pvf/w6t\nVgsAyM7ORlNTk7RdU1MTsrKy+jzmqVOn/EJG4mdTKBSXXC9l5EKNOSUkPvjgA+h0Onz55ZfYt28f\n9u3bh3/961/o7OxEa2srTp06hVOnTgEA3n77bcyePVsyXB999BFcLhecTid27tyJRYsW+e174cKF\n2LNnj2Tc3nzzTdx111091vDGG2/gqaeewsKFC/H4449j4cKFOHHiBADBGHs8HowfPx5yuRyffPIJ\nAKCxsREff/wxrrrqKsyfPx8HDx6UjvPWW29h48aNAID09HTMmTMHP//5z/HEE0+gq6tr0OfMZrOh\nuLgY1113HX73u9/53QCWLFmC3bt3o7OzEy6XCzt27MC1117b5/5YlsWzzz6L2tpa6XxMmTLlkjcB\nysiGVrNQQuLNN9/EPffc4+dla7VaFBcX429/+xvS0tLw+9//HnV1dUhJScELL7wgbadWq7FmzRpY\nLBYsXboUP/zhD/32vXDhQqxduxb33nsvGIZBQkIC/vjHP/bwsFesWIEjR47ghhtugEajQXZ2NoqL\niwEA119/PYqLi7F582Zs2bIFGzZswObNm8FxHB5++GFcccUVAIDHH39cKqtMT0/Hc889h6qqKukY\nK1euxMcff4znn38ev/nNbwZ1zv7xj3/AbDZj79692Lt3r/T63/72NyxevBhnzpzB6tWr4Xa7sWTJ\nEqxYsaLP/U2ePBm//OUv8aMf/QgcxyErKwubNm0a1BopsQ9DensupFBC5PDhw/iP//gP/POf/+zx\n3pNPPolJkybhvvvuG4aVUSgjHxpmoVAolBEA9cwpFAplBEA9cwqFQhkBUGNOoVAoIwBqzCkUCmUE\nQI05hUKhjACoMadQKJQRADXmFAqFMgKgxpxCoVBGANSYUygUygiAGnMKhUIZAVBjTqFQKCMAaswp\nFAplBECNOYVCoYwAqDGnUCiUEQA15hQKhTICoMacQqFQRgDUmFMoFMoIgBpzCoVCGQEMy0Dn5mbr\ncByWQqFQYpr09MRe36OeOYVCoYwAqDGnUCiUEQA15hQKhTICoMacQqFQRgDUmFMoFMoIgBpzCoVC\nGQFQYx5BTGYLXj1cA5PZMtxLoVAoI5xhqTMfDZjMFqx7xwQ3x0MhY7FltRFGvXa4l0WhUEYo1DOP\nECW17XB5ePAE8HA8Smrbh3tJYYE+bVAo0Qn1zCNEgUEHGcuA4wnkMhYFBt1wL2nQROppw2S2oKS2\nHQUGHX16oUQt585V4sUX/wCHw4Guri5ceeUCzJ5dgF273sNvfvOfw708aswjhVGvxQ+mZaDe4sCP\nFo4bEUZKfNog6H7aGOznMpkt+NH2Mnh4QsNRlLARbgfBarXimWf+H559diMMhjxwHIenn34Sqamp\nYVhteKDGPIJkJqpAACnEEutGqsCgA8MADBC2p42S2na4OAIgfDcIyugmEk+QX331OebMmQeDIQ8A\nIJPJ8Mtf/gbffWfCN9+UAAA++eQjbN/+JhQKBQyGPDzxxC9gNtfhued+A7lcLv1OenoGXnrpjygr\nKwXPE9xyy+1YvPjaQX9uaswjSKPViY9ONoGQkeF1GvVa5Oo0mD9Gh+unZYblsxQYdGAZgJDuG0Qs\nhl1icc2xymdnW3Cm2dbr+9/WdUhPkC4Pj5cOnMdlOUm9bj85PQHXTErr85gtLc3Q63P8XouLi4Nc\nLpjQjo52/OUvf8arr/4DcXHx+MMf/ge7dr0HgMGUKVOxfv1jKCv7BlarBRUVZ1FfX4cXX/wrnE4n\nHnzwHsybNx+Jib2LaPUHaswjSL3FAZ4nYQ1LDCc2pwfjUuLwbxPSwvY5jHotlk7NwEW7Cw8uGAsA\nWLfdBBfHg2UZPLFkIlYZs8NyrEgheoIuDw+lPPZv2tHONZPS+jS+JrMF68wmeDgechmLhxYMPsyZ\nmZmNM2dO+b1mNtehrOwb6d/jxo1HXFw8AGDWrDk4evQQ1q9/DP/4x2v42c/WIz4+AQ8++DDOnavA\n6dOn8OMfPwAA8Hg8aGioH7Qxp9UsEcLm9GB8ajxkLAOWCV9YYjipbLFjjiEJHQ532PZJCEFOkhoz\n9FoY9VqU1LbDyQleFccTbPy0IuorZ0pq2+EOyCVQhg+jXostq414cMHYsN1YFyxYiMOHv0Zd3QUA\nggHevPl3SEoSvtPZ2TmoqjqPrq4uAMC335bCYMjDV199jlmzZuN///dFLFq0BP/4x2sYM2YsZs+e\niz/+8WX84Q8vYfHia5GTk9PrsfsL9cwjRIPFiTmGJOg0CticHiyZkh7z3trZZjvm5Cbhu/rw6dFb\nHB5oNQq0dwk3CDHswgthdPCERP0TTYFBB5ZlwI+gyqVYx+h1DsJFfHwCfvGL3+C//msDeJ5HZ2cn\nFiy4GmPHjkNZWSl0Oh3uvfdBPPLIg2AYFrm5Bjz00I/R0tKM3/72achkMrAsi/XrH8PkyVPwzTcl\nWLfufnR1deJ731skefSDgSGEkDB81pAYDcMpvqy8iJR4JVpsTmQmqjA1c3CPUNHASweqcO/8PLx+\n7ALuvSIvLPv853cNOFLTjuQ4Be6cZ0BqvBKP7zqOLyovghDETNhiw8dncKG9C+uuHhmVS5TopK/h\nFNQzjxD1FifysxNhc3rQ5eaHezlhQyln4ebC83lMZgue23sWHE8gkzHISFDh9rm5mJQej8tyklDT\n1oll+VkxYRzTEpRIT1DGxFopIxMaM48QbZ0uJGsU0Chk6HJzw72cQROJB7iS2nZ4eAIeQnz8UHWb\n9N68PB3mj0mOGePIAGAYISxEoQwH1JhHEIZhoJazcHhi3zNvsDqRrVWFdZ9irFnGAAoZi7R4pfRe\narwSLfbwJVojSaeLg0YhQ3KcEq2dsbFmysiDhlkijEYhg2MEeOZnm+2YmCYkaRgmPPs06rVYNj0D\nuToNCgw6HDjfCkCoOddpFOjoig3DeO6iHePT4lDZYsdfD1WHrQafQgkF6plHGLWCHRFhlsoWO8Z7\njXmj1Rk2sa3MRBXumZ8Ho16LBKUMNqcHACBjGSlkEe3iXpUtdrg5Hi9/XY13v63HundMUbtWysiF\neuYRwOltHgEEz/xcSydePVwTs92BJrMFh6vbpJK7PSci09U6OSMBp5tskuffaHXiP/eewQffNYLj\nCRRRWtlSb3GitdMNDzdyGsQosUdInnlZWRmKi4sBABUVFbjttttw66234plnngHHCd7n9u3bsWrV\nKhQVFWH//v3hX3EM0GgVyhEB4GyTDe+Z6vHiV1Ux6bGJ3Y2ltR1Y944Je443gufJoKR9RU+7rK4D\nvvnCKV5jLm7z4ckm7DA1wO1Nkro9PF7+uioqz2GBQQe5jAmrbg2FEgr99sy3bt2K3bt3Q6PRAAA2\nbdqExx57DPPmzcOTTz6Jffv24bLLLsO2bdvw3nvvwel0Ys2aNViwYAGUSuUl9j6yaLA4kOVNFn5r\ntsR0S39JbTvcXHd3I0CkEMhAjJZv6zvDAGNT4nDluBQY9VohTu7wQMYIx+V5/8oQHsCR6nZ8W2eK\nOg/dqNdiw7Kp+OhEM+6YlxtVa6OMDvrtmefl5WHz5s3Sz5s3b8a8efPgcrnQ3NyM1NRUmEwmzJ49\nG0qlEomJicjLy8OpU6f62OvIpMHiRLZWDaC7YgOITY9N1GVnIax/WX4Wbi/IwR1zcwdkUH1ldHkC\nnLvYiYe2l3V7215XvcCgg1LOQsYAMp+rlABwR1HLfHunG0kaBQBgpj4Jl4+JzVAaJfbptzFfunSp\npBAGCBKQdXV1uPHGG9HW1oZx48bBZrP5icXEx8fDZutd3Wyk0mRzIt1bZmfUa3HdlDQoZUzUeZP9\nZVJ6PG6ckSmtf3q2FtdPyxjQZxFldH3xcEQyzq2dbkkuQNTXKJyRDd9fYRkmam6Ke083oaLZBpPZ\nAqWMgZundeaU4WFQ1Sw5OTn45JNPcNttt+H5559HQkIC7Ha79L7dbh+0ElisIUqhnmjsvonJWBZp\nCSpMz0wYxpWFjhgSOdlgw8enmqXXk9RyWByeAe3TqNdifl4yZD7WWS5jJOnbPccbcaiqDeveMQEA\n7pmfh2X5mVDKWTAAWAZ4fMnEqLgpmswWbPrsHP55vBHr3jHhdJMN7hHQU0CJTQZszB966CFUVVUB\nEDxwlmVhNBpRUlICp9MJq9WKyspKTJ48OVxrjXpE41fiTRaKoYO2TjfGpmjQ4WMAo73cDugZLxe9\n50SV3O+zhIKHJ5iWnYiXb70Mq4xZWGXMxktFsyTFRI6QHscTVfB+tHAsrhybjI4ud1Sct5LadnA+\nyWCT2Qo3T405ZXgYcGniAw88gCeffBIKhQIajQYbNmxAeno6iouLsWbNGhBC8Oijj0KlCm/XYDQT\nzPgZ9VrYXR5Mz0qExeFBarwSO0z1eOFfZ8FHuZBUgUEHhYyFy8P7xfu1ajksDQNr6DGZOzDLq2gX\n+JnF44k61L6hFHHbP39djYNVbVEx7EPKh3iTwXMNSTjsI0lAoQwlIRnz3NxcbN++HQAwZ84cvPXW\nWz22KSoqQlFRUXhWF2P0ZvxUchZjU+JgcQge5QufVsA7KU1K5kWjMTfqtXj6usn4ovIibpmTI60x\nSaOAxeEJabqOuG1duwOPL5nY6/G2rDb2uk+xwiVaKoOMei1umJYBQ7JGWi815pThgjYNhRGjXotn\nrp+Cf51pxpqC7vI0l4fHyQYrLA4PeELA+STJoimZF4x4lQxrCnKQn91tNNVyFlWtnXj5YHW/5iz6\nliOCAaZnJ/Y6PagvHWqxlpvj/Msih2tkGyFE6mClUIYbaszDiMlswYHzrbg8r9uomMwWmMwWlJkt\nYBkGd8zNhZxlwPEETBQl83rjaHU71AoZONId6iivt6L0QneJoZvjsed4Q58etbgtCLDx0wpMTIsP\n+XMb9Vr8eOE47DCZsWauAUa9FiazBQ9tL4OHI0M+Zq6ty43kuNHVQ0GJXqgxDxOiUXFzBB+daAIY\nBquM2SipbQchQsMLTwi+qLyIl4qMKLnQAVNdh5TM62+YYii9T5PZgre/NYMQgn+UXMCW1UYAwLp3\nTHB6qzYY73/vlzcAQFAvXSxHJIOcHmQyW7DlQBVcHh6b9ldiYlq8N08h7FgcMzeQG8VA+KLiIk40\nWGAyJ0T1DZkyOqBCW2HCz6iQ7tmVBQYdZD51eLVtXWAYBnMNOhyqbsdLBy7d5i+GKfqzbTgRY9S+\nrftikhcQjPik9HgUzswWbli9tPgb9VqsnJkFGSOUFioG2Dzlm2AWcw2BdevijSLSiLmPj040xaRM\nA2XkQY15mOjNqBj1WizPz5KaXsTXgxnK3hCN2GD0UAaCr964GKMWk7yCBgmDG/MzsSw/s8d2gRhz\nkrBh2TQ8NIghu+KxWaY712DUa7FgXDKYft4owlUS6jtYgw5xpkQDNMwSJmZmJ+Kqsck4XN0O3qso\nKBqVZfmZ2HOisUfJnW9ZW18GqMCgg5xl4OKGdmBwsGoNQOjMfOnAeVw9IRXTMhIlzzslTon5Y4NP\nB7K7OMyflIxrp6QPaj1itUtNWxfGp8YBAKZlJiJZo+yxzkDEJ5z+JG0vRWBZYjQnsSmjA2rMw8RX\nlRchYxk8vmQiOrrcfkalt5K7YIYyGEa9Fo9eMwGvHanFszdOG9L4bLBqDaNei8tykqDXaqBWCA93\n49PisXhSGlLjgycEu1wc4pSyQa9HrHZptDqx5avzSNYI030mZyTg+qkZ0MUppG0D8wzBnnAGei57\nu9FRKMMFNeZhwGS24Of/PAkPR3C4uj2oxxes5E6fpEbxPAPk7KVH9yRpFJiRrcX0rKGRRzCZLTha\n3YZmu6vXbZweDiq5YKDjfGadBkvWOjwc1PLwRfUarU7sMDWA8EIVy9or89Bid0nGfIepHhs/rQDH\nE6kxK0mjAMOEz5sOdqOjI0ApwwU15mHgaHWblPwMxeNLVMlhc3j8vMneaLG7kBqvwJ++PIdFk9Ij\n6gn6hiNYhsFNM7KCHs/h4SXPPE4pQ6eL6zOUwYRr3hzgrRISYtaEJzjRYMX0rERMTI/vbszy1vOL\npZN7TjRJsrozhuimSKEMFTQBGgbqLU4oZX0nAIORqJbD4uyfxsnZJht2mOrxj2N1A6qeCCXxJ9aF\n80Qo9+stuef08FB5ve04hWDMfX83kolBUZoXEGRxvz7fhtILHdL6fRuzGO//OsVadwAlFzpoFQpl\nREE980FgMlvw7rdmjEuNw4tFs0KuA9eq5bA63AA00v5620e9xQHOp5W9ryadYOtc944Jbg8vjV4D\n0Ovvi8k9jieSomEgLMOg08V1G3OlDFanR0rWuvnIJgbFKqEdpnoAgoDX3tPNWDg+VVg/hNp+AAAD\nGHRqsIxQPikSDZIAFEq4oMZ8gJjMFvzI2ySklAtGK9S27kRVt2feV3jCZLbA7vJAxjIg3k7HD443\nwsORfgl1+XZgenxCDr1VdYjJvc8qWjB/THLQfaoVMrTaXVLMXKOUodHqxFXjUnDHvFwcrmrDw1eP\ni6ihFKuE3B4ePIAL7Q6se8eEn3xvHFITlGi2CfF+QoCjte34r5um46kPToAQgCODGxbi8gjnjkKJ\nFujVOEBKatvh4nrKtYaCVq2A1Ssl+9W5i3AGCU+IRv5Uo6ATPzUzAcvzs/y89EsdW/S0xfmUYsiB\nJ4JRevnrKuww1fcIw9hdHPadbQkajlDLWdhdnJS8jVfK0OlNgOo0Cjzyb+PR3jUwZcX+IlYJzRuj\nk+r4nR4e/72/UjLkDAA5yyBJrUBKnBIEjOSdz88b+FPDwapWnGi00jANJWqgnvkAmZObJMRsB1EZ\nkaiW42SjFRfaHTDVWQTPO2B/vl2PPE+QoJJhWX4mdn/XAN5bOiGOLesNo16L66emo8nmxEMLxqHL\nxWH3dw3SDeFwdTsOV7eDgSDJ+6ebZ6Le4gAh6FWhUKOQweHh/H7udAk/210cLstJwksHqnDd1JBP\nS0gY9Vo8cNVYfFtnEmaUMowUL2cBjEkRatFneUsTiVcvHQC+ONeKwzXtlww7BWIyW/D//nkSbo7g\nUFVbQJI3Ih+TQrkk1JgPkAarE7NztMhLjsOy/MwBhRP2n2nGGyV1gq65jMHiSanI1WmwcHyqtL9A\nWd1srRpGvRZzDToc9Sb6RJ2S3tbQYHEgP1uLbLsLRr0Wrx2pxcLxKWi2uXCiwSoZN9Fwf1l5EdOy\nElFebw2qLQ4AagULh7t7EINvaSLPC0OflTIWDjcHtWLw9eV94VvHn6RRYNP+Sng4HizL4EJ7F9w8\nwe8+P4fHFk2QzqX4mX3DTi4P3y+xLlG6IVqkeCkUgBrzAWEyW/DMR6fBE4LyeiuW5WcOaB//89k5\n6ZHfwxPwPHDTjCzk6jTSdka9Fr9fmY/XjtRi7VVjcaiqFa2dLrCsIMEK+BuUYEnUw9VtuHJsMvYc\nb4TJbMGLB6pAiGBw5TJGKqsUwzAZiSqMT43HNRPTevVW1fJu4w0IHr0rYGTa/LHJePsbM3hC0Gh1\nhnyOQsG3jl8U4GqwOPF+uTdByvHo6HJjy2oj9hxvkHIOYthJNPD9EesSK2l42v1JiSKoMR8AYunb\nYDwzUZtFhGUYTM1MgN3J9dh2TEocFk1Kg1GvxaGqVnxecRHL87NQUtvhNwjDVzfcNzFa1+FA4UwN\nlHIWh6vapAEPDE+wcHwKvjjXKoVUrhibjAaLA9dMTENGoqrXz6VWsHBcYt4lIUS6cTAMg8KZ2UPi\nwYqG3WS29JBREN9blp+FLV+dx7qF4wAAu8obwJFu9cW+/qZGvRY3TM9Ajk6DubT7kxIl0AToAAgm\nQDWQfSjlLFhAkgHIz06EzdWz7tzi8CBRLcTFm2wufHiiERmJKmxZbcTcvCTJaAcbWyfopguBXIeb\nQ3WbHQwDae2p8Sr4hnm/qLiIN0rNqLc4+ly/WiHr4YmLiHHj0gsdkpgYxxPsOd4Q6mkaFGL45cEg\n4l6iJMGMbEFbZk2B3ivgJWjmtHW6+qzLT09Q4d75eUENOaFtoJRhgHrmA8Co12LZ9Azk6gauyxFM\nr+VEgxUXg7TPWxweaFVyaXo9xxOse8eELauNuCwnyS++HijIdaLBiumZiTCZLdh27AI8nDAUo3Bm\nthQe2nOiUQoziInW0gsdmJWT1Ov61XIWSp/2fJPZgm/rOmAyW6SW9kAd8w+ON2JZfvBu0kjR1+Si\nXJ0aF9odyEvWYFJGAv7jhqmo63AgSaPoIQXQ3zXLWVaqz6dQhhLqmQ8QUZdjMIbJqNf67SNOKYPd\n1TPMYnF4oNXIg87ADNzfvVfkYVxKnGSAjtW2Y25ekl9oiPeO/BEN3ZbVRqw0ZoH1euwse+lRdhqF\nTNJaEcM7JbVCV2Vv8fG+ukmHgykZCTjTZAMANFic+N6EVNwzPw8dXW7w3qoXl4f3e6IwmS34z71n\ncOBca1CvXSETbqYUylBDPfMBEokn6QSlDPYgYRar040JaXFCZYvcf3r9oapWv23lLIurxqVIN4gu\nN4d4pbw7aec1NL5esvifWi6DUs6irct9yZuUWsFK3Z+B4Z0Gq0N63fc8Rdu803Epcfjs7EWYzBYc\nqW6TnpB8zxVB97kCIE2TEv/9UtEsv3OlkLHe4R2RreChUAKhnvkA4HgCNgIFxfEqedAEqMXhgVYt\nDxoDDrypdLk5xCmFP+vBqlacarRJY+mWew0SIIRSAr3kWTlaTMtKxJzc3sMrImq5TDLmvgMrWJaB\n1cFJU5YC8wLRlCyUy1iYLQ6/pwrfcyUNFOG7B4p4fLxuD9fzHDZZHXj9WC1tJqIMOSEZ87KyMhQX\nFwMATp48iTVr1qC4uBj33XcfWlpaAAAbNmzAqlWrUFxcjOLiYlit1vCvepjpcLiRpAn/Q41azvo1\n4ojYnB4kqITjBYZmeqOsrgM/23kch6vaJCO1LD8TKjnba+I2NV6J0tp25CVretlrN2ebbahp65KM\n35bVRlw+JhmEAKebbFj3jgmAMMjioYVj8fIts4Zs0HIo1FscPZLGgCAVoJSzUrmmOGXJt4M/ULfG\nZLbgzVIzXjtyAQ+8XSbpxlClhXdNAAAgAElEQVQoQ0G/LdLWrVuxe/duaDTCF/3ZZ5/F008/jWnT\npuGtt97C1q1b8dRTT+H48eN45ZVXkJKSErFFDzetnW6kRGAqO8MwQcM3DRYnXjtS2+9ka4JKjkNV\nbfAExNfvmZ8XdEiGSHqCCqUXOrD2yjF97t9ktuDhd8vh9PBSItao10KnkcPD+9e+DzavEGmmZCSg\n3GyFO6A5SrxBvfjVefxoYbfGzJ3zDKjr6EK8UtGjWUwcJQcM/XBpCqXfxjwvLw+bN2/GE088AQDY\ntGkTMjIyAAAcx0GlUoHneVRXV+NXv/oVWlpacPPNN+Pmm2+OzMqHkWM1bahs6eyzDjtcmMwWfHiy\nCcQ7ii6wssI32uPmeMhZBlq1HBkJqqBjzfqq7qi3OFDb1oXqti4Y+5AI8B3q7OvN7jvbIm3TnyRq\nNLB4Uho4nqDV7satBTlByxd9X2MZBr+9YVrQMJsYaxflBHznwFIokabfYZalS5dCLu+2/aIhLy0t\nxeuvv467774bnZ2duOOOO7Bx40a88soreOONN3Dq1Knwr3oYMZkt+MPn57G7vCEietiBNkKsQulL\nH1ysa663OKFPUiNJrUB2kho/mJYRtMY6GCazBT/Z8R0cXm+7r88lxsh9wzW+GuIMgOUDlDgYaiam\nx+NEgw13XW7o13p5oNd8iVGvxRNLJkLGCOfgUsOlKZRwMqjA74cffogXX3wRL7/8MlJSUsBxHO68\n804pFHPFFVfg1KlTmDo1wmpLQ4j4KB0pXY4GixP/ufcMAAbL8jORl6yBPIgAl4hCxsLFEajkgg5J\nTpIalS12yUvuryxvMG+7rw7IYOEahay70maZT7I1molXytFsc+CLyotwcvyg/5arjNkYnxKH/9lf\ngelZ0X8zo4wcBmzMd+3ahbfffhvbtm2DTicYmKqqKjz66KPYuXMneJ5HaWkpVq5cGbbFRgOR1OUQ\n2895qcmmATfP0uOFm6ajosUeNM6tUchQUtuO0002dDjcKMjV4X/2V8LFEbAMMFOv7VfiUfS2exPW\nCiQwXNObgY92TGYLWuxuvHKoGq8dre0zjNXa6ULyJRQqASHEdLalE2ea7dhzojGkpiMKZaAMyJhz\nHIdnn30W2dnZWL9+PQBg3rx5eOSRR7B8+XIUFRVBoVCgsLAQkyZNCuuChxtB1yMTeq0ac/PCa7RK\natsDJuEQnG6y4bFFE3D1hNSgv3PR7sTmL87Dw/NgGAZdLk6qg+YJ+p2EC4cx7iseH60I59w/jNXb\nZ6hotmNSenz/9hnBpzcKJRghGfPc3Fxs374dAHDkyJGg26xduxZr164d/MqimIwEJe69IrSpQv2h\nwKDzG20mlzGYkBbX5++YO5xSaR3jjZ2zA0zCxaIxHiyhPJFUtNhxw/RLK2QWGHSQy8SxezRuThka\naAfoAIiUjpKg+ZIJu4vDsdp23DwrGz+Y1rfxmJKZgH+daQaIYMSX5WdhSmYiNn5aAd5bAUONSe9c\n6omE8Q67kLEMLA4PdP0Isxj1Wvzvqhl47UgtHrhq7Ki7QVKGB2rMowxDsgZTMhLQaHXiaE07FowP\nHl4RmZaZgPGpcUiOUyLLWypp1GslTe9Yil8PF309kYhDN8Smrf4yLy8Zx2poeIUydFBjHmUkqOQ4\nVtOGU002P3XE3oxCXbsDHh7QKFhMy0qUXh+NIZNIoFEKxlyjkCFUAQc5K+i0nGy00RsrJeJQYx5l\nJKrk+FeDDSSgkzKYETCZLdi4rwIujqC6tRMenmBKRgI1GGFEo2DR5ebx6ZlmnG/tlOQL+sP0rER8\n8F0DNn12Dm6OD9r0RaGECyq0FWUkquSQsQwUfWioiPi2jxMAX59vi0gj02gmTiGDqa4Dz3x0GvvP\ntIR0fmflaPFZxUW4PHyfTV8USjignnmUkaCSweHm8aebZ6L0Qkefj+a+w559BxTTUrjwoVbIcOBc\n64AaxRJUcqTGKbqrixgGSf1IoFIoA4F65gMgAuq3EolqOWxOD2blJF1SpMp3sIRCNrgxdpTgxClk\nGJMSBxnLgB3A+WUYBnqtMJqP5wk27a+kT06UiEA98wEQyRGPiSo5XFzfg5J98R1QTJNs4ae2vQun\nGq2YP0aHWTlJIZ1fk9mC/zvZBLdPJxh9cho4JrOFXuN9QI15iER6WG+iSh5yGRxAq1cigclswbOf\nnIGbI2BZBvdeMSakc1xS2w4u8HqhoZYBIY4mpInk3qFhlhBxenioFZEbCXa6yYYul4c+ikcBvqJq\nwSYzXQpfdUkZCxpqGQQlte1w00Ryn1BjHiKd3prjSCAOfahpd9CqlCggcBxeqLkI3zF/hTMEsbPe\nhnFT+qbAoINMJiSraF4oONSYh0hpbQdKa9sjYmh7G/pAGR5EYzw3Lwk3TMsYsPjYPfPzsCw/EyxL\nk9QDxajX4o6CXBh0aiybnjHcy4lKaMw8BExmC3790Sm4OYKvzreGPW4XqgwtJfKI04YGmyox6rW4\nc24uPITgmolpNN47ANq73Ki3OPF+eQP2nGiicfMAqDEPAcFzjpy0aaxqgo8GwlGOOn+sMPCa/l0H\nRm17FzgqLdwrNMwSAgUGHeQDrDfuL+JjOb1Io4twFDHpk9So6+ga/I5GKfokNZRyIYdBn1x7Qj3z\nEDDqtbhzngFOjsOiSenU4FJCotHixMenmjEu9dLDQig9yUxU4U83z8RLB6rwo4Xj6DkMgHrmIaKL\nU+Cuy6nnTAkNk9mCH79XjmM17bRSaQCYzBZ8c6EDDMPgspwkAMCrh2voefSBeuYhYnN6BtTUQ4lt\nBhszFyuVaLw3dMSGIZeHx7p3TJicHo+/HakFxxMo5bSBSIR65iHC8QRyNoLiLJSogyOCxspg8K1Z\np/He0CipbZfE5NweHuX1VqmZy01LeCWoi0mhXAJCCNTywTWKiZVKfztcg1Wzsqkn2Q9ELZYkjQIy\nlgFPiHBT9Z16ToAGizMknfmRCjXmIRJJxURKdBKvlCNOOfiuX6Nei6LZ+kHfGEYDgVos8/N0mJWb\nhCSNApv2V8Lt4QFG6Kh9v7wee040jvpwCzXmIRJhnS1KFJKgkoVNwiEvOQ7HatpxWW5SWPY3UvEL\nrXA83DzBPfPzAECab9tgceL98no/vZbRbMxDipmXlZWhuLgYAHDy5EmsWbMGxcXFuO+++9DS0gIA\n2L59O1atWoWioiLs378//CumUIaYi3Y3Dla1haVyIjNRhQarIwyrGtkUGHSQsQwYADKWwcLxKdJ7\nvhIJNA/RTb89861bt2L37t3QaDQAgGeffRZPP/00pk2bhrfeegtbt27F/fffj23btuG9996D0+nE\nmjVrsGDBAiiVyoh9gEhDNZRHNyazBX87XAMPT7D/bMugH+WF2G8YFzhCMeq1WDwpDXaXB5mJKqww\nZgfd5vcr8/Ha0QtYe2Vo8sQjkX575nl5edi8ebP086ZNmzBt2jQAAMdxUKlUMJlMmD17NpRKJRIT\nE5GXl4dTp06Ff9VDhMlswbrtJrx0oArr3jFhh6keZeYOWts6ihA1ycOpdthX2sVkttD6aS95yRpM\nzUyETqPoNcw1x6CDMZtq+QMhGPOlS5dCLu925DMyBOWy0tJSvP7667j77rths9mQmJgobRMfHw+b\nzRbG5Q4te443wskJGspuD4+Nn1bgWE0HbfoYRfhqkofrUV4oyOjpnotJP9F5oNcY4PLwUMp7N1Ms\nw4CAPuoAg0yAfvjhh3jxxRfx8ssvIyUlBQkJCbDb7dL7drvdz7jHEiazBR8cb+h+gQEV+RmFREL8\nLDNRhUarE9latd/rvkk/eo0JnGm2ISNRRUsP+8GAm4Z27dqF119/Hdu2bYPBYAAAGI1GlJSUwOl0\nwmq1orKyEpMnTw7bYoeSktp2eLjuO/7V41PAMlSPejQSbvGzvOQ41LT2FNwqMOjAMpEVcosVSmrb\n8XVVK47VdmDP8cZBPamMltDVgDxzjuPw7LPPIjs7G+vXrwcAzJs3D4888giKi4uxZs0aEELw6KOP\nQqVShXXBQ4WYTRcbFebm6TAjWwvifY96CZSBkpeswb6zLZiPZL/XjXotCgxJmJwRP+qE3HwLDQDg\nkffK4eIGPwjbVwqgv63/sVr0EJIxz83Nxfbt2wEAR44cCbpNUVERioqKBr+yISbwD2jUa/GDaRkw\nJGtQVteBT0414yf/Nh6zcmh9MGVwpMQp0Gp3BX3PzROsmJmNMSlxQ7yq4SOwQWjZ9Ey/p+LBlB4G\n08QRXw9mrGN5cDRtGkLvf8CMRBUKDDr8+UAVeAI8/G55TP1xKdFJXzovFocb7lFWuxiYKwCIMO+T\nE/5/eX4WluVnDuh7V2DQCeebELAMgySNok9jLRr/WGxEosYcPS+mPccbsOd4A0402NDW6QYBaFKK\nElaCmWviNTge7xzY0YIU0uQJ5DIWy/KzMC41DudaOnHjjKxBf98IIWAgVBCdbrT1mWQWB9C4OBJz\neQtqzNH9B/TwBCzLYNd3DRC/T2dbbEInGh97f1xK9NJid+EvB6sxb0yyZEzsLg46jQJubnR55ka9\nFjfNyERrpxvF8www6rWwONyYma1FfvbgDHlJbTsIEW6ewgMPAcP0Hrox6rX46TXjUVZngVLGxpTj\nRo05hD/gvVfkobzegqxENXaa6qX3eB4oNGYiS6uOuYQIJToxmS3Yc7wRPE/w6pFa6VG/xeaCXquG\nZ5SFWQAgJU6JtASV9P26VH15fykw6MCyQpgFDIMbpmfi3MVOZCaqUDQ7Rzqeb84sV6fB5PQEnG6y\nYevX1Sgzd2Dx5HSsCtKFGk1QY+4lI1GFSZ4EfG9CKnaV10N0juQyBsvyB/+oR6GIlNS2B+1ZaLG7\nkJ2kgnuUhVkAbyOVz03MxREoZYM35jOyE7FsegZydRp4OIJ4pRxGvRZWh8evm/eh7WXgeAKFjMX9\nV+ThynEpYAC8fLAaAHC4Wtg2mg06NeZeHG4enS4ORr0WS6dmQK1gATADTrxQKL1RYNBBLmPABcRl\nm+1CI9FoS4ACAAP/Ts5weeYdXW5MyUhA0ewctHW68FZpHdwcwe7jjSBEMN4FhiQptOXheJxusuOa\nSWn4vPKi3772nWmmxjwWcHo4KGUsXB4euToN1l41ZriXRBmhGPVaPHXtJBytacfNl+klZ6HF5sL0\nrETYnJ5hXuHw4+L4sHjmF+1upMULQn/JcUocrWmHk+PBeW+YLg8Pc4cDChkjTBGTscjVqaCWs1g8\nOV3yyAFg8eT0Qa8nklBj7sXh5qFSsPjmQgdmU61pSoSZka2FSu6fYOt0cUjSKNDe5R7GlQ0PoldO\nvE16Lo6HKgyeeYvdiVSvMTeZLTjRYPPTxSEA6jocuP+KPJxusuP2ubk42WCFWi6TvPC/H6nBnZfn\nRbVXDtAZoBI8IWABfFvXgVk5NKxCiSxqBQuHp2dsXMEyo66aRSRBJYfdxQEAnB6hDrw/yFm213LO\ni3a3ZMxLattBvLcN30p/nicgYJColqOkth1VrZ1QKYRjrzJm4wfTMqPekAPUM/eDYQA3R/p9EVEo\nA0UlZ+EMZsxl7KhMgALi4A4nJqrk8HAESln/ZjSq5MKNMSHI9/a7egvqOhy4YmyypIDp4XihwgWQ\natuT4xTYerBaejK4flpGzHV7U2PuhWGAJpsLHV1uqtBGiThquQwON9fjdTnLBE2AxqpeSChkJKrQ\nZHViYlo8CEifnbK+iE85CQEyUCazBTvLG0AIwd+PCiWgvgqYQHdbf0ltu9dDBxhCUHqhw8+Yi0Y+\nmqHG3Euj1YmPTjaB4wkOVrXRtn1KRAn0zIk3jquQ9ewANZktePDtMvDe6ouRem1mJChR2WK/9IYB\nCOey543R10CLJaCB6pe+//atR/dtJlIrZHB6eKjDNAc2UtB4gpd6iwMcT/w0GSiUSCEqcorYXRwS\nVHIhDBDgmR+taYdnFFybaQkqtPQiQNYXjVYn3iqt6yFxKzYM9Ue22qjXYvVletx1eR6WTc/wM/Jx\nSpkUy49mqGfuJVurhkJmhYfjads+ZchptrmQnqAUwiwBCdA4BSvJTcArFjUSkXv1WULBZLbgLweF\nGa07TQ1+Ty1GvVZqGOpPeOryPB1S4hQ4cL7V7/V4rzFPjQ/t8ww11DP3kpmowpbVRjy4YOyIfYyl\nRC/NNqGELlgCtLXTjZ8tmiB1SW7aXxmRQQuxOMThUjNaMxNV/R4sYtBpcKHd0eP1eKUcdlf01/5T\nz9wHUcecQhlqWuwuzMjW9gi/ONwc5CwDq9MDkMipd+4w1eOFTyvA86TfQxzCBQkyD7W/iBUqLs/g\nn6hbO1344HgDMhP9M6kJKhnKzRYcqmqL6gQ0NeYUShTQYnNJnYq+fH2+FQsnpILzKnqChF+902S2\n4IV/VYDzGlX3EEs9e/jucmCC0Iy7OKP1hU/PIj9r4Os1mS14ZMd3cHmEssXCmdnS5zd3OPD7z86B\ni/IENA2zUChRQJebQ5zSv1rCZLbgrVIzPBwvxX8fiEAYUAxViLAB1RyRxuHu7vZM9GkcCoXKlk68\nX14/4FmhvhOJeJ74hWsqW+wxkYCmxpxCiULE6Vff1nXg4XfLYTJbMCk9AauM2WH3CsXhEAwAlgEe\nXzJxSD1Ph4eTyv4yvI1DoSCWIPJE0FrZc7wh5DWI4RoGQomi781M/PdgxtcNBTTMQqEMMyazBd/W\ndfg1qwVOvyqpbYdBp8FFuwu6MFeziPNu1XIW2UnqIW9d/7bOgiPVbZiYFo9Mb+NQKBQYdJDJGPCc\nkAj94HhjyLLVYrjm5a+rkBKn9PtdjYKFRsFiXGocHls0tDe6UKCeOQCOj/7uLsrIgxAh8fjg22U4\nVtshhQgYMJK3zPrUSKfGKwdUh90fMhNVuK0gF+kJPeP2kcRktuCZj05h35kWrHvHhFa7E40hGnOj\nXovl+VnSz4FhklD2syw/0yt/3b2+n+48ji43j1NNoTc0DSXUmEPwgsrNlpgqyaLEPo1WJ174tEJq\nEhITjwQEFS126DRyXD0+RYqRp8YrcTECxrysrgNldR2obu2Ezdkdrx6KUkUhVt1dWnjgfBv2nm4O\n2aAvy8+ELKBBaCBVMl1uHpUtndJn7iuWHm2EFGYpKyvDf//3f2Pbtm3Sa8899xzGjRuH2267DQCw\nYcMGlJaWIj5eqLDfsmULEhMTw7jk8GIyW/DY+8fh8vAovdARtZlqyshD7DoWEROPrx6uxlcHawAA\nn1e24qrxqTDqtWiwOPB/J5uQq9OE7RoVYvPlcHM8yuutuHF6hs/r3VPsH1s0AR1d7rCX5onzdzki\nVOvsOdEID0d6VJRcCqNeixumZcCQ3N0g5HBzUMn734JvMluwaV8lnByPde+YsGW10U+cK7DNP9ro\ntzHfunUrdu/eDY1GAwBobW3FE088gaqqKtx3333SdsePH8crr7yClJSU8K82AvjeeSNRv0uh9Eag\nXvdtBcJMyvMXO/1e33emGRPT4iPidARe/zXtXdLrYsze7eGx8dOKiGjDGPVa3D43BzwBbE4O75fX\n+3nBoRwnL1mDW+fkSMlUh4eHOgRN9JLadrh5oWHLV8tFFOe60N4V1bah3580Ly8Pmzdvln622+1Y\nv349CgsLpdd4nkd1dTV+9atf4dZbb8W7774b3tVGANEziPZMNWXk0eXu7vRkGaEsDwDGB/SNL56c\nHtTpCAdzcpPAMt3hiWytGoBX14QRvheMV0qAJ4JhD3eoIV4px9orx2BZfmavFSX9QaOQweFzTh1u\nzi/+fSlELzxQy8Wo1+Ke+Xk9momijX575kuXLsWFCxeknw0GAwwGA7744gvptc7OTtxxxx245557\nwHEc7rzzTsyYMQNTp04N76rDiFGvxa+WTsEXlRdxy5ycqL7zUkYW8UoZvLLa3lmUgvGYlpkInhB4\neCJNhTeZLWHrdPSFEGDd1WPB8QQFBh0OVQm6JEa9FtdOSUN7lxuT0+Ox7VgdAIAHwq4NIyoS+laU\ntHWGPm1JrWDR5eGgg7A+wTPvf5hFPH6sSg2HtTRRo9HgzjvvlEIxV1xxBU6dOhXVxhwAxqfFQSFj\nYu6PR4ldTN72cEIEL/SxRROk68/h4XBZThLunp8nbS8amhe/Oo8fLRwXtmv166pWPHDVWMi9dxXR\nmHe6OExIi4eb41HT1iVtzzLCkORI8s2FDrg5IsWt+/tZAz1zp5sPyTMHYlvSI6zVLFVVVVizZg04\njoPb7UZpaSny8/PDeYiI4PZOSadQhgpfgSgQ4mcg2zrdSI7r6f0a9VpclpMUNmNzpLoNx+utONFg\n7fFeeb1Q895odeJfp5ul12UDCH9cCt+q4JJaQe53IOEktUKGLu/AD5PZgh0mM8wdPYWzRiph9cwn\nTJiA5cuXo6ioCAqFAoWFhZg0aVI4DxERBG0IWmdOGTp8qyQCwyZWpyfsjUGBmMwW/GTHd+B5gjJz\nTw/4eL0Vawpy8JdD1fBVpf3+5LSIeq59nZdLoZaz6HJzUiWOEJJikJ8du952KIRkzHNzc7F9+3a/\n19avX+/389q1a7F27drBr2wIcXM8FCz1zClDR1/xWZZhIm7MS2rbwQV4wKIn/urhGtS2dUKtkCFb\nqwbLWgBv6eDkjMiWGQ8mbq1RyGBxemAyW6RKHG4AVTGxCm3nB+DhSMixNQplsPQWn1XIGCTHBe/E\nZJjwzKMUp/D4qjCazBbsOdEk7X/lLD0yE1X4wbQM5CVrkJ+ViJONtkEd1xeT2YI9xxtwstGGK8am\n+A2VGIjxVStYNNk46bNxPAGD8CZso3kWKLVgANw8T2PmlKjB6vDgwxONQTsvNQoZOoMMgg4VscnG\ndxiLr2AV8Xq0HE+Qk6TGPfPzcPmY5LAcGxAM+UPby7DDJBjzh7aXDbrTVOONmRv1WlwxRgcGAE8Q\ntmEeSpn/3NZog1oweBOgbHTebSmjC5PZgsPVbXj1cE1QOdcElRxWR3im3gRO4Skw6KD0NtkwrDCe\nrq3T7dfeHi5Katvh8RmP5+EG3yqv9lazOD083DwRnmIQvrr8OGV3gjUaocYcNAFKiR5KatvBE/Sq\nnZ2oksPWi953KFoqwXRLjHotHvMZT/ff+yqw+7tG7DvTLN1Y1HIWjjAYtAKDDnKf75xcNvgqGTEB\nerLBiqvGpgRtABoMLXYX/n60Nmo1nEZlzNxktqCkth1JGgU6utxweXhMzUgY7mVRKJJ33Fs1R4JK\nBruzp2cuhi08XP/GvtldHBJUPb/+HV1uITwBSJ6zr3c7IS0elS125GcPLqFo1Gvxwk3T8dqRGoxP\nTcCy/MxBJynFOvPyegtWzMzGTG/oKBwNQCazBa8fvQCOJ3jn2/qo1HAadcbct2yJQBCcl7EMpmTE\nw5CsGe7lUUY5l6rmSFDJ0dHV05jvOd4IN9f/sW+tvdSy+5YGst7QI893J0kzEpT4uqpt0MYcAHKT\nNLh5Vg6WTssY9L4ASPNTbS4OiWp5WBuAxPyBcJOLTg2nUWfMfQWEAEjlS8cbbLhmUvpwLo1CAdB3\nNUdduwOfV1yUjBUgOCgf+EzXIUSYW+k77CKQtk4XUnppTPK9mQDwu7EQQkKWp+2NDocbWk14TdDA\nR0P3TYFBB4U8/HIK4WTUGXOxbIn31tgCwh19dm7SsK6LQrkUJrMF//HxGbg4Hl+cu+hXhcL5JBMZ\nBthV3oCPTjb1Gg745kIHmm0uxCnlPd4PvJn4/jucZXlWp6fXEsyBUtvWhQXjw6/YKt7kDp5vxXf1\nVimXEU3e+agz5gAwMTUO+dlaTMlMwN5TTRifGo9ZOdHzR6FQgiFKtAY2+ohj08ARMD6OitvD4+Wv\nq/DAVWP9vPg9xxuwq7wRBAS7vmsIOf7bZHXir4drMHeQsWiLw4MxyXED/v1ATGYLjta2Y9GktLDt\n0xfxs/7tSC0OV7f1KzcxlIwqY+4bL69q68Ky/Ey05CZBIWNpBygl6hHj2YGP+ka9FusWjENdRxcm\nZSRg0/5KOD08eABHqtvxbZ3Qrg/AL18EhB7/NZkt+L+TTeAJwV8HqW3e4fBAqw6PCRK/204Pj2f+\n7zQyElURMbJCtVHPztloYERYsP6WZPWmCe3hiF+ZFIUSjRj1Wvzp5pmYm5fUw4hmalW4+TI9Vhmz\nsWW1ETlJKjDwr0Txvf6BgU2blxKBvZROivTnO2lzeIJW1AwE8bMB4dV7D0S8oUbj/IOY98x3mOqx\n8dMKcPylS7LEQRSiSqKo30xAwEZpiy6F4susnKSgyoldbg4a74QdMfTSbGvyu9YBQMYw3pZ0YMXM\n7JBLAsX6cI4nvRoz3ydg3++kWBIsJlN5QiALU7PeYAS6QkGMnb904DweWhA+KeJwENPG3GS24AWv\nIQcuXZJl1Gvx038bj9NNdtw0MwtGvVbSb6ZQYhmHm4PGR18oM1GFJ5ZMwocnGvHw1d1G58b8TNS2\nd0GfpMZT3w9d0dSo1+LfF09EudmClcbgMzpLatvh9hk5t+d4A/Ycb8AHxxvB8d2j50RRr3DUgQ/l\nYIlwSxGHi5g25qKWhAjbj4GrmVo1pmdrkZ+VKP2O+HhGocQqXW5e8sxF8pI1GJPiP/w5JV6J1Hgl\nBvMgOjM7ETp1zyoYEd+ELBhg13eNfoOrPZxg4D88KYh6hWuu6FAOlmAZRnoKiBZi2piL3XJODw+G\nAR5fMvGSf8wuF4d4XfdFr5KzsAbpqKNQYgmnh+sxINrl4WEJk46LL4KgVXAHSAylrDJmw83xaLG5\n8MU5/6dfuYxFR5dHqrqJtkRif9CqFThU3YazzfaoGTEX08bcN36lT9LgphlZl/wdu5tDnNLXmMui\nWgmNQukvgTXgTo73u7at3oRjMDmAUFDLWTg8PfVZxFi5m+MhYxj8culklNV1+G0Tr5Thf1fNwJul\ndX3KFkQ7HV1u/O/nlV5dp+goUYyeZ4QBIsav5uQm9WtEVKfL35ir5dEta0mhDBSXh4fSJwxwtsWG\nSWnxg96vuhfPXOyu5nojw5EAABx8SURBVIkgXlfZYsey/CxJxE7GABPT4rDtaC2uHJOMLauNfhK8\nsYTZ4oCbu3RVz1AS88bcwwuVKGOSNahu7bzk9l0uzi+2qFawfkNgKZSRgovjJUlbADjbZMekjHAZ\n856e+ewcoYuaZYSu6rl5QvjhpaJZ+N6EFMzJTcLxBhs+r2zFxv2VAOAnwRtLXJaTBIYZWHlnpIh5\nY+7y8FDJWYxJiUO1zxTx3ggsh1LJWbhoApQyAhE88+5rva3LjZQ4pVdgbuAZULm3yzSQ6rYuTEqL\nQ3qCEleOTca8vGQAwtPzsvwstNjd4L3Su9HizQ6UAkMSMhKUmJPbs+Z/uIjpmDnQnfhJUMlhG0As\nUCVn4QwS/6NQYhmWYdDp5hCvlEv13iKEEKiVsj5+O3TK6jrw3CdnILpFzbZWnGiwSkYuNU4BhsGQ\n1IIPBRfaHehy89AnqaPCkAMjwpjzPbL4oaCSy2iYhRLzBM6aUMpY2J0cPDyPrQercdW4FMi8CdIE\nlTwsnZeizgshwPEGq59iIU/gV6GSEqeERiEbslrwSGIyW/Dvu47D6eHx4ckmrOil3n6oCckKlpWV\nobi42O+15557Dm+++ab08/bt27Fq1SoUFRVh//794VllHwjGXPAyxAfHUCauqOSspNtMoYwUFHIW\n51vt2GlqwN+P1OLH75qk2vKOLjeO1bYPamJOo9UpzfDcWd6AyhY7fOWNWAZ+nre5wyE9OcdqnFzE\nVzqA5wc/7i5c9Pv2vHXrVuzevRsajTDAobW1FU888QSqqqpw3333AQCam5uxbds2vPfee3A6nViz\nZg0WLFgApTK8Mpe+OH0eIRNUchyqasPP3v+u3yVDKjkLBTXmlBgnsAlIKWNg7nCCExUUOQKrwwOT\n2YI3Surg4Qk+r7g44HhvvbeaQ4QnwMqZQmnw6SYbcnXdzUomswU/83qy694xRU2MeaD4SgegH42K\nQ0W/PfO8vDxs3rxZ+tlut2P9+vUoLCyUXjOZTJg9ezaUSiUSExORl5eHU6dOhXfFAfiGWcakaPBZ\nRQtc3pIht+fSSRaVnIUiirq4KJRwoJCx0GnkkigUyzJYNClNEMoKUP0bCNlatd/PchmDZflZeOr7\nk1E0O8fvvaESwRoqxP6WBxeMxbLpGVFzY+q3FVu6dCnk8m5H3mAwYNasWX7b2Gw2JCYmSj/Hx8fD\nZrOFYZm94+J4qEVjnhwHp0/8mweQpOk5TcUXtZyFnHrmlBgiMD5uMlvwbV2HX9hEKWMRr5Rjy2pB\nZfEH0zJwWW6S5FUOdtBxllaFyWlxyEpU4sb8TLxUNEsyapmJKr88VLiOGU0Y9VrcMz8PmYmq4V6K\nRFgToAkJCbDb7dLPdrvdz7hHAoeHh9abzMlOUuNCR3d5IssI8UERk9mCMnOH3zgtlVwmNTVQKLGG\nr0LhOnN3CEMpY+DieMzKScIsfZKUnAyXIJWLIxiXFo+vz7f2ENxq63Sj3tI9tm4oRbBGM2GNLxiN\nRpSUlMDpdMJqtaKyshKTJ08O2/6DJTZ9wyxy70BXBStU0Sp8vADxoj9W04F175ikfagVbFSJ5VAo\nl8I3Pt6bRr9Szkox7dZOob5cRPQqB2NUK5pt+PRMC2xOzu/7ZDJb8Mz/ncaZZrvf6+E4ZjQiYwXB\nrWggrJ55eno6iouLsWbNGhBC8Oijj0KlCs9jiK/ug29iM1BgSMYw+LeJqajrcODfF3cLbwW76I16\nLU40WFHd2tnn8FsKJVrpbfqQQtbdDHfR7gJAwnqNt3W5peSq7/cpWHx8JH+vEpRy2FwcdJrhdwhD\nMua5ubnYvn2732vr16/3+7moqAhFRUWDX1kA4kXiq4Vg1GulDlBAMPjl9VbwhPQQHSow6ITOTx+x\nfpPZgoffLR8xWXbK6MA3Zm7Ua7HxpunY/q3Zz/NVyli4OR4mswVfn28FRwj2nOh9wHOoxCtlYBkG\nBP5DKoZqSES00NbpxmtHarBoUvqw246YaRrqzQPxDbOI8/l4AjCE+HkFRr0Wt8zWQ8Yy+N6ENBj1\nWrx6uGZUeRGUkcmkjAQsGJfid+0qZQw4HlL1SqATNBhMZgu+uWABTwhYlsFjiyb4fc9GS3zcZLbg\n70drwfEE73xbP+zO4PA/G/QT8SIpMCThTzfPlE6ab9OQb9acZf3rP01mC0412nD1+FTpd0dilp0y\n8gmsKfdwfI8kvkLGQiVnInKN+w41BiF+RQbAyI2PB1JS2w4PT8DDP18RLLcXSiPjQIkZzxwQLpLv\nTUzDmJQ46TXfpiFfr+BCe5df04KY8X/43XLpDjqavAjKyMXNkR69EkoZC6Wcjcg1PtpCKb0hnAf/\nmcLBcnsAsG67CW6ej6j2eUwZcwDITVKjrr0LOm/9OE+IX524aKRfOVgNDy+811vy03d7CiVWCKwz\nF42ELwo5I2mZh/sap06QgFGvxa+un4IvKi7iljk53aFbD9/DW3f1Yn/CSewZc50GZ5psyM8WTkbg\nhS0Sp5TB4eaQoJILE8VZpsekcgplJODmSA9JCpWM9RtMEW6oEyQwOycJXS7OL3QrYxkQ3t/WyFlG\ncC4jaH9izpjrk9T4rKLlkttpFDJ0ugRjbtRrcec8AzpdHJZMGf6sM4UyGBhGkLEVK7Y8XBDP3Btm\noUSWOKUMnT6DOox6LVbNysbRmnZc5h3WYdRrccscPcrqLPjpNRMiZn9izpirAsa89TZlPM5rzH35\nyTXjwQ5mLDmFEgWwDAOOAHLvpSw8cfpf10o5OyhpaEr/UAexM50uDjVtXahq7cSeE43YstqIBJUc\ncyIckor5v3aDxRk0S6wJuGMSgBpyyohAHtB1KMTM/a/tU402nG22R7R6gtLdde5Lg9UhlUiLMXJP\nkFBYuIlpY24yW/DhySa8dKDKr3UYEDxzcU6hhyeSMD+FEusoZCw8PmPbhJh591fZZLZg/XvlKPdW\nVlCDHlkCR/Bla9WSWqUYIx8K8xOTxlwtZ+Fwc0K9Kx98Qnacsvvx51yLHeNS43rbHYUSUwieeYAx\n9/HMe9NroUQGb8W9VEsOAFtWG7FqVjbuvtwghVYarcGjCOEi5mLmAJCj0+BChwMFBp0wJYj0zBLH\nKWS44PXMTzZapeGyFEqsI5cx8PDdYRYPz/uJxdE68KHHt5cFDJCfrcWT107C7z6rBCEEjVYnPjrZ\nJAgBRqjWPCaNea5OqDX/3oRU3DAtA4ZkTY96V42PZ15vcSJbGz26wxTKYBDL3EQCSxNpHfjQU1Lb\nDpeH93bFAhs/rcDEtHhcPiYZR6rbUW9xBBUmCyexacyTNCit7YDV6cHE9HisKcjtsc35i534rKIF\n49PiAaCH8BaFEqv0jJn3LE2kdeBDixgXF3OhvFcb6u7LDfjFnpOwOT2QeZOlkXpaikljnqiWw+b0\n4KLdjbT4nvNFxenZLg+PY7Ud+MG0jGFYJYUSGcQGOBE3T+iAlWHGqNfi8rxkHPPq1oizFMrrrdh/\n9iI4nkDGAvPHJOP+K8fQDlBfCID/397dB0VZ7n8cf+/CrvIgOgIKKHoWMQSTwkDzCZ+jOJWesjrW\naI1Tppw8OTaNnTPTyc7o0Ro7OeOEhpVTWIwaHTqKUcdMSwkECkGMlHiQIHFRnhFYdu/fHw77W9QU\nENjdm+/rLxgY/X7c2+9ee133dd3VTa1436CZ2y4AmcwW67nOQqjB1WkWmzlzs6XT3Syi/zW0tHNP\n4FCemz620/TW7szz1kPJLMrVzYyyaegGfvy1nqbWdnQu2k7/QLbH5Wo1Ghbc4WvHKoXoXS7a629N\nvHbTkOhf3xVfYuY4b4J9PG7YizoWo309rx989hanbeZnLzZyouQyigLJeZ3PEu5YAIo/XoK/12Bm\njfO2c7VC9B5Xl2tvTbx+zlz0r+JLzTeczrVdjJ48eigny/ruNlGnvALyKus5UXIZi4J1KuXae2nD\nA7wIGeFJyaVm2TQhVEWn1WCy2O4A7XxyqOhfFxvb+OlCA/m/Ndzw5x3nu981aqj1nvS+4JTNPKe8\nttNpiVqN5rrV4bzKevbnVnLmQoPsghOqUlbTTGpBlfWaVhTl6iMRRb/Lq6wntaCK7PO1du8zTtnM\n7wkcht5Vi5arT8d+eX7wdYsKOeW1193XKYSzy6us5+2jxRw4XWX35iFsHlWJ/fuMU86Zd2VThOyC\nE2qUU16L2SyDFEfhSH3GKZs53HpThOyCE2p0T+AwdK6dH2yeUXrZ3mUNWN3tMx3ns/RFT9Ioyu89\nq+d6p06dYuvWrSQmJlJWVsYrr7yCRqNh/PjxvPbaa2i1WlatWkVtbS06nY5Bgwbx3nvvXffnGI03\nXigQQtxaXmU9O46XsHqmgfAALxLSS1k5/Q/2LkvcQl5lPSv3nkK5jfNZfH2H/O7Pujwy37VrF//9\n739xc3MDYPPmzaxdu5apU6fyj3/8g6+//pqFCxdy/vx5UlNTZfu8EH0kPMCLu0cNtTaCrg/HhD11\nnPLaV+ezdHkBdMyYMWzfvt36fUFBAVOmTAEgOjqa9PR0qqurqa+vZ9WqVSxdupRvvvmm1woVQnTW\njQ/VwgF03LjhoqFP5te7PDKPiYnh119/tX5v+wxCDw8PGhoaMJlMrFixguXLl1NXV8fSpUsJDw/H\n21s27QjRm0YMGURVQyt+XoPtXYroor5ex+vxAqjW5iyIpqYmvLy88PHx4c9//jOurq54e3sTGhpK\nSUmJNHMheplhuDull5ulmTuZvjzNssf3mYeFhZGZmQnAt99+S2RkJOnp6axduxa42uDPnTtHUFBQ\n71QqhLD6g7c7JZev2LsM4UB6PDJfv349r776Kv/+978JCgoiJiYGFxcXjh8/zuOPP45Wq2XdunUM\nHz68N+sVQgDD3HTUXTHZuwzhQLp1a2JvkVsThbh9O0+UsmrGH+TWxAHkZrcmOuV2fiHEVXmV9eRW\n1Mm2fiHNXAhn1djaTtz+PLLP18k5LUKauRDOqqnNbH2IsJzTIqSZC+GkZo8bjlarQUPfbEIRzsVp\nD9oSYqCbHezDcHcdI4cM4qE7/eQwuQFOmrkQTir/twaqm9q41NTGOWPTdc+fFAOLTLMI4aRyymvR\nKFef+i5z5kKauRBOquNs8746uEk4F9k0JIQTy6uslwewDCA32zQkzVwIIZyE7AAVQgiVk2YuhBAq\nIM1cCCFUQJq5EEKogDRzIYRQAbvczSKEEKJ3ychcCCFUQJq5EEKogDRzIYRQAWnmQgihAg7bzNWy\nLquGHCaTicrKSnuX0StMJhNZWVn2LqNPqOFaA/XkgP7N4lDNvKioiA0bNgCg0WjsW0wPJSUlsXHj\nRlJSUgDnzdEhJSWFZcuWcfToUXuXctsOHz7M4sWLrdeYs9u3bx9btmxx+mtNURRKSkp45ZVXAOfN\nAfbNYvdmbvvOVVRUxL59+8jOzgbAYrHYq6xu6ahzz549nDhxgocffpjk5GT27dsHON9Iw2Kx0NbW\nxuuvv05mZia7du3iySeftOZwtjyVlZXExcWRlpbGY489xuLFiwFob2+3c2XdZ7FYUBSFnTt3cuzY\nMf70pz+RlpbG7t277V1aj2k0GsrLy0lJSeHEiROA811jHfXaM4tdm3ljY6P164sXL5KVlcXSpUut\nIyet1u7vNbdkm6GoqIj58+cTHh7OnDlz0Gq1mEwmpxppdOTR6/XodDq8vLz47LPPePbZZ4mLi6O4\nuNhp8nRkaW9v55lnnmHr1q2Eh4eTkZEBgKurcz1oq7GxEUVR0Gg0GI1G5s2bR0hICC+99BIffPAB\nP//8s71L7LKWlhbrm2ltbS05OTksWbKEt956C3Cu0XldXR0mkwmApqYmsrKy7JLFZYOdPnPGx8ez\ne/duiouL8fLywmAwALB8+XK++OILamtriYiIwGKxOOwLa5vB3d2dWbNmERkZSXZ2Nps2bcLV1ZVj\nx44xd+5cp3hj6shz7tw5Ro4cyYwZM9iyZQvjxo1j48aNFBcXk52dzT333INer7d3uTcVHx/PBx98\nQGlpKf7+/kyePBmA8+fPY7FYmDJlikNfW9fqeG1KSkpwdXWlra2N1tZWwsLCGDFiBN988w3t7e1E\nRUVZG76jqqioID4+Hk9PTwICAtBqtWi1Wp5++mm++uorjEYjkydPdvgcAAkJCcTHx1NaWkpjYyOh\noaFoNBq7ZLFLhzl58iQFBQVs3rwZX19fPv30U3Jycpg9ezYAf//739mzZw/Nzc1otVqH/Mhlm8HH\nx4fPP/+c8vJytFotQUFBpKWl8eabb5Kfn+8UIybbPH5+fiQmJlrXMGJjYwH461//SmZmJhcvXrRz\ntTfXkWXLli14e3uTkpLC999/D1ydpvjuu+8A5/jkB51fG29vb44dO0ZdXR01NTX87W9/Y+XKldx/\n//0cO3aM6upqh2+AP/zwA0ePHiUvL4/Lly+j1+utb7Yvv/wy+/fvp6amxuFz/PTTT2RnZ7Nt2zZm\nzpzJF198wZEjR5g2bRrQ/1nscjWfPn2ayMhIfH19eeCBB5g4cSIpKSnWuefQ0FAiIiIcekHENkNs\nbCxhYWGkpqYCYDabcXFxwWg0EhwcjJubm52rvbVrX5NJkyaRmprKjBkz0Ol0XLhwgcuXLxMaGoqX\nl2M/0ebaLGFhYRw6dAiLxcK0adPw8/Pj8OHDgHPMzV57rQUHB2M0GomLiyMmJoYXXniB2NhYIiMj\n8fHxsXe5t1RRUUFsbCyNjY38+OOPAAwePJj29nYmTJjA5MmTnWKRuqSkhPDwcHx9fbn33nt56KGH\nSExMxGw2A/R7lj6fZmlpacFsNuPq6mr9WNva2sr27dtZtmwZ7u7u6PV6zp49i6enJ/7+/gDMnDkT\nnU7H+PHj+7K8LulqhnPnzmGxWMjPz+edd97h4MGD/PGPf7S+UzuK7uQByMjIYNeuXRw4cIAHHnjA\nOopyBN25vjw8PAgICMBoNFJRUUFUVJTDDRS6ksfV1ZXCwkK8vLzQ6/V88sknJCUlMXv2bCZMmGDv\nCFa2WTpYLBYCAgKYO3cuhYWF/Pbbb/j7+zN06FAsFgtarZbp06ej1+sJDg62Y/Wd2U7JdXx95coV\nPvzwQxYtWoROp8Pf35+8vDxMJpO19v7M0qfNPDExkU8++YSgoCB8fHxQFAVFUQgMDCQjI4OzZ88y\nbdo0hg0bxv/+9z/ryMJsNjNo0CCHaOTdyXD48GGmT5/OnDlzGDduHM899xxhYWH2jtBJT/LExMQw\nadIknn32WYfK050sX331FVFRUfj4+ODt7c28efMcbpqlu69NVFQUd911F+7u7rz44osO/dp0NECN\nRoOnpyeurq64u7tz5swZTCYTISEhaLVaLBaLwzXyhIQEjhw5gqenJ35+ftYsfn5+ZGZmUlRUxNSp\nU9HpdBQUFGAwGAgMDLT2sf7K0idXc1VVFfPnz+fSpUts2LDBOlroWOgoKipi+fLlpKam8v3333Pi\nxAnKysqsH09cXFz6oqxu6UmG0tJS66r2nXfe6VB3S9xunvHjxzvE6wI9y3L+/Hnr3ROjR492qEbe\n0/8vHa/NrFmzHOZau1kWuDpfXlFRAUBISAgBAQGcPn2a8vLyTr/nCJqbm1m/fj01NTUsXLiQ+vp6\n4Gp/0mg0FBYWEhMTw8mTJ/nss884fPgwx48ft74W/f3/pU9G5nq9np9//plZs2Zx4MABjhw5Qnl5\nOcHBwWzZsoW9e/eyevVqxowZw5kzZzhw4ACrV68mIiKit0vpsZ5mcKQpCFtqyqOmLKCuPLfKcvDg\nQRYsWMDQoUMBGDVqFCEhIYwZM8bOlV+vpaWFU6dO8eijj/Kf//yHqqoqjEYjQUFBbN68mU8//dT6\n6buyspK0tDRWrVrF1KlT7VLvbZ9n3nHLTVJSEu7u7ixatIiamho+/vhj0tPTWbx4MRMmTOCdd95h\n5MiRPP3004wbN6636u8VashgS0151JQF1JVH7VkKCwvZtm0b06ZNY8iQIRgMBt59911CQkJYsmQJ\ngYGB9i67M6WXrFmzRomNjVXMZrOiKIqSlpamJCcnW3+em5ur/OUvf7F+397e3lt/da9RQwZbasqj\npiyKoq48as7y4osvKo8//rhSXV2tKIqiZGVlOWyWHk+zGI1GPDw8AMjKyqK8vByLxUJeXh6zZ88m\nICCA0NBQrly5gl6vJz09neHDh1unUhxhbkwNGWypKY+asoC68gyELLm5ucyZMweDwUBaWhphYWGM\nHj2a9PR03N3diYqKAhwrS7enWS5cuMD27du5dOkS8+bNIzo6Gp1OR21tLQEBASxcuJCkpCQCAwNJ\nTU3l66+/prm5GbPZzPPPP09kZGRfZRlQGWypKY+asoC68gy0LB9//DFjx47lo48+oqioiIqKCtra\n2njhhRfsNi9+M91u5vHx8ZhMJh555BE+//xzampqWLdunfXdbdu2bRQWFrJz507a2tqor68nNzeX\nBQsW9EmAnlBDBltqyqOmLKCuPAM1i9lspq2tjdzcXIfbM2KrS808OTmZkydPEhgYSEVFBXFxcQQG\nBlJWVsbevXutixsdpkyZwhtvvMHcuXP7tPjuUEMGW2rKo6YsoK48ksUxs9zILefMt27dSn5+PitW\nrODLL78kNTUVvV7PjBkzcHNzw8XFhYKCAiZNmsTgwYOBq9vxR40axfDhw/sjwy2pIYMtNeVRUxZQ\nVx7J4phZfs8tdxo0NDTwxBNPMHHiRJ566ilGjBjBwYMHefDBBwkNDcXb25vW1lbc3d2tt/fMnDmz\nP2rvMjVksKWmPGrKAurKI1kcM8vvuelSrMVi4b777iM8PByAQ4cOER0dTVxcHJs2baKkpIT09HRq\na2sd9jhRNWSwpaY8asoC6sojWZxPlxdAGxsbeeaZZ9ixYwe+vr7s2LGDuro6qqurWb9+Pb6+vn1d\n621TQwZbasqjpiygrjySxTl0+UCHqqoqpk+fTkNDAxs3bmT8+PG89NJL6HS6vqyvV6khgy015VFT\nFlBXHsniHLrczLOyskhISKCgoIBFixbx8MMP92VdfUINGWypKY+asoC68kgW59DlaZbk5GSMRiMr\nVqxw+EeG/R41ZLClpjxqygLqyiNZnEOXm3nHCq8zU0MGW2rKo6YsoK48ksU53PapiUIIIezPcU6J\nEUII0WPSzIUQQgWkmQshhApIMxdCCBVwjKfACtEPMjMzWbt2LcHBwSiKQnt7O8uXLyc2NvaGv19Z\nWUlhYSHz5s3r50qF6D5p5mJAuffee3n77bcBaGpqYtmyZRgMBkJDQ6/73YyMDIqLi6WZC6cgzVwM\nWB4eHjzxxBMcOnSIPXv2cOHCBWpqaoiOjmbNmjUkJCTQ0tJCREQEo0ePZuPGjQAMGzaMf/3rXwwZ\nMsTOCYT4fzJnLgY0b29vzpw5w9133837779PUlISSUlJuLi4sHLlSh588EHmz5/Pq6++ymuvvUZi\nYiLR0dG899579i5diE5kZC4GtMrKSiIiIsjPzycjIwNPT0/a2tqu+71ffvmF119/HQCTyYTBYOjv\nUoW4KWnmYsBqbGxk//79LFmyhCtXrvDPf/6TsrIy9u3bh6IoaLVaLBYLAAaDgTfeeIOAgABycnIw\nGo12rl6IzqSZiwElIyODZcuWodVqMZvNrFmzBoPBwLp168jJycHNzY2xY8dy8eJF7rjjDnbs2MHE\niRPZsGED69evx2w2A7Bp0yY7JxGiMzmbRQghVEAWQIUQQgWkmQshhApIMxdCCBWQZi6EECogzVwI\nIVRAmrkQQqiANHMhhFCB/wPfCTmlVJB46wAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.suptitle(\"Apple stock in 2015\")\n", "f" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseAdj CloseVolume
Date
2015-08-03121.500000122.570000117.519997118.440002113.43715769976000
2015-08-04117.419998117.699997113.250000114.639999109.797668124138600
2015-08-05112.949997117.440002112.099998115.400002110.52557499312600
2015-08-06115.970001116.500000114.120003115.129997110.76609052903000
2015-08-07114.580002116.250000114.500000115.519997111.14131938670400
\n", "
" ], "text/plain": [ " Open High Low Close Adj Close \\\n", "Date \n", "2015-08-03 121.500000 122.570000 117.519997 118.440002 113.437157 \n", "2015-08-04 117.419998 117.699997 113.250000 114.639999 109.797668 \n", "2015-08-05 112.949997 117.440002 112.099998 115.400002 110.525574 \n", "2015-08-06 115.970001 116.500000 114.120003 115.129997 110.766090 \n", "2015-08-07 114.580002 116.250000 114.500000 115.519997 111.141319 \n", "\n", " Volume \n", "Date \n", "2015-08-03 69976000 \n", "2015-08-04 124138600 \n", "2015-08-05 99312600 \n", "2015-08-06 52903000 \n", "2015-08-07 38670400 " ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Zoom in on large drop in August\n", "aug = apple['2015-08-01':'2015-08-30']\n", "aug.head()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/fperez/usr/conda/envs/s159/lib/python3.6/site-packages/pandas/plotting/_core.py:1714: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n", " series.name = label\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "aug.plot.line(y=['High', 'Low', 'Open', 'Close'], marker='o', markersize=10, linewidth=1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data conversions\n", "\n", "One of the nicest features of `pandas` is the ease of converting tabular data across different storage formats. We will illustrate by converting the `titanic` dataframe into multiple formats." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### CSV" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "titanic.to_csv('titanic.csv', index=False)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNaNSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "\n", " new column \n", "0 0 \n", "1 0 " ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t1 = pd.read_csv('titanic.csv')\n", "t1.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Excel\n", "\n", "You may need to first install openpyxl:\n", "\n", "```\n", "pip install openpyxl\n", "```" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "t1.to_excel('titanic.xlsx')" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNaNSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man NaN Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "\n", " new column \n", "0 0 \n", "1 0 " ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t2 = pd.read_excel('titanic.xlsx')\n", "t2.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Relational Database" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/fperez/usr/conda/envs/s159/lib/python3.6/site-packages/pandas/core/generic.py:1534: UserWarning: The spaces in these column names will not be changed. In pandas versions < 0.14, spaces were converted to underscores.\n", " chunksize=chunksize, dtype=dtype)\n" ] } ], "source": [ "import sqlite3\n", "\n", "con = sqlite3.connect('titanic.db')\n", "t2.to_sql('titanic', con, index=False, if_exists='replace')" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNoneSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man None Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "\n", " new column \n", "0 0 \n", "1 0 " ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t3 = pd.read_sql('select * from titanic', con)\n", "t3.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### JSON" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "t3.to_json('titanic.json')" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageclassdeckembark_townembarkedfarenew columnsexsurvivedwho
022.0ThirdNoneSouthamptonS7.25000male0man
138.0FirstCCherbourgC71.28330female1woman
\n", "
" ], "text/plain": [ " age class deck embark_town embarked fare new column sex \\\n", "0 22.0 Third None Southampton S 7.2500 0 male \n", "1 38.0 First C Cherbourg C 71.2833 0 female \n", "\n", " survived who \n", "0 0 man \n", "1 1 woman " ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t4 = pd.read_json('titanic.json')\n", "t4.head(2)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNoneSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man None Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "\n", " new column \n", "0 0 \n", "1 0 " ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t4 = t4[t3.columns]\n", "t4.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### HDF5\n", "\n", "The [HDF5 format](http://proquest.safaribooksonline.com/book/physics/9781491901564/10dot-storing-data-files-and-hdf5/chp_storing_data_html) was designed in the Earth Sciences community but it can be an excellent general purpose tool. It's efficient and type-safe, so you can store complex dataframes in it and recover them back without information loss, using the `to_hdf` method:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/fperez/usr/conda/envs/s159/lib/python3.6/site-packages/pandas/core/generic.py:1471: PerformanceWarning: \n", "your performance may suffer as PyTables will pickle object types that it cannot\n", "map directly to c-types [inferred_type->mixed,key->block1_values] [items->['sex', 'embarked', 'class', 'who', 'deck', 'embark_town']]\n", "\n", " return pytables.to_hdf(path_or_buf, key, self, **kwargs)\n" ] } ], "source": [ "t4.to_hdf('titanic.h5', 'titanic')" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNoneSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man None Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "\n", " new column \n", "0 0 \n", "1 0 " ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t5 = pd.read_hdf('titanic.h5', 'titanic')\n", "t5.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Feather\n", "\n", "You may need to install the [Feather](https://blog.cloudera.com/blog/2016/03/feather-a-fast-on-disk-format-for-data-frames-for-r-and-python-powered-by-apache-arrow) support first:\n", "\n", "```\n", "conda install -c conda-forge feather-format\n", "```" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNoneSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
21female4.016.7000SThirdchildGSouthampton0
30female28.07.8958SThirdwomanNoneSouthampton0
40maleNaN7.8958SThirdmanNoneSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man None Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "2 1 female 4.0 16.7000 S Third child G Southampton \n", "3 0 female 28.0 7.8958 S Third woman None Southampton \n", "4 0 male NaN 7.8958 S Third man None Southampton \n", "\n", " new column \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t6 = t5.reset_index(drop=True)\n", "t6.head()" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "t6.to_feather('titanic.feather')" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedsexagefareembarkedclasswhodeckembark_townnew column
00male22.07.2500SThirdmanNoneSouthampton0
11female38.071.2833CFirstwomanCCherbourg0
21female4.016.7000SThirdchildGSouthampton0
30female28.07.8958SThirdwomanNoneSouthampton0
40maleNaN7.8958SThirdmanNoneSouthampton0
\n", "
" ], "text/plain": [ " survived sex age fare embarked class who deck embark_town \\\n", "0 0 male 22.0 7.2500 S Third man None Southampton \n", "1 1 female 38.0 71.2833 C First woman C Cherbourg \n", "2 1 female 4.0 16.7000 S Third child G Southampton \n", "3 0 female 28.0 7.8958 S Third woman None Southampton \n", "4 0 male NaN 7.8958 S Third man None Southampton \n", "\n", " new column \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t7 = pd.read_feather('titanic.feather')\n", "t7.head()" ] } ], "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.6.3" } }, "nbformat": 4, "nbformat_minor": 1 }