{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Introducing Pandas Objects\n", "\n", "Pandas objects can be thought of as enhanced versions of NumPy structured arrays in which the rows and columns are identified with labels rather than simple integer indices.\n", "\n", "Let's introduce these three fundamental Pandas data structures: the ``Series``, ``DataFrame``, and ``Index``." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The Pandas Series Object\n", "\n", "A Pandas ``Series`` is a one-dimensional array of indexed data:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.25\n", "1 0.50\n", "2 0.75\n", "3 1.00\n", "dtype: float64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([0.25, 0.5, 0.75, 1.0])\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "``Series`` objects wrap both a sequence of values and a sequence of indices, which we can access with the ``values`` and ``index`` attributes.\n", "\n", "The ``values`` are simply a familiar NumPy array:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.values" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ``index`` is an array-like object of type ``pd.Index``:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=4, step=1)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.index" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Immutable Index implementing a monotonic integer range.\n", "\n", " RangeIndex is a memory-saving special case of Int64Index limited to\n", " representing monotonic ranges. Using RangeIndex may in some instances\n", " improve computing speed.\n", "\n", " This is the default index type used\n", " by DataFrame and Series when no explicit index is provided by the user.\n", "\n", " Parameters\n", " ----------\n", " start : int (default: 0), or other RangeIndex instance\n", " If int and \"stop\" is not given, interpreted as \"stop\" instead.\n", " stop : int (default: 0)\n", " step : int (default: 1)\n", " dtype : np.int64\n", " Unused, accepted for homogeneity with other index types.\n", " copy : bool, default False\n", " Unused, accepted for homogeneity with other index types.\n", " name : object, optional\n", " Name to be stored in the index.\n", "\n", " Attributes\n", " ----------\n", " start\n", " stop\n", " step\n", "\n", " Methods\n", " -------\n", " from_range\n", "\n", " See Also\n", " --------\n", " Index : The base pandas Index type.\n", " Int64Index : Index of int64 data.\n", " \n" ] } ], "source": [ "print(pd.RangeIndex.__doc__)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Like with a NumPy array, data can be accessed by the associated index via the familiar Python square-bracket notation:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[1]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 0.50\n", "2 0.75\n", "dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[1:3]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### ``Series`` as generalized NumPy array\n", "\n", "It may look like the ``Series`` object is basically interchangeable with a one-dimensional NumPy array.\n", "The essential difference is the presence of the index: while the Numpy Array has an *implicitly defined* integer index used to access the values, the Pandas ``Series`` has an *explicitly defined* index associated with the values.\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "b 0.50\n", "c 0.75\n", "d 1.00\n", "dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])\n", "data" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['b'] # item access works as expected" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can even use non-contiguous or non-sequential indices:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 0.25\n", "5 0.50\n", "3 0.75\n", "7 1.00\n", "dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=[2, 5, 3, 7])\n", "data" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[5]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Series as specialized dictionary\n", "\n", "You can think of a Pandas ``Series`` a bit like a specialization of a Python dictionary.\n", "A dictionary is a structure that maps arbitrary keys to a set of arbitrary values, and a ``Series`` is a structure which maps typed keys to a set of typed values:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 38332521\n", "Texas 26448193\n", "New York 19651127\n", "Florida 19552860\n", "Illinois 12882135\n", "dtype: int64" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "population_dict = {'California': 38332521,\n", " 'Texas': 26448193,\n", " 'New York': 19651127,\n", " 'Florida': 19552860,\n", " 'Illinois': 12882135}\n", "population = pd.Series(population_dict)\n", "population" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "population.index" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "38332521" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "population['California'] # typical dictionary-style item access" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 38332521\n", "Texas 26448193\n", "New York 19651127\n", "Florida 19552860\n", "Illinois 12882135\n", "dtype: int64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "population['California':'Illinois'] # array-like slicing" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The Pandas DataFrame Object\n", "\n", "The next fundamental structure in Pandas is the ``DataFrame`` which can be thought of either as a generalization of a NumPy array, or as a specialization of a Python dictionary." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DataFrame as a generalized NumPy array\n", "If a ``Series`` is an analog of a one-dimensional array with flexible indices, a ``DataFrame`` is an analog of a two-dimensional array with both flexible row indices and flexible column names.\n", "\n", "You can think of a ``DataFrame`` as a sequence of _aligned_ ``Series`` objects.\n", "Here, by _aligned_ we mean that they share the same index:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "California 423967\n", "Texas 695662\n", "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", "dtype: int64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297,\n", " 'Florida': 170312, 'Illinois': 149995}\n", "area = pd.Series(area_dict)\n", "area" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
populationarea
California38332521423967
Texas26448193695662
New York19651127141297
Florida19552860170312
Illinois12882135149995
\n", "
" ], "text/plain": [ " population area\n", "California 38332521 423967\n", "Texas 26448193 695662\n", "New York 19651127 141297\n", "Florida 19552860 170312\n", "Illinois 12882135 149995" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "states = pd.DataFrame({'population': population, 'area': area})\n", "states" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "states.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additionally, the ``DataFrame`` has a ``columns`` attribute, which is an ``Index`` object holding the column labels:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['population', 'area'], dtype='object')" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "states.columns" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.indexes.base.Index" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus the ``DataFrame`` can be thought of as a generalization of a two-dimensional NumPy array, where both the rows and columns have a generalized index for accessing the data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### DataFrame as specialized dictionary\n", "\n", "Similarly, we can also think of a ``DataFrame`` as a specialization of a dictionary.\n", "\n", "Where a dictionary maps a key to a value, a ``DataFrame`` maps a column name to a ``Series`` of column data:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 423967\n", "Texas 695662\n", "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", "Name: area, dtype: int64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "states['area'] # \"feature\"" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Constructing DataFrame objects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### From a single Series object\n", "\n", "A ``DataFrame`` is a collection of ``Series`` objects, and a single-column ``DataFrame`` can be constructed from a single ``Series``:\n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
population
California38332521
Texas26448193
New York19651127
Florida19552860
Illinois12882135
\n", "
" ], "text/plain": [ " population\n", "California 38332521\n", "Texas 26448193\n", "New York 19651127\n", "Florida 19552860\n", "Illinois 12882135" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(population, columns=['population'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### From a list of dicts\n", "\n" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'a': 0, 'b': 0}, {'a': 1, 'b': 2}, {'a': 2, 'b': 4}]" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = [{'a': i, 'b': 2 * i} for i in range(3)]\n", "data" ] }, { "cell_type": "code", "execution_count": 49, "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", "
ab
000
112
224
\n", "
" ], "text/plain": [ " a b\n", "0 0 0\n", "1 1 2\n", "2 2 4" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(data)" ] }, { "cell_type": "code", "execution_count": 23, "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", "
abc
01.02NaN
1NaN34.0
\n", "
" ], "text/plain": [ " a b c\n", "0 1.0 2 NaN\n", "1 NaN 3 4.0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}]) # Pandas will fill missing keys with ``NaN``" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### From a two-dimensional NumPy array\n", "\n", "Given a two-dimensional array of data, we can create a ``DataFrame`` with any specified column and index names:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.30282887, 0.48376433],\n", " [0.53588853, 0.97428136],\n", " [0.94756199, 0.46766408]])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(3, 2)" ] }, { "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", "
foobar
a0.7599070.458958
b0.7767790.767430
c0.1315520.740137
\n", "
" ], "text/plain": [ " foo bar\n", "a 0.759907 0.458958\n", "b 0.776779 0.767430\n", "c 0.131552 0.740137" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(np.random.rand(3, 2),\n", " columns=['foo', 'bar'],\n", " index=['a', 'b', 'c'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### From a NumPy structured array" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([(0, 0.), (0, 0.), (0, 0.)], dtype=[('A', '\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
000.0
100.0
200.0
\n", "" ], "text/plain": [ " A B\n", "0 0 0.0\n", "1 0 0.0\n", "2 0 0.0" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(A)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The Pandas Index Object\n", "\n", "This ``Index`` object is an interesting structure in itself, and it can be thought of either as an *immutable array* or as an *ordered set* (technically a multi-set, as ``Index`` objects may contain repeated values).\n" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([2, 3, 5, 7, 11], dtype='int64')" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ind = pd.Index([2, 3, 5, 7, 11])\n", "ind" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Index as immutable array\n", "\n", "The ``Index`` in many ways operates like an array.\n" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ind[1]" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([2, 5, 11], dtype='int64')" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ind[::2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "``Index`` objects also have many of the attributes familiar from NumPy arrays:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5, (5,), 1, dtype('int64'))" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ind.size, ind.shape, ind.ndim, ind.dtype," ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "One difference is that indices are immutable–that is, they cannot be modified via the normal means:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "Index does not support mutable operations", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mind\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/Developer/py-venvs/sphinx-venv/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m__setitem__\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 4275\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mfinal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4276\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__setitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4277\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Index does not support mutable operations\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4278\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4279\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: Index does not support mutable operations" ] } ], "source": [ "ind[1] = 0" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Index as ordered set\n", "\n", "The ``Index`` object follows many of the conventions used by Python's built-in ``set`` data structure, so that unions, intersections, differences, and other combinations can be computed in a familiar way:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "indA = pd.Index([1, 3, 5, 7, 9])\n", "indB = pd.Index([2, 3, 5, 7, 11])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "Int64Index([3, 5, 7], dtype='int64')" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indA.intersection(indB) # intersection" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([1, 2, 3, 5, 7, 9, 11], dtype='int64')" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indA.union(indB) # union" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([1, 2, 9, 11], dtype='int64')" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indA.symmetric_difference(indB) # symmetric difference" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Data Indexing and Selection\n", "\n", "To modify values in NumPy arrays we use indexing (e.g., ``arr[2, 1]``), slicing (e.g., ``arr[:, 1:5]``), masking (e.g., ``arr[arr > 0]``), fancy indexing (e.g., ``arr[0, [1, 5]]``), and combinations thereof (e.g., ``arr[:, [1, 5]]``).\n", "\n", "Here we'll look at similar means of accessing and modifying values in Pandas ``Series`` and ``DataFrame`` objects.\n", "If you have used the NumPy patterns, the corresponding patterns in Pandas will feel very familiar, though there are a few quirks to be aware of.\n", "\n", "## Data Selection in Series\n", "\n", "A ``Series`` object acts in many ways like a one-dimensional NumPy array, and in many ways like a standard Python dictionary." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Series as dictionary\n", "\n", "Like a dictionary, the ``Series`` object provides a mapping from a collection of keys to a collection of values:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "b 0.50\n", "c 0.75\n", "d 1.00\n", "dtype: float64" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])\n", "data" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['b'] # mnemonic indexing" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'a' in data # dictionary-like Python expressions..." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['a', 'b', 'c', 'd'], dtype='object')" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.keys() # ...and methods." ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(data.items())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "``Series`` objects can even be modified with a dictionary-like syntax:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "b 0.50\n", "c 0.75\n", "d 1.00\n", "e 1.25\n", "dtype: float64" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['e'] = 1.25\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This easy mutability of the objects is a convenient feature: under the hood, Pandas is making decisions about memory layout and data copying that might need to take place." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Series as one-dimensional array\n", "\n", "A ``Series`` builds on this dictionary-like interface and provides array-style item selection via the same basic mechanisms as NumPy arrays – that is, *slices*, *masking*, and *fancy indexing*:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "b 0.50\n", "c 0.75\n", "dtype: float64" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['a':'c'] # slicing by explicit index" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "b 0.50\n", "dtype: float64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[0:2] # slicing by implicit integer index" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "b 0.50\n", "c 0.75\n", "dtype: float64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[(data > 0.3) & (data < 0.8)] # masking" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "because" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a False\n", "b True\n", "c True\n", "d False\n", "e False\n", "dtype: bool" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(data > 0.3) & (data < 0.8)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "a 0.25\n", "e 1.25\n", "dtype: float64" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[['a', 'e']] # fancy indexing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that when slicing with an explicit index (i.e., ``data['a':'c']``), the final index is *included* in the slice, while when slicing with an implicit index (i.e., ``data[0:2]``), the final index is *excluded* from the slice." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Indexers: loc, iloc, and ix\n", "\n", "If your ``Series`` has an explicit integer index, an indexing operation such as ``data[1]`` will use the explicit indices, while a slicing operation like ``data[1:3]`` will use the implicit Python-style index." ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 a\n", "3 b\n", "5 c\n", "dtype: object" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])\n", "data" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'a'" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[1] # explicit index when indexing" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3 b\n", "5 c\n", "dtype: object" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[1:3] # implicit index when slicing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because of this potential confusion in the case of integer indexes, Pandas provides some special *indexer* attributes that explicitly expose certain indexing schemes.\n", "\n", "These are not functional methods, but attributes that expose a particular slicing interface to the data in the ``Series``." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "First, the ``loc`` attribute allows indexing and slicing that always references the explicit index:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a'" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.loc[1]" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 a\n", "3 b\n", "dtype: object" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.loc[1:3]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ``iloc`` attribute allows indexing and slicing that always references the implicit Python-style index:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3 b\n", "5 c\n", "dtype: object" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.iloc[1:3]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "A third indexing attribute, ``ix``, is a hybrid of the two, and for ``Series`` objects is equivalent to standard ``[]``-based indexing.\n", "\n", "The purpose of the ``ix`` indexer will become more apparent in the context of ``DataFrame`` objects." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Data Selection in DataFrame\n", "\n", "Recall that a ``DataFrame`` acts in many ways like a two-dimensional or structured array, and in other ways like a dictionary of ``Series`` structures sharing the same index." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "area = pd.Series({'California': 423967, 'Texas': 695662,\n", " 'New York': 141297, 'Florida': 170312,\n", " 'Illinois': 149995})\n", "pop = pd.Series({'California': 38332521, 'Texas': 26448193,\n", " 'New York': 19651127, 'Florida': 19552860,\n", " 'Illinois': 12882135})" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
areapop
California42396738332521
Texas69566226448193
New York14129719651127
Florida17031219552860
Illinois14999512882135
\n", "
" ], "text/plain": [ " area pop\n", "California 423967 38332521\n", "Texas 695662 26448193\n", "New York 141297 19651127\n", "Florida 170312 19552860\n", "Illinois 149995 12882135" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.DataFrame({'area':area, 'pop':pop})\n", "data" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "California 423967\n", "Texas 695662\n", "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", "Name: area, dtype: int64" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['area'] # columns can be accessed via dict-style indexing" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "California 423967\n", "Texas 695662\n", "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", "Name: area, dtype: int64" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.area # alternatively, use attribute-style access with column names" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "this dictionary-style syntax can also be used to modify the object, in this case adding a new column:" ] }, { "cell_type": "code", "execution_count": 82, "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", "
areapopdensity
California4239673833252190.413926
Texas6956622644819338.018740
New York14129719651127139.076746
Florida17031219552860114.806121
Illinois1499951288213585.883763
\n", "
" ], "text/plain": [ " area pop density\n", "California 423967 38332521 90.413926\n", "Texas 695662 26448193 38.018740\n", "New York 141297 19651127 139.076746\n", "Florida 170312 19552860 114.806121\n", "Illinois 149995 12882135 85.883763" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['density'] = data['pop'] / data['area']\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### DataFrame as two-dimensional array\n", "\n", "``DataFrame`` can also be viewed as an enhanced two-dimensional array:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[4.23967000e+05, 3.83325210e+07, 9.04139261e+01],\n", " [6.95662000e+05, 2.64481930e+07, 3.80187404e+01],\n", " [1.41297000e+05, 1.96511270e+07, 1.39076746e+02],\n", " [1.70312000e+05, 1.95528600e+07, 1.14806121e+02],\n", " [1.49995000e+05, 1.28821350e+07, 8.58837628e+01]])" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.values # examine the raw underlying data array" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[4.23967000e+05, 6.95662000e+05, 1.41297000e+05, 1.70312000e+05,\n", " 1.49995000e+05],\n", " [3.83325210e+07, 2.64481930e+07, 1.96511270e+07, 1.95528600e+07,\n", " 1.28821350e+07],\n", " [9.04139261e+01, 3.80187404e+01, 1.39076746e+02, 1.14806121e+02,\n", " 8.58837628e+01]])" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.values.T" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
CaliforniaTexasNew YorkFloridaIllinois
area4.239670e+056.956620e+051.412970e+051.703120e+051.499950e+05
pop3.833252e+072.644819e+071.965113e+071.955286e+071.288214e+07
density9.041393e+013.801874e+011.390767e+021.148061e+028.588376e+01
\n", "
" ], "text/plain": [ " California Texas New York Florida Illinois\n", "area 4.239670e+05 6.956620e+05 1.412970e+05 1.703120e+05 1.499950e+05\n", "pop 3.833252e+07 2.644819e+07 1.965113e+07 1.955286e+07 1.288214e+07\n", "density 9.041393e+01 3.801874e+01 1.390767e+02 1.148061e+02 8.588376e+01" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.T # transpose the full DataFrame object" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([4.23967000e+05, 3.83325210e+07, 9.04139261e+01])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.values[0] # passing a single index to an array accesses a row" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 423967\n", "Texas 695662\n", "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", "Name: area, dtype: int64" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['area'] # assing a single \"index\" to access a column" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Using the ``iloc`` indexer, we can index the underlying array as if it is a simple NumPy array (using the implicit Python-style index)" ] }, { "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", "
areapop
California42396738332521
Texas69566226448193
New York14129719651127
\n", "
" ], "text/plain": [ " area pop\n", "California 423967 38332521\n", "Texas 695662 26448193\n", "New York 141297 19651127" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.iloc[:3, :2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Similarly, using the ``loc`` indexer we can index the underlying data in an array-like style but using the explicit index and column names:" ] }, { "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", "
areapop
California42396738332521
Texas69566226448193
New York14129719651127
Florida17031219552860
Illinois14999512882135
\n", "
" ], "text/plain": [ " area pop\n", "California 423967 38332521\n", "Texas 695662 26448193\n", "New York 141297 19651127\n", "Florida 170312 19552860\n", "Illinois 149995 12882135" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.loc[:'Illinois', :'pop']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Any of the familiar NumPy-style data access patterns can be used within these indexers." ] }, { "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", "
popdensity
New York19651127139.076746
Florida19552860114.806121
\n", "
" ], "text/plain": [ " pop density\n", "New York 19651127 139.076746\n", "Florida 19552860 114.806121" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.loc[data.density > 100, ['pop', 'density']]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Any of these indexing conventions may also be used to set or modify values; this is done in the standard way that you might be accustomed to from working with NumPy:" ] }, { "cell_type": "code", "execution_count": 69, "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", "
areapopdensity
California4239673833252190.000000
Texas6956622644819338.018740
New York14129719651127139.076746
Florida17031219552860114.806121
Illinois1499951288213585.883763
\n", "
" ], "text/plain": [ " area pop density\n", "California 423967 38332521 90.000000\n", "Texas 695662 26448193 38.018740\n", "New York 141297 19651127 139.076746\n", "Florida 170312 19552860 114.806121\n", "Illinois 149995 12882135 85.883763" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.iloc[0, 2] = 90\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Additional indexing conventions" ] }, { "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", "
areapopdensity
Florida17031219552860114.806121
Illinois1499951288213585.883763
\n", "
" ], "text/plain": [ " area pop density\n", "Florida 170312 19552860 114.806121\n", "Illinois 149995 12882135 85.883763" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['Florida':'Illinois'] # *slicing* refers to rows" ] }, { "cell_type": "code", "execution_count": 71, "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", "
areapopdensity
New York14129719651127139.076746
Florida17031219552860114.806121
\n", "
" ], "text/plain": [ " area pop density\n", "New York 141297 19651127 139.076746\n", "Florida 170312 19552860 114.806121" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[data.density > 100] # direct masking operations are also interpreted row-wise" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Operating on Data in Pandas\n", "\n", "One of the essential pieces of NumPy is the ability to perform quick element-wise operations, both with basic arithmetic (addition, subtraction, multiplication, etc.) and with more sophisticated operations (trigonometric functions, exponential and logarithmic functions, etc.).\n", "\n", "Pandas inherits much of this functionality from NumPy.\n", "\n", "Pandas includes a couple useful twists, however: for unary operations like negation and trigonometric functions, these ufuncs will *preserve index and column labels* in the output, and for binary operations such as addition and multiplication, Pandas will automatically *align indices* when passing the objects to the ufunc." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Ufuncs: Index Preservation\n", "\n", "Because Pandas is designed to work with NumPy, any NumPy ufunc will work on Pandas ``Series`` and ``DataFrame`` objects:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 6\n", "1 3\n", "2 7\n", "3 4\n", "dtype: int64" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = np.random.RandomState(42)\n", "ser = pd.Series(rng.randint(0, 10, 4))\n", "ser" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 7, 5, 1],\n", " [4, 0, 9, 5],\n", " [8, 0, 9, 2]])" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng.randint(0, 10, (3, 4))" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
ABCD
06382
14264
28613
\n", "
" ], "text/plain": [ " A B C D\n", "0 6 3 8 2\n", "1 4 2 6 4\n", "2 8 6 1 3" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(rng.randint(0, 10, (3, 4)), columns=['A', 'B', 'C', 'D'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If we apply a NumPy ufunc on either of these objects, the result will be another Pandas object *with the indices preserved:*" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 403.428793\n", "1 20.085537\n", "2 1096.633158\n", "3 54.598150\n", "dtype: float64" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(ser)" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
ABCD
0-1.000000e+000.707107-2.449294e-161.000000e+00
11.224647e-161.000000-1.000000e+001.224647e-16
2-2.449294e-16-1.0000007.071068e-017.071068e-01
\n", "
" ], "text/plain": [ " A B C D\n", "0 -1.000000e+00 0.707107 -2.449294e-16 1.000000e+00\n", "1 1.224647e-16 1.000000 -1.000000e+00 1.224647e-16\n", "2 -2.449294e-16 -1.000000 7.071068e-01 7.071068e-01" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sin(df * np.pi / 4) # a slightly more complex calculation" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## UFuncs: Index Alignment\n", "\n", "For binary operations on two ``Series`` or ``DataFrame`` objects, Pandas will align indices in the process of performing the operation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Index alignment in Series\n", "\n", "Suppose we are combining two different data sources, and find only the top three US states by *area* and the top three US states by *population*:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "area = pd.Series({'Alaska': 1723337, 'Texas': 695662, 'California': 423967}, name='area')\n", "population = pd.Series({'California': 38332521, 'Texas': 26448193, 'New York': 19651127}, name='population')" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "Alaska NaN\n", "California 90.413926\n", "New York NaN\n", "Texas 38.018740\n", "dtype: float64" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "population / area" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The resulting array contains the *union* of indices of the two input arrays, which could be determined using standard Python set arithmetic on these indices:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Alaska', 'California', 'New York', 'Texas'], dtype='object')" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "area.index.union(population.index) # this does create a new index and doesn't modify in place." ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Alaska', 'Texas', 'California'], dtype='object')" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "area.index" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Any item for which one or the other does not have an entry is marked with ``NaN``, or \"Not a Number,\" which is how Pandas marks missing data\n", ".\n", "This index matching is implemented this way for any of Python's built-in arithmetic expressions; any missing values are filled in with NaN by default:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 NaN\n", "1 5.0\n", "2 9.0\n", "3 NaN\n", "dtype: float64" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = pd.Series([2, 4, 6], index=[0, 1, 2])\n", "B = pd.Series([1, 3, 5], index=[1, 2, 3])\n", "A + B" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If using NaN values is not the desired behavior, the fill value can be modified using appropriate object methods in place of the operators:" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2.0\n", "1 5.0\n", "2 9.0\n", "3 5.0\n", "dtype: float64" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.add(B, fill_value=0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Index alignment in DataFrame\n", "\n", "A similar type of alignment takes place for *both* columns and indices when performing operations on ``DataFrame``s:" ] }, { "cell_type": "code", "execution_count": 111, "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", "
AB
01317
181
\n", "
" ], "text/plain": [ " A B\n", "0 13 17\n", "1 8 1" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = pd.DataFrame(rng.randint(0, 20, (2, 2)), columns=list('AB'))\n", "A" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
BAC
0155
1935
2191
\n", "
" ], "text/plain": [ " B A C\n", "0 1 5 5\n", "1 9 3 5\n", "2 1 9 1" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B = pd.DataFrame(rng.randint(0, 10, (3, 3)), columns=list('BAC'))\n", "B" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
ABC
018.018.0NaN
111.010.0NaN
2NaNNaNNaN
\n", "
" ], "text/plain": [ " A B C\n", "0 18.0 18.0 NaN\n", "1 11.0 10.0 NaN\n", "2 NaN NaN NaN" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A + B" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "9.75" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fill = A.stack().mean()\n", "fill" ] }, { "cell_type": "code", "execution_count": 117, "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", "
ABC
018.0018.0014.75
111.0010.0014.75
218.7510.7510.75
\n", "
" ], "text/plain": [ " A B C\n", "0 18.00 18.00 14.75\n", "1 11.00 10.00 14.75\n", "2 18.75 10.75 10.75" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.add(B, fill_value=fill)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The following table lists Python operators and their equivalent Pandas object methods:\n", "\n", "| Python Operator | Pandas Method(s) |\n", "|-----------------|---------------------------------------|\n", "| ``+`` | ``add()`` |\n", "| ``-`` | ``sub()``, ``subtract()`` |\n", "| ``*`` | ``mul()``, ``multiply()`` |\n", "| ``/`` | ``truediv()``, ``div()``, ``divide()``|\n", "| ``//`` | ``floordiv()`` |\n", "| ``%`` | ``mod()`` |\n", "| ``**`` | ``pow()`` |\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Ufuncs: Operations Between DataFrame and Series\n", "\n", "When performing operations between a ``DataFrame`` and a ``Series``, the index and column alignment is similarly maintained.\n", "Operations between a ``DataFrame`` and a ``Series`` are similar to operations between a two-dimensional and one-dimensional NumPy array." ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[3, 8, 2, 4],\n", " [2, 6, 4, 8],\n", " [6, 1, 3, 8]])" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = rng.randint(10, size=(3, 4))\n", "A" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(A)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0, 0],\n", " [-1, -2, 2, 4],\n", " [ 3, -7, 1, 4]])" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A - A[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "According to NumPy's broadcasting rules , subtraction between a two-dimensional array and one of its rows is applied row-wise." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In Pandas, the convention similarly operates row-wise by default:" ] }, { "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", "
QRST
00000
1-1-224
23-714
\n", "
" ], "text/plain": [ " Q R S T\n", "0 0 0 0 0\n", "1 -1 -2 2 4\n", "2 3 -7 1 4" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(A, columns=list('QRST'))\n", "df - df.iloc[0]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If you would instead like to operate column-wise you have to specify the ``axis`` keyword:" ] }, { "cell_type": "code", "execution_count": 91, "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", "
QRST
0-50-6-4
1-40-22
25027
\n", "
" ], "text/plain": [ " Q R S T\n", "0 -5 0 -6 -4\n", "1 -4 0 -2 2\n", "2 5 0 2 7" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.subtract(df['R'], axis=0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Handling Missing Data\n", "\n", "The difference between data found in many tutorials and data in the real world is that real-world data is rarely clean and homogeneous.\n", "In particular, many interesting datasets will have some amount of data missing.\n", "\n", "To make matters even more complicated, different data sources may indicate missing data in different ways." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Trade-Offs in Missing Data Conventions\n", "\n", "To indicate the presence of missing data in a table or DataFrame we can use two strategies: using a *mask* that globally indicates missing values, or choosing a *sentinel value* that indicates a missing entry.\n", "\n", "In the masking approach, the mask might be an entirely separate Boolean array, or it may involve appropriation of one bit in the data representation to locally indicate the null status of a value.\n", "\n", "In the sentinel approach, the sentinel value could be some data-specific convention, such as indicating a missing integer value with -9999 or some rare bit pattern, or it could be a more global convention, such as indicating a missing floating-point value with NaN (Not a Number).\n", "\n", "None of these approaches is without trade-offs: use of a separate mask array requires allocation of an additional Boolean array. A sentinel value reduces the range of valid values that can be represented, and may require extra (often non-optimized) logic in CPU and GPU arithmetic." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Missing Data in Pandas\n", "\n", "The way in which Pandas handles missing values is constrained by its reliance on the NumPy package, which does **not have** a built-in notion of NA values for non-floating-point data types.\n", "\n", "NumPy does have support for masked arrays – that is, arrays that have a separate Boolean mask array attached for marking data as \"good\" or \"bad.\"\n", "Pandas could have derived from this, but the overhead in both storage, computation, and code maintenance makes that an unattractive choice.\n", "\n", "With these constraints in mind, Pandas chose to use sentinels for missing data, and further chose to use two already-existing Python null values: the special floating-point ``NaN`` value, and the Python ``None`` object." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### ``None``: Pythonic missing data\n", "\n", "The first sentinel value used by Pandas is ``None``, a Python singleton object that is often used for missing data in Python code.\n", "\n", "Because it is a Python object, ``None`` cannot be used in any arbitrary NumPy/Pandas array, but only in arrays with data type ``'object'`` (i.e., arrays of Python objects):" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, None, 3, 4], dtype=object)" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vals1 = np.array([1, None, 3, 4])\n", "vals1" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Any operations on the data will be done at the Python level, with much more overhead than the typically fast operations seen for arrays with native types:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dtype = object\n", "81.8 ms ± 125 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "\n", "dtype = int\n", "1.87 ms ± 34.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "\n" ] } ], "source": [ "for dtype in ['object', 'int']:\n", " print(\"dtype =\", dtype)\n", " %timeit np.arange(1E6, dtype=dtype).sum()\n", " print()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The use of Python objects in an array also means that if you perform aggregations like ``sum()`` or ``min()`` across an array with a ``None`` value, you will generally get an error:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "unsupported operand type(s) for +: 'int' and 'NoneType'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mvals1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/Developer/venvs/py-ml/lib/python3.8/site-packages/numpy/core/_methods.py\u001b[0m in \u001b[0;36m_sum\u001b[0;34m(a, axis, dtype, out, keepdims, initial, where)\u001b[0m\n\u001b[1;32m 45\u001b[0m def _sum(a, axis=None, dtype=None, out=None, keepdims=False,\n\u001b[1;32m 46\u001b[0m initial=_NoValue, where=True):\n\u001b[0;32m---> 47\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mumr_sum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwhere\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m def _prod(a, axis=None, dtype=None, out=None, keepdims=False,\n", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'NoneType'" ] } ], "source": [ "vals1.sum()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### ``NaN``: Missing numerical data\n", "\n", "The other missing data representation, ``NaN`` (acronym for *Not a Number*), is different; it is a special floating-point value recognized by all systems that use the standard IEEE floating-point representation:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vals2 = np.array([1, np.nan, 3, 4]) \n", "vals2.dtype" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(nan, nan)" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 + np.nan, 0 * np.nan" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "(nan, nan, nan)" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vals2.sum(), vals2.min(), vals2.max()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NumPy does provide some special aggregations that will ignore these missing values:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8.0, 1.0, 4.0)" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### NaN and None in Pandas\n", "\n", "``NaN`` and ``None`` both have their place, and Pandas is built to handle the two of them nearly interchangeably, converting between them where appropriate:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 NaN\n", "2 2.0\n", "3 NaN\n", "dtype: float64" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.Series([1, np.nan, 2, None])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The following table lists the upcasting conventions in Pandas when NA values are introduced:\n", "\n", "|Typeclass | Conversion When Storing NAs | NA Sentinel Value |\n", "|--------------|-----------------------------|------------------------|\n", "| ``floating`` | No change | ``np.nan`` |\n", "| ``object`` | No change | ``None`` or ``np.nan`` |\n", "| ``integer`` | Cast to ``float64`` | ``np.nan`` |\n", "| ``boolean`` | Cast to ``object`` | ``None`` or ``np.nan`` |\n", "\n", "Keep in mind that in Pandas, string data is always stored with an ``object`` dtype." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Operating on Null Values\n", "\n", "As we have seen, Pandas treats ``None`` and ``NaN`` as essentially interchangeable for indicating missing or null values.\n", "To facilitate this convention, there are several useful methods for detecting, removing, and replacing null values in Pandas data structures.\n", "They are:\n", "\n", "- ``isnull()``: Generate a boolean mask indicating missing values\n", "- ``notnull()``: Opposite of ``isnull()``\n", "- ``dropna()``: Return a filtered version of the data\n", "- ``fillna()``: Return a copy of the data with missing values filled or imputed" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Detecting null values\n", "Pandas data structures have two useful methods for detecting null data: ``isnull()`` and ``notnull()``.\n", "Either one will return a Boolean mask over the data:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 True\n", "2 False\n", "3 True\n", "dtype: bool" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([1, np.nan, 'hello', None])\n", "data.isnull()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Dropping null values\n", "\n", "In addition to the masking used before, there are the convenience methods, ``dropna()``\n", "(which removes NA values) and ``fillna()`` (which fills in NA values):" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1\n", "2 hello\n", "dtype: object" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dropna()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For a ``DataFrame``, there are more options:" ] }, { "cell_type": "code", "execution_count": 123, "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", "
012
01.0NaN2
12.03.05
2NaN4.06
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 1.0 NaN 2\n", "1 2.0 3.0 5\n", "2 NaN 4.0 6" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame([[1, np.nan, 2],\n", " [2, 3, 5],\n", " [np.nan, 4, 6]])\n", "df" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
12.03.05
\n", "
" ], "text/plain": [ " 0 1 2\n", "1 2.0 3.0 5" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna() # drop all rows in which *any* null value is present" ] }, { "cell_type": "code", "execution_count": 104, "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", "
2
02
15
26
\n", "
" ], "text/plain": [ " 2\n", "0 2\n", "1 5\n", "2 6" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(axis='columns') # drop NA values from all columns containing a null value" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The default is ``how='any'``, such that any row or column (depending on the ``axis`` keyword) containing a null value will be dropped." ] }, { "cell_type": "code", "execution_count": 105, "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", "
0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.0 NaN 2 NaN\n", "1 2.0 3.0 5 NaN\n", "2 NaN 4.0 6 NaN" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[3] = np.nan\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You can also specify ``how='all'``, which will only drop rows/columns that are *all* null values:" ] }, { "cell_type": "code", "execution_count": 106, "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", "
012
01.0NaN2
12.03.05
2NaN4.06
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 1.0 NaN 2\n", "1 2.0 3.0 5\n", "2 NaN 4.0 6" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(axis='columns', how='all')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ``thresh`` parameter lets you specify a minimum number of non-null values for the row/column to be kept:" ] }, { "cell_type": "code", "execution_count": 107, "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", "
0123
12.03.05NaN
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "1 2.0 3.0 5 NaN" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(axis='rows', thresh=3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Filling null values\n", "\n", "Sometimes rather than dropping NA values, you'd rather replace them with a valid value.\n", "This value might be a single number like zero, or it might be some sort of imputation or interpolation from the good values.\n", "You could do this in-place using the ``isnull()`` method as a mask, but because it is such a common operation Pandas provides the ``fillna()`` method, which returns a copy of the array with the null values replaced.\n" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 1.0\n", "b NaN\n", "c 2.0\n", "d NaN\n", "e 3.0\n", "dtype: float64" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))\n", "data" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "a 1.0\n", "b 0.0\n", "c 2.0\n", "d 0.0\n", "e 3.0\n", "dtype: float64" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.fillna(0) # fill NA entries with a single value" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "a 1.0\n", "b 1.0\n", "c 2.0\n", "d 2.0\n", "e 3.0\n", "dtype: float64" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.fillna(method='ffill') # specify a forward-fill to propagate the previous value forward" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "a 1.0\n", "b 2.0\n", "c 2.0\n", "d 3.0\n", "e 3.0\n", "dtype: float64" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.fillna(method='bfill') # specify a back-fill to propagate the next values backward" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For ``DataFrame``s, the options are similar, but we can also specify an ``axis`` along which the fills take place:" ] }, { "cell_type": "code", "execution_count": 112, "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", "
0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.0 NaN 2 NaN\n", "1 2.0 3.0 5 NaN\n", "2 NaN 4.0 6 NaN" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
0123
01.01.02.02.0
12.03.05.05.0
2NaN4.06.06.0
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.0 1.0 2.0 2.0\n", "1 2.0 3.0 5.0 5.0\n", "2 NaN 4.0 6.0 6.0" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.fillna(method='ffill', axis=1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Hierarchical Indexing\n", "\n", "Up to this point we've been focused primarily on one-dimensional and two-dimensional data, stored in Pandas ``Series`` and ``DataFrame`` objects, respectively.\n", "Often it is useful to go beyond this and store higher-dimensional data–that is, data indexed by more than one or two keys.\n", "\n", "A far more common pattern in practice is to make use of *hierarchical indexing* (also known as *multi-indexing*) to incorporate multiple index *levels* within a single index.\n", "In this way, higher-dimensional data can be compactly represented within the familiar one-dimensional ``Series`` and two-dimensional ``DataFrame`` objects.\n", "\n", "## A Multiply Indexed Series\n", "\n", "Let's start by considering how we might represent two-dimensional data within a one-dimensional ``Series``." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The bad way\n", "\n", "Suppose you would like to track data about states from two different years.\n", "Using the Pandas tools we've already covered, you might be tempted to simply use Python tuples as keys:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(California, 2000) 33871648\n", "(California, 2010) 37253956\n", "(New York, 2000) 18976457\n", "(New York, 2010) 19378102\n", "(Texas, 2000) 20851820\n", "(Texas, 2010) 25145561\n", "dtype: int64" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = [('California', 2000), ('California', 2010),\n", " ('New York', 2000), ('New York', 2010),\n", " ('Texas', 2000), ('Texas', 2010)]\n", "populations = [33871648, 37253956,\n", " 18976457, 19378102,\n", " 20851820, 25145561]\n", "pop = pd.Series(populations, index=index)\n", "pop" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If you need to select all values from 2010, you'll need to do some messy (and potentially slow) munging to make it happen:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(California, 2010) 37253956\n", "(New York, 2010) 19378102\n", "(Texas, 2010) 25145561\n", "dtype: int64" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop[[i for i in pop.index if i[1] == 2010]]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The Better Way: Pandas MultiIndex\n", "\n", "Our tuple-based indexing is essentially a rudimentary multi-index, and the Pandas ``MultiIndex`` type gives us the type of operations we wish to have:" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MultiIndex([('California', 2000),\n", " ('California', 2010),\n", " ( 'New York', 2000),\n", " ( 'New York', 2010),\n", " ( 'Texas', 2000),\n", " ( 'Texas', 2010)],\n", " )" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.MultiIndex.from_tuples(index)\n", "index" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.indexes.multi.MultiIndex" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A ``MultiIndex`` contains multiple *levels* of indexing–in this case, the state names and the years, as well as multiple *labels* for each data point which encode these levels." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If we re-index our series with this ``MultiIndex``, we see the hierarchical representation of the data:" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop = pop.reindex(index)\n", "pop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the first two columns of the ``Series`` representation show the multiple index values, while the third column shows the data.\n", "\n", "Notice that some entries are missing in the first column: in this multi-index representation, any blank entry indicates the same value as the line above it." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now to access all data for which the second index is 2010, we can simply use the Pandas slicing notation:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 37253956\n", "New York 19378102\n", "Texas 25145561\n", "dtype: int64" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop[:, 2010]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result is a singly indexed array with just the keys we're interested in.\n", "This syntax is much more convenient (and the operation is much more efficient!) than the home-spun tuple-based multi-indexing solution that we started with.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### MultiIndex as extra dimension\n", "\n", "We could have stored the same data using a simple ``DataFrame`` with index and column labels; in fact, Pandas is built with this equivalence in mind. \n", "\n", "The ``unstack()`` method will quickly convert a multiply indexed ``Series`` into a conventionally indexed ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 129, "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", "
20002010
California3387164837253956
New York1897645719378102
Texas2085182025145561
\n", "
" ], "text/plain": [ " 2000 2010\n", "California 33871648 37253956\n", "New York 18976457 19378102\n", "Texas 20851820 25145561" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_df = pop.unstack()\n", "pop_df" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(pop_df)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Naturally, the ``stack()`` method provides the opposite operation:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_df.stack()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Seeing this, you might wonder why would we would bother with hierarchical indexing at all.\n", "\n", "The reason is simple: just as we were able to use multi-indexing to represent two-dimensional data within a one-dimensional ``Series``, we can also use it to represent data of three or more dimensions in a ``Series`` or ``DataFrame``.\n", "\n", "Each extra level in a multi-index represents an extra dimension of data; taking advantage of this property gives us much more flexibility in the types of data we can represent. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Concretely, we might want to add another column of demographic data for each state at each year (say, population under 18) ; with a ``MultiIndex`` this is as easy as adding another column to the ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 132, "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", "
totalunder18
California2000338716489267089
2010372539569284094
New York2000189764574687374
2010193781024318033
Texas2000208518205906301
2010251455616879014
\n", "
" ], "text/plain": [ " total under18\n", "California 2000 33871648 9267089\n", " 2010 37253956 9284094\n", "New York 2000 18976457 4687374\n", " 2010 19378102 4318033\n", "Texas 2000 20851820 5906301\n", " 2010 25145561 6879014" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_df = pd.DataFrame({'total': pop,\n", " 'under18': [9267089, 9284094,\n", " 4687374, 4318033,\n", " 5906301, 6879014]})\n", "pop_df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In addition, all the ufuncs work with hierarchical indices as well:" ] }, { "cell_type": "code", "execution_count": 125, "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", "
20002010
California0.2735940.249211
New York0.2470100.222831
Texas0.2832510.273568
\n", "
" ], "text/plain": [ " 2000 2010\n", "California 0.273594 0.249211\n", "New York 0.247010 0.222831\n", "Texas 0.283251 0.273568" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f_u18 = pop_df['under18'] / pop_df['total']\n", "f_u18.unstack()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Methods of MultiIndex Creation\n", "\n", "The most straightforward way to construct a multiply indexed ``Series`` or ``DataFrame`` is to simply pass a list of two or more index arrays to the constructor:" ] }, { "cell_type": "code", "execution_count": 126, "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", "
data1data2
a10.4825450.352967
20.5742800.063582
b10.1022710.569372
20.7530260.194597
\n", "
" ], "text/plain": [ " data1 data2\n", "a 1 0.482545 0.352967\n", " 2 0.574280 0.063582\n", "b 1 0.102271 0.569372\n", " 2 0.753026 0.194597" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.rand(4, 2),\n", " index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],\n", " columns=['data1', 'data2'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Similarly, if you pass a dictionary with appropriate tuples as keys, Pandas will automatically recognize this and use a ``MultiIndex`` by default:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "California 2000 33871648\n", " 2010 37253956\n", "Texas 2000 20851820\n", " 2010 25145561\n", "New York 2000 18976457\n", " 2010 19378102\n", "dtype: int64" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = {('California', 2000): 33871648,\n", " ('California', 2010): 37253956,\n", " ('Texas', 2000): 20851820,\n", " ('Texas', 2010): 25145561,\n", " ('New York', 2000): 18976457,\n", " ('New York', 2010): 19378102}\n", "pd.Series(data)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Explicit MultiIndex constructors\n", "\n", "For more flexibility in how the index is constructed, you can instead use the class method constructors available in the ``pd.MultiIndex``.\n", "\n", "You can construct the ``MultiIndex`` from a simple list of arrays giving the index values within each level:" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MultiIndex([('a', 1),\n", " ('a', 2),\n", " ('b', 1),\n", " ('b', 2)],\n", " )" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You can even construct it from a Cartesian product of single indices:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MultiIndex([('a', 1),\n", " ('a', 2),\n", " ('b', 1),\n", " ('b', 2)],\n", " )" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.MultiIndex.from_product([['a', 'b'], [1, 2]])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### MultiIndex level names\n", "\n", "Sometimes it is convenient to name the levels of the ``MultiIndex``.\n", "This can be accomplished by passing the ``names`` argument to any of the above ``MultiIndex`` constructors, or by setting the ``names`` attribute of the index after the fact:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state year\n", "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop.index.names = ['state', 'year']\n", "pop" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### MultiIndex for columns\n", "\n", "In a ``DataFrame``, the rows and columns are completely symmetric, and just as the rows can have multiple levels of indices, the columns can have multiple levels as well:" ] }, { "cell_type": "code", "execution_count": 132, "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", "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
yearvisit
2013148.038.119.038.452.038.8
234.038.037.036.931.037.6
2014141.037.052.038.938.037.4
247.036.946.036.442.036.6
\n", "
" ], "text/plain": [ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year visit \n", "2013 1 48.0 38.1 19.0 38.4 52.0 38.8\n", " 2 34.0 38.0 37.0 36.9 31.0 37.6\n", "2014 1 41.0 37.0 52.0 38.9 38.0 37.4\n", " 2 47.0 36.9 46.0 36.4 42.0 36.6" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['year', 'visit'])\n", "columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']], names=['subject', 'type'])\n", "\n", "data = np.round(np.random.randn(4, 6), 1) # mock some data\n", "data[:, ::2] *= 10\n", "data += 37\n", "\n", "health_data = pd.DataFrame(data, index=index, columns=columns)\n", "health_data # create the DataFrame" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is fundamentally four-dimensional data, where the dimensions are the subject, the measurement type, the year, and the visit number; we can index the top-level column by the person's name and get a full ``DataFrame`` containing just that person's information:" ] }, { "cell_type": "code", "execution_count": 133, "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", "
typeHRTemp
yearvisit
2013119.038.4
237.036.9
2014152.038.9
246.036.4
\n", "
" ], "text/plain": [ "type HR Temp\n", "year visit \n", "2013 1 19.0 38.4\n", " 2 37.0 36.9\n", "2014 1 52.0 38.9\n", " 2 46.0 36.4" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data['Guido']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Indexing and Slicing a MultiIndex\n", "\n", "Indexing and slicing on a ``MultiIndex`` is designed to be intuitive, and it\n", "helps if you think about the indices as added dimensions.\n", "\n", "### Multiply indexed Series\n", "\n", "Consider the multiply indexed ``Series`` of state populations we saw earlier:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state year\n", "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "33871648" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop['California', 2000] # access single elements by indexing with multiple terms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``MultiIndex`` also supports *partial indexing*, or indexing just one of the levels in the index.\n", "The result is another ``Series``, with the lower-level indices maintained:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "year\n", "2000 33871648\n", "2010 37253956\n", "dtype: int64" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop['California']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Other types of indexing and selection could be based either on Boolean masks:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state year\n", "California 2000 33871648\n", " 2010 37253956\n", "Texas 2010 25145561\n", "dtype: int64" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop[pop > 22000000]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or on fancy indexing:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state year\n", "California 2000 33871648\n", " 2010 37253956\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop[['California', 'Texas']]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Multiply indexed DataFrames\n", "\n", "A multiply indexed ``DataFrame`` behaves in a similar manner:" ] }, { "cell_type": "code", "execution_count": 139, "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", "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
yearvisit
2013148.038.119.038.452.038.8
234.038.037.036.931.037.6
2014141.037.052.038.938.037.4
247.036.946.036.442.036.6
\n", "
" ], "text/plain": [ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year visit \n", "2013 1 48.0 38.1 19.0 38.4 52.0 38.8\n", " 2 34.0 38.0 37.0 36.9 31.0 37.6\n", "2014 1 41.0 37.0 52.0 38.9 38.0 37.4\n", " 2 47.0 36.9 46.0 36.4 42.0 36.6" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember that columns are primary in a ``DataFrame``, and the syntax used for multiply indexed ``Series`` applies to the columns." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can recover Guido's heart rate data with a simple operation:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "year visit\n", "2013 1 19.0\n", " 2 37.0\n", "2014 1 52.0\n", " 2 46.0\n", "Name: (Guido, HR), dtype: float64" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data['Guido', 'HR']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Also, as with the single-index case, we can use the ``loc``, ``iloc``, and ``ix`` indexers:" ] }, { "cell_type": "code", "execution_count": 141, "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", "
subjectBob
typeHRTemp
yearvisit
2013148.038.1
234.038.0
\n", "
" ], "text/plain": [ "subject Bob \n", "type HR Temp\n", "year visit \n", "2013 1 48.0 38.1\n", " 2 34.0 38.0" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data.iloc[:2, :2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "These indexers provide an array-like view of the underlying two-dimensional data, but each individual index in ``loc`` or ``iloc`` can be passed a tuple of multiple indices:" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "year visit\n", "2013 1 48.0\n", " 2 34.0\n", "2014 1 41.0\n", " 2 47.0\n", "Name: (Bob, HR), dtype: float64" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data.loc[:, ('Bob', 'HR')]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Rearranging Multi-Indices\n", "\n", "One of the keys to working with multiply indexed data is knowing how to effectively transform the data.\n", "\n", "There are a number of operations that will preserve all the information in the dataset, but rearrange it for the purposes of various computations.\n", "\n", "We saw a brief example of this in the ``stack()`` and ``unstack()`` methods, but there are many more ways to finely control the rearrangement of data between hierarchical indices and columns." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Sorted and unsorted indices\n", "\n", "Earlier, we briefly mentioned a caveat, but we should emphasize it more here.\n", "\n", "*Many of the ``MultiIndex`` slicing operations will fail if the index is not sorted.*\n", "\n", "We'll start by creating some simple multiply indexed data where the indices are *not lexographically sorted*:" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "char int\n", "a 1 0.002105\n", " 2 0.280923\n", "c 1 0.008604\n", " 2 0.631968\n", "b 1 0.072270\n", " 2 0.273800\n", "dtype: float64" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])\n", "data = pd.Series(np.random.rand(6), index=index)\n", "data.index.names = ['char', 'int']\n", "data" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "'Key length (1) was greater than MultiIndex lexsort depth (0)'\n" ] } ], "source": [ "try:\n", " data['a':'b'] # try to take a partial slice of this index\n", "except KeyError as e:\n", " print(type(e))\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the result of the MultiIndex not being sorted; in general, partial slices and other similar operations require the levels in the ``MultiIndex`` to be in sorted (i.e., lexographical) order." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Pandas provides a number of convenience routines to perform this type of sorting; examples are the ``sort_index()`` and ``sortlevel()`` methods of the ``DataFrame``." ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "char int\n", "a 1 0.002105\n", " 2 0.280923\n", "b 1 0.072270\n", " 2 0.273800\n", "c 1 0.008604\n", " 2 0.631968\n", "dtype: float64" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = data.sort_index()\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With the index sorted in this way, partial slicing will work as expected:" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "char int\n", "a 1 0.002105\n", " 2 0.280923\n", "b 1 0.072270\n", " 2 0.273800\n", "dtype: float64" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['a':'b']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Stacking and unstacking indices\n", "\n", "As we saw briefly before, it is possible to convert a dataset from a stacked multi-index to a simple two-dimensional representation, optionally specifying the level to use:" ] }, { "cell_type": "code", "execution_count": 147, "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", "
stateCaliforniaNew YorkTexas
year
2000338716481897645720851820
2010372539561937810225145561
\n", "
" ], "text/plain": [ "state California New York Texas\n", "year \n", "2000 33871648 18976457 20851820\n", "2010 37253956 19378102 25145561" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop.unstack(level=0)" ] }, { "cell_type": "code", "execution_count": 148, "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", "
year20002010
state
California3387164837253956
New York1897645719378102
Texas2085182025145561
\n", "
" ], "text/plain": [ "year 2000 2010\n", "state \n", "California 33871648 37253956\n", "New York 18976457 19378102\n", "Texas 20851820 25145561" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop.unstack(level=1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The opposite of ``unstack()`` is ``stack()``, which here can be used to recover the original series:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state year\n", "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", "dtype: int64" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop.unstack().stack()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Index setting and resetting\n", "\n", "Another way to rearrange hierarchical data is to turn the index labels into columns; this can be accomplished with the ``reset_index`` method.\n", "\n", "Calling this on the population dictionary will result in a ``DataFrame`` with a *state* and *year* column holding the information that was formerly in the index." ] }, { "cell_type": "code", "execution_count": 150, "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", "
stateyearpopulation
0California200033871648
1California201037253956
2New York200018976457
3New York201019378102
4Texas200020851820
5Texas201025145561
\n", "
" ], "text/plain": [ " state year population\n", "0 California 2000 33871648\n", "1 California 2010 37253956\n", "2 New York 2000 18976457\n", "3 New York 2010 19378102\n", "4 Texas 2000 20851820\n", "5 Texas 2010 25145561" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_flat = pop.reset_index(name='population') # specify the name of the data for the column\n", "pop_flat" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Often when working with data in the real world, the raw input data looks like this and it's useful to build a ``MultiIndex`` from the column values.\n", "This can be done with the ``set_index`` method of the ``DataFrame``, which returns a multiply indexed ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 151, "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", "
population
stateyear
California200033871648
201037253956
New York200018976457
201019378102
Texas200020851820
201025145561
\n", "
" ], "text/plain": [ " population\n", "state year \n", "California 2000 33871648\n", " 2010 37253956\n", "New York 2000 18976457\n", " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_flat.set_index(['state', 'year'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Data Aggregations on Multi-Indices\n", "\n", "We've previously seen that Pandas has built-in data aggregation methods, such as ``mean()``, ``sum()``, and ``max()``.\n", "For hierarchically indexed data, these can be passed a ``level`` parameter that controls which subset of the data the aggregate is computed on." ] }, { "cell_type": "code", "execution_count": 152, "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", "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
yearvisit
2013148.038.119.038.452.038.8
234.038.037.036.931.037.6
2014141.037.052.038.938.037.4
247.036.946.036.442.036.6
\n", "
" ], "text/plain": [ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year visit \n", "2013 1 48.0 38.1 19.0 38.4 52.0 38.8\n", " 2 34.0 38.0 37.0 36.9 31.0 37.6\n", "2014 1 41.0 37.0 52.0 38.9 38.0 37.4\n", " 2 47.0 36.9 46.0 36.4 42.0 36.6" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "health_data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Perhaps we'd like to average-out the measurements in the two visits each year. We can do this by naming the index level we'd like to explore, in this case the year:" ] }, { "cell_type": "code", "execution_count": 153, "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", "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
year
201341.038.0528.037.6541.538.2
201444.036.9549.037.6540.037.0
\n", "
" ], "text/plain": [ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year \n", "2013 41.0 38.05 28.0 37.65 41.5 38.2\n", "2014 44.0 36.95 49.0 37.65 40.0 37.0" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_mean = health_data.mean(level='year')\n", "data_mean" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "By further making use of the ``axis`` keyword, we can take the mean among levels on the columns as well:" ] }, { "cell_type": "code", "execution_count": 154, "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", "
typeHRTemp
year
201336.83333337.966667
201444.33333337.200000
\n", "
" ], "text/plain": [ "type HR Temp\n", "year \n", "2013 36.833333 37.966667\n", "2014 44.333333 37.200000" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_mean.mean(axis=1, level='type')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Combining Datasets: Concat and Append\n", "\n", "Some of the most interesting studies of data come from combining different data sources.\n", "These operations can involve anything from very straightforward concatenation of two different datasets, to more complicated database-style joins and merges that correctly handle any overlaps between the datasets.\n", "``Series`` and ``DataFrame``s are built with this type of operation in mind, and Pandas includes functions and methods that make this sort of data wrangling fast and straightforward.\n", "\n", "Here we'll take a look at simple concatenation of ``Series`` and ``DataFrame``s with the ``pd.concat`` function; later we'll dive into more sophisticated in-memory merges and joins implemented in Pandas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For convenience, we'll define this function which creates a ``DataFrame`` of a particular form that will be useful below:" ] }, { "cell_type": "code", "execution_count": 176, "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", "
ABC
0A0B0C0
1A1B1C1
2A2B2C2
\n", "
" ], "text/plain": [ " A B C\n", "0 A0 B0 C0\n", "1 A1 B1 C1\n", "2 A2 B2 C2" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def make_df(cols, ind):\n", " \"\"\"Quickly make a DataFrame\"\"\"\n", " data = {c: [str(c) + str(i) for i in ind]\n", " for c in cols}\n", " return pd.DataFrame(data, ind)\n", "\n", "# example DataFrame\n", "make_df('ABC', range(3))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In addition, we'll create a quick class that allows us to display multiple ``DataFrame``s side by side. The code makes use of the special ``_repr_html_`` method, which IPython uses to implement its rich object display:" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [], "source": [ "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", " def __init__(self, *args):\n", " self.args = args\n", " \n", " def _repr_html_(self):\n", " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", " for a in self.args)\n", " \n", " def __repr__(self):\n", " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", " for a in self.args)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Simple Concatenation with ``pd.concat``\n", "\n", "Pandas has a function, ``pd.concat()``, which has a similar syntax to ``np.concatenate`` but contains a number of options that we'll discuss momentarily:\n", "\n", "```python\n", "# Signature in Pandas v0.18\n", "pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,\n", " keys=None, levels=None, names=None, verify_integrity=False,\n", " copy=True)\n", "```\n", "\n", "``pd.concat()`` can be used for a simple concatenation of ``Series`` or ``DataFrame`` objects, just as ``np.concatenate()`` can be used for simple concatenations of arrays:" ] }, { "cell_type": "code", "execution_count": 180, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "1 A\n", "2 B\n", "3 C\n", "4 D\n", "5 E\n", "6 F\n", "dtype: object" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])\n", "ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])\n", "pd.concat([ser1, ser2])" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
1A1B1
2A2B2
\n", "
\n", "
\n", "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
3A3B3
4A4B4
\n", "
\n", "
\n", "
\n", "

pd.concat([df1, df2])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
1A1B1
2A2B2
3A3B3
4A4B4
\n", "
\n", "
" ], "text/plain": [ "df1\n", " A B\n", "1 A1 B1\n", "2 A2 B2\n", "\n", "df2\n", " A B\n", "3 A3 B3\n", "4 A4 B4\n", "\n", "pd.concat([df1, df2])\n", " A B\n", "1 A1 B1\n", "2 A2 B2\n", "3 A3 B3\n", "4 A4 B4" ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = make_df('AB', [1, 2])\n", "df2 = make_df('AB', [3, 4])\n", "display('df1', 'df2', 'pd.concat([df1, df2])')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "By default, the concatenation takes place row-wise within the ``DataFrame`` (i.e., ``axis=0``).\n", "Like ``np.concatenate``, ``pd.concat`` allows specification of an axis along which concatenation will take place:" ] }, { "cell_type": "code", "execution_count": 183, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df3

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
\n", "
\n", "
\n", "
\n", "

df4

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
0C0D0
1C1D1
\n", "
\n", "
\n", "
\n", "

pd.concat([df3, df4], axis=1)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A0B0C0D0
1A1B1C1D1
\n", "
\n", "
" ], "text/plain": [ "df3\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "\n", "df4\n", " C D\n", "0 C0 D0\n", "1 C1 D1\n", "\n", "pd.concat([df3, df4], axis=1)\n", " A B C D\n", "0 A0 B0 C0 D0\n", "1 A1 B1 C1 D1" ] }, "execution_count": 183, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = make_df('AB', [0, 1])\n", "df4 = make_df('CD', [0, 1])\n", "display('df3', 'df4', \"pd.concat([df3, df4], axis=1)\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Duplicate indices\n", "\n", "One important difference between ``np.concatenate`` and ``pd.concat`` is that Pandas concatenation *preserves indices*, even if the result will have duplicate indices:" ] }, { "cell_type": "code", "execution_count": 184, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

x

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
\n", "
\n", "
\n", "
\n", "

y

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A2B2
1A3B3
\n", "
\n", "
\n", "
\n", "

pd.concat([x, y])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
0A2B2
1A3B3
\n", "
\n", "
" ], "text/plain": [ "x\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "\n", "y\n", " A B\n", "0 A2 B2\n", "1 A3 B3\n", "\n", "pd.concat([x, y])\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "0 A2 B2\n", "1 A3 B3" ] }, "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = make_df('AB', [0, 1])\n", "y = make_df('AB', [2, 3])\n", "y.index = x.index # make duplicate indices!\n", "display('x', 'y', 'pd.concat([x, y])')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Notice the repeated indices in the result.\n", "While this is valid within ``DataFrame``s, the outcome is often undesirable.\n", "``pd.concat()`` gives us a few ways to handle it." ] }, { "cell_type": "code", "execution_count": 185, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ValueError: Indexes have overlapping values: Int64Index([0, 1], dtype='int64')\n" ] } ], "source": [ "try:\n", " pd.concat([x, y], verify_integrity=True)\n", "except ValueError as e:\n", " print(\"ValueError:\", e)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Ignoring the index\n", "\n", "Sometimes the index itself does not matter, and you would prefer it to simply be ignored.\n", "This option can be specified using the ``ignore_index`` flag.\n", "With this set to true, the concatenation will create a new integer index for the resulting ``Series``:" ] }, { "cell_type": "code", "execution_count": 186, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

x

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
\n", "
\n", "
\n", "
\n", "

y

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A2B2
1A3B3
\n", "
\n", "
\n", "
\n", "

pd.concat([x, y], ignore_index=True)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
2A2B2
3A3B3
\n", "
\n", "
" ], "text/plain": [ "x\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "\n", "y\n", " A B\n", "0 A2 B2\n", "1 A3 B3\n", "\n", "pd.concat([x, y], ignore_index=True)\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "2 A2 B2\n", "3 A3 B3" ] }, "execution_count": 186, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('x', 'y', 'pd.concat([x, y], ignore_index=True)')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Adding MultiIndex keys\n", "\n", "Another option is to use the ``keys`` option to specify a label for the data sources; the result will be a hierarchically indexed series containing the data:" ] }, { "cell_type": "code", "execution_count": 187, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

x

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A0B0
1A1B1
\n", "
\n", "
\n", "
\n", "

y

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0A2B2
1A3B3
\n", "
\n", "
\n", "
\n", "

pd.concat([x, y], keys=['x', 'y'])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
x0A0B0
1A1B1
y0A2B2
1A3B3
\n", "
\n", "
" ], "text/plain": [ "x\n", " A B\n", "0 A0 B0\n", "1 A1 B1\n", "\n", "y\n", " A B\n", "0 A2 B2\n", "1 A3 B3\n", "\n", "pd.concat([x, y], keys=['x', 'y'])\n", " A B\n", "x 0 A0 B0\n", " 1 A1 B1\n", "y 0 A2 B2\n", " 1 A3 B3" ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('x', 'y', \"pd.concat([x, y], keys=['x', 'y'])\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Concatenation with joins\n", "\n", "In practice, data from different sources might have different sets of column names, and ``pd.concat`` offers several options in this case.\n", "Consider the concatenation of the following two ``DataFrame``s, which have some (but not all!) columns in common:" ] }, { "cell_type": "code", "execution_count": 188, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df5

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
1A1B1C1
2A2B2C2
\n", "
\n", "
\n", "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BCD
3B3C3D3
4B4C4D4
\n", "
\n", "
\n", "
\n", "

pd.concat([df5, df6])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
1A1B1C1NaN
2A2B2C2NaN
3NaNB3C3D3
4NaNB4C4D4
\n", "
\n", "
" ], "text/plain": [ "df5\n", " A B C\n", "1 A1 B1 C1\n", "2 A2 B2 C2\n", "\n", "df6\n", " B C D\n", "3 B3 C3 D3\n", "4 B4 C4 D4\n", "\n", "pd.concat([df5, df6])\n", " A B C D\n", "1 A1 B1 C1 NaN\n", "2 A2 B2 C2 NaN\n", "3 NaN B3 C3 D3\n", "4 NaN B4 C4 D4" ] }, "execution_count": 188, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5 = make_df('ABC', [1, 2])\n", "df6 = make_df('BCD', [3, 4])\n", "display('df5', 'df6', 'pd.concat([df5, df6])')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, the join is a union of the input column|s (``join='outer'``), but we can change this to an intersection of the columns using ``join='inner'``:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Another option is to directly specify the index of the remaininig colums using the ``join_axes`` argument, which takes a list of index objects." ] }, { "cell_type": "code", "execution_count": 190, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df5

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
1A1B1C1
2A2B2C2
\n", "
\n", "
\n", "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BCD
3B3C3D3
4B4C4D4
\n", "
\n", "
\n", "
\n", "

pd.concat([df5, df6])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
1A1B1C1NaN
2A2B2C2NaN
3NaNB3C3D3
4NaNB4C4D4
\n", "
\n", "
" ], "text/plain": [ "df5\n", " A B C\n", "1 A1 B1 C1\n", "2 A2 B2 C2\n", "\n", "df6\n", " B C D\n", "3 B3 C3 D3\n", "4 B4 C4 D4\n", "\n", "pd.concat([df5, df6])\n", " A B C D\n", "1 A1 B1 C1 NaN\n", "2 A2 B2 C2 NaN\n", "3 NaN B3 C3 D3\n", "4 NaN B4 C4 D4" ] }, "execution_count": 190, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df5', 'df6', \"pd.concat([df5, df6])\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The ``append()`` method\n", "\n", "Because direct array concatenation is so common, ``Series`` and ``DataFrame`` objects have an ``append`` method that can accomplish the same thing in fewer keystrokes.\n", "For example, rather than calling ``pd.concat([df1, df2])``, you can simply call ``df1.append(df2)``:" ] }, { "cell_type": "code", "execution_count": 192, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
1A1B1
2A2B2
\n", "
\n", "
\n", "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
3A3B3
4A4B4
\n", "
\n", "
\n", "
\n", "

df1.append(df2)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
1A1B1
2A2B2
3A3B3
4A4B4
\n", "
\n", "
" ], "text/plain": [ "df1\n", " A B\n", "1 A1 B1\n", "2 A2 B2\n", "\n", "df2\n", " A B\n", "3 A3 B3\n", "4 A4 B4\n", "\n", "df1.append(df2)\n", " A B\n", "1 A1 B1\n", "2 A2 B2\n", "3 A3 B3\n", "4 A4 B4" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df1', 'df2', 'df1.append(df2)')\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Keep in mind that unlike the ``append()`` and ``extend()`` methods of Python lists, the ``append()`` method in Pandas does not modify the original object–instead it creates a new object with the combined data.\n", "\n", "It also is not a very efficient method, because it involves creation of a new index *and* data buffer.\n", "Thus, if you plan to do multiple ``append`` operations, it is generally better to build a list of ``DataFrame``s and pass them all at once to the ``concat()`` function.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Combining Datasets: Merge and Join\n", "\n", "One essential feature offered by Pandas is its high-performance, in-memory join and merge operations.\n", "If you have ever worked with databases, you should be familiar with this type of data interaction.\n", "The main interface for this is the ``pd.merge`` function, and we'll see few examples of how this can work in practice." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For convenience, we will start by redefining the ``display()`` functionality:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", " def __init__(self, *args):\n", " self.args = args\n", " \n", " def _repr_html_(self):\n", " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", " for a in self.args)\n", " \n", " def __repr__(self):\n", " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", " for a in self.args)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Relational Algebra\n", "\n", "The behavior implemented in ``pd.merge()`` is a subset of what is known as *relational algebra*, which is a formal set of rules for manipulating relational data, and forms the conceptual foundation of operations available in most databases.\n", "The strength of the relational algebra approach is that it proposes several primitive operations, which become the building blocks of more complicated operations on any dataset.\n", "With this lexicon of fundamental operations implemented efficiently in a database or other program, a wide range of fairly complicated composite operations can be performed.\n", "\n", "Pandas implements several of these fundamental building-blocks in the ``pd.merge()`` function and the related ``join()`` method of ``Series`` and ``Dataframe``s." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Categories of Joins\n", "\n", "The ``pd.merge()`` function implements a number of types of joins: the *one-to-one*, *many-to-one*, and *many-to-many* joins.\n", "All three types of joins are accessed via an identical call to the ``pd.merge()`` interface; the type of join performed depends on the form of the input data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### One-to-one joins\n", "\n", "Perhaps the simplest type of merge expresion is the one-to-one join, which is in many ways very similar to the column-wise concatenation that we have already seen.\n", "As a concrete example, consider the following two ``DataFrames`` which contain information on several employees in a company:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroup
0BobAccounting
1JakeEngineering
2LisaEngineering
3SueHR
\n", "
\n", "
\n", "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeehire_date
0Lisa2004
1Bob2008
2Jake2012
3Sue2014
\n", "
\n", "
" ], "text/plain": [ "df1\n", " employee group\n", "0 Bob Accounting\n", "1 Jake Engineering\n", "2 Lisa Engineering\n", "3 Sue HR\n", "\n", "df2\n", " employee hire_date\n", "0 Lisa 2004\n", "1 Bob 2008\n", "2 Jake 2012\n", "3 Sue 2014" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", " 'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})\n", "df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],\n", " 'hire_date': [2004, 2008, 2012, 2014]})\n", "display('df1', 'df2')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To combine this information into a single ``DataFrame``, we can use the ``pd.merge()`` function:" ] }, { "cell_type": "code", "execution_count": 135, "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", "
employeegrouphire_date
0BobAccounting2008
1JakeEngineering2012
2LisaEngineering2004
3SueHR2014
\n", "
" ], "text/plain": [ " employee group hire_date\n", "0 Bob Accounting 2008\n", "1 Jake Engineering 2012\n", "2 Lisa Engineering 2004\n", "3 Sue HR 2014" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = pd.merge(df1, df2)\n", "df3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ``pd.merge()`` function recognizes that each ``DataFrame`` has an \"employee\" column, and automatically joins using this column as a key.\n", "The result of the merge is a new ``DataFrame`` that combines the information from the two inputs.\n", "Notice that the order of entries in each column is not necessarily maintained: in this case, the order of the \"employee\" column differs between ``df1`` and ``df2``, and the ``pd.merge()`` function correctly accounts for this.\n", "Additionally, keep in mind that the merge in general discards the index, except in the special case of merges by index (see the ``left_index`` and ``right_index`` keywords, discussed momentarily)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Many-to-one joins\n", "\n", "Many-to-one joins are joins in which one of the two key columns contains duplicate entries.\n", "For the many-to-one case, the resulting ``DataFrame`` will preserve those duplicate entries as appropriate:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df3

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegrouphire_date
0BobAccounting2008
1JakeEngineering2012
2LisaEngineering2004
3SueHR2014
\n", "
\n", "
\n", "
\n", "

df4

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
groupsupervisor
0AccountingCarly
1EngineeringGuido
2HRSteve
\n", "
\n", "
\n", "
\n", "

pd.merge(df3, df4)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegrouphire_datesupervisor
0BobAccounting2008Carly
1JakeEngineering2012Guido
2LisaEngineering2004Guido
3SueHR2014Steve
\n", "
\n", "
" ], "text/plain": [ "df3\n", " employee group hire_date\n", "0 Bob Accounting 2008\n", "1 Jake Engineering 2012\n", "2 Lisa Engineering 2004\n", "3 Sue HR 2014\n", "\n", "df4\n", " group supervisor\n", "0 Accounting Carly\n", "1 Engineering Guido\n", "2 HR Steve\n", "\n", "pd.merge(df3, df4)\n", " employee group hire_date supervisor\n", "0 Bob Accounting 2008 Carly\n", "1 Jake Engineering 2012 Guido\n", "2 Lisa Engineering 2004 Guido\n", "3 Sue HR 2014 Steve" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'],\n", " 'supervisor': ['Carly', 'Guido', 'Steve']})\n", "display('df3', 'df4', 'pd.merge(df3, df4)')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Many-to-many joins\n", "\n", "Many-to-many joins are a bit confusing conceptually, but are nevertheless well defined.\n", "If the key column in both the left and right array contains duplicates, then the result is a many-to-many merge.\n", "Consider the following, where we have a ``DataFrame`` showing one or more skills associated with a particular group. By performing a many-to-many join, we can recover the skills associated with any individual person:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroup
0BobAccounting
1JakeEngineering
2LisaEngineering
3SueHR
\n", "
\n", "
\n", "
\n", "

df5

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
groupskills
0Accountingmath
1Accountingspreadsheets
2Engineeringcoding
3Engineeringlinux
4HRspreadsheets
5HRorganization
\n", "
\n", "
\n", "
\n", "

pd.merge(df1, df5)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroupskills
0BobAccountingmath
1BobAccountingspreadsheets
2JakeEngineeringcoding
3JakeEngineeringlinux
4LisaEngineeringcoding
5LisaEngineeringlinux
6SueHRspreadsheets
7SueHRorganization
\n", "
\n", "
" ], "text/plain": [ "df1\n", " employee group\n", "0 Bob Accounting\n", "1 Jake Engineering\n", "2 Lisa Engineering\n", "3 Sue HR\n", "\n", "df5\n", " group skills\n", "0 Accounting math\n", "1 Accounting spreadsheets\n", "2 Engineering coding\n", "3 Engineering linux\n", "4 HR spreadsheets\n", "5 HR organization\n", "\n", "pd.merge(df1, df5)\n", " employee group skills\n", "0 Bob Accounting math\n", "1 Bob Accounting spreadsheets\n", "2 Jake Engineering coding\n", "3 Jake Engineering linux\n", "4 Lisa Engineering coding\n", "5 Lisa Engineering linux\n", "6 Sue HR spreadsheets\n", "7 Sue HR organization" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5 = pd.DataFrame({'group': ['Accounting', 'Accounting',\n", " 'Engineering', 'Engineering', 'HR', 'HR'],\n", " 'skills': ['math', 'spreadsheets', 'coding', 'linux',\n", " 'spreadsheets', 'organization']})\n", "display('df1', 'df5', \"pd.merge(df1, df5)\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Specification of the Merge Key\n", "\n", "We've already seen the default behavior of ``pd.merge()``: it looks for one or more matching column names between the two inputs, and uses this as the key.\n", "However, often the column names will not match so nicely, and ``pd.merge()`` provides a variety of options for handling this.\n", "\n", "### The ``on`` keyword\n", "\n", "Most simply, you can explicitly specify the name of the key column using the ``on`` keyword, which takes a column name or a list of column names:" ] }, { "cell_type": "code", "execution_count": 198, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroup
0BobAccounting
1JakeEngineering
2LisaEngineering
3SueHR
\n", "
\n", "
\n", "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeehire_date
0Lisa2004
1Bob2008
2Jake2012
3Sue2014
\n", "
\n", "
\n", "
\n", "

pd.merge(df1, df2, on='employee')

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegrouphire_date
0BobAccounting2008
1JakeEngineering2012
2LisaEngineering2004
3SueHR2014
\n", "
\n", "
" ], "text/plain": [ "df1\n", " employee group\n", "0 Bob Accounting\n", "1 Jake Engineering\n", "2 Lisa Engineering\n", "3 Sue HR\n", "\n", "df2\n", " employee hire_date\n", "0 Lisa 2004\n", "1 Bob 2008\n", "2 Jake 2012\n", "3 Sue 2014\n", "\n", "pd.merge(df1, df2, on='employee')\n", " employee group hire_date\n", "0 Bob Accounting 2008\n", "1 Jake Engineering 2012\n", "2 Lisa Engineering 2004\n", "3 Sue HR 2014" ] }, "execution_count": 198, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df1', 'df2', \"pd.merge(df1, df2, on='employee')\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The ``left_on`` and ``right_on`` keywords\n", "\n", "At times you may wish to merge two datasets with different column names; for example, we may have a dataset in which the employee name is labeled as \"name\" rather than \"employee\".\n", "In this case, we can use the ``left_on`` and ``right_on`` keywords to specify the two column names:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroup
0BobAccounting
1JakeEngineering
2LisaEngineering
3SueHR
\n", "
\n", "
\n", "
\n", "

df3

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namesalary
0Bob70000
1Jake80000
2Lisa120000
3Sue90000
\n", "
\n", "
\n", "
\n", "

pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\")

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
employeegroupnamesalary
0BobAccountingBob70000
1JakeEngineeringJake80000
2LisaEngineeringLisa120000
3SueHRSue90000
\n", "
\n", "
" ], "text/plain": [ "df1\n", " employee group\n", "0 Bob Accounting\n", "1 Jake Engineering\n", "2 Lisa Engineering\n", "3 Sue HR\n", "\n", "df3\n", " name salary\n", "0 Bob 70000\n", "1 Jake 80000\n", "2 Lisa 120000\n", "3 Sue 90000\n", "\n", "pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\")\n", " employee group name salary\n", "0 Bob Accounting Bob 70000\n", "1 Jake Engineering Jake 80000\n", "2 Lisa Engineering Lisa 120000\n", "3 Sue HR Sue 90000" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", " 'salary': [70000, 80000, 120000, 90000]})\n", "display('df1', 'df3', 'pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\")')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The result has a redundant column that we can drop if desired–for example, by using the ``drop()`` method of ``DataFrame``s:" ] }, { "cell_type": "code", "execution_count": 200, "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", "
employeegroupsalary
0BobAccounting70000
1JakeEngineering80000
2LisaEngineering120000
3SueHR90000
\n", "
" ], "text/plain": [ " employee group salary\n", "0 Bob Accounting 70000\n", "1 Jake Engineering 80000\n", "2 Lisa Engineering 120000\n", "3 Sue HR 90000" ] }, "execution_count": 200, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\").drop('name', axis=1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The ``left_index`` and ``right_index`` keywords\n", "\n", "Sometimes, rather than merging on a column, you would instead like to merge on an index.\n", "For example, your data might look like this:" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [], "source": [ "df1.set_index?" ] }, { "cell_type": "code", "execution_count": 147, "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", "
groupemployee
AccountingBob
EngineeringJake
Lisa
HRSue
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: [(Accounting, Bob), (Engineering, Jake), (Engineering, Lisa), (HR, Sue)]" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1a = df1.set_index([ 'group', 'employee'])\n", "df1a" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
group
employee
BobAccounting
JakeEngineering
LisaEngineering
SueHR
\n", "
\n", "
\n", "
\n", "

df2a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hire_date
employee
Lisa2004
Bob2008
Jake2012
Sue2014
\n", "
\n", "
" ], "text/plain": [ "df1a\n", " group\n", "employee \n", "Bob Accounting\n", "Jake Engineering\n", "Lisa Engineering\n", "Sue HR\n", "\n", "df2a\n", " hire_date\n", "employee \n", "Lisa 2004\n", "Bob 2008\n", "Jake 2012\n", "Sue 2014" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1a = df1.set_index(['employee', 'group'])\n", "df2a = df2.set_index('employee')\n", "display('df1a', 'df2a')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You can use the index as the key for merging by specifying the ``left_index`` and/or ``right_index`` flags in ``pd.merge()``:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
group
employee
BobAccounting
JakeEngineering
LisaEngineering
SueHR
\n", "
\n", "
\n", "
\n", "

df2a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hire_date
employee
Lisa2004
Bob2008
Jake2012
Sue2014
\n", "
\n", "
\n", "
\n", "

pd.merge(df1a, df2a, left_index=True, right_index=True)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
grouphire_date
employee
BobAccounting2008
JakeEngineering2012
LisaEngineering2004
SueHR2014
\n", "
\n", "
" ], "text/plain": [ "df1a\n", " group\n", "employee \n", "Bob Accounting\n", "Jake Engineering\n", "Lisa Engineering\n", "Sue HR\n", "\n", "df2a\n", " hire_date\n", "employee \n", "Lisa 2004\n", "Bob 2008\n", "Jake 2012\n", "Sue 2014\n", "\n", "pd.merge(df1a, df2a, left_index=True, right_index=True)\n", " group hire_date\n", "employee \n", "Bob Accounting 2008\n", "Jake Engineering 2012\n", "Lisa Engineering 2004\n", "Sue HR 2014" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df1a', 'df2a', \"pd.merge(df1a, df2a, left_index=True, right_index=True)\")" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "( group\n", " employee \n", " Bob Accounting\n", " Jake Engineering\n", " Lisa Engineering\n", " Sue HR,\n", " hire_date\n", " employee \n", " Lisa 2004\n", " Bob 2008\n", " Jake 2012\n", " Sue 2014,\n", " group hire_date\n", " employee \n", " Bob Accounting 2008\n", " Jake Engineering 2012\n", " Lisa Engineering 2004\n", " Sue HR 2014)" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1a, df2a, pd.merge(df1a, df2a, left_index=True, right_index=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For convenience, ``DataFrame``s implement the ``join()`` method, which performs a merge that defaults to joining on indices:" ] }, { "cell_type": "code", "execution_count": 203, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
group
employee
BobAccounting
JakeEngineering
LisaEngineering
SueHR
\n", "
\n", "
\n", "
\n", "

df2a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hire_date
employee
Lisa2004
Bob2008
Jake2012
Sue2014
\n", "
\n", "
\n", "
\n", "

df1a.join(df2a)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
grouphire_date
employee
BobAccounting2008
JakeEngineering2012
LisaEngineering2004
SueHR2014
\n", "
\n", "
" ], "text/plain": [ "df1a\n", " group\n", "employee \n", "Bob Accounting\n", "Jake Engineering\n", "Lisa Engineering\n", "Sue HR\n", "\n", "df2a\n", " hire_date\n", "employee \n", "Lisa 2004\n", "Bob 2008\n", "Jake 2012\n", "Sue 2014\n", "\n", "df1a.join(df2a)\n", " group hire_date\n", "employee \n", "Bob Accounting 2008\n", "Jake Engineering 2012\n", "Lisa Engineering 2004\n", "Sue HR 2014" ] }, "execution_count": 203, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df1a', 'df2a', 'df1a.join(df2a)')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If you'd like to mix indices and columns, you can combine ``left_index`` with ``right_on`` or ``left_on`` with ``right_index`` to get the desired behavior:" ] }, { "cell_type": "code", "execution_count": 204, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df1a

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
group
employee
BobAccounting
JakeEngineering
LisaEngineering
SueHR
\n", "
\n", "
\n", "
\n", "

df3

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namesalary
0Bob70000
1Jake80000
2Lisa120000
3Sue90000
\n", "
\n", "
\n", "
\n", "

pd.merge(df1a, df3, left_index=True, right_on='name')

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
groupnamesalary
0AccountingBob70000
1EngineeringJake80000
2EngineeringLisa120000
3HRSue90000
\n", "
\n", "
" ], "text/plain": [ "df1a\n", " group\n", "employee \n", "Bob Accounting\n", "Jake Engineering\n", "Lisa Engineering\n", "Sue HR\n", "\n", "df3\n", " name salary\n", "0 Bob 70000\n", "1 Jake 80000\n", "2 Lisa 120000\n", "3 Sue 90000\n", "\n", "pd.merge(df1a, df3, left_index=True, right_on='name')\n", " group name salary\n", "0 Accounting Bob 70000\n", "1 Engineering Jake 80000\n", "2 Engineering Lisa 120000\n", "3 HR Sue 90000" ] }, "execution_count": 204, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df1a', 'df3', \"pd.merge(df1a, df3, left_index=True, right_on='name')\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Specifying Set Arithmetic for Joins\n", "\n", "We have glossed over one important consideration in performing a join: the type of set arithmetic used in the join. This comes up when a value appears in one key column but not the other:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefood
0Peterfish
1Paulbeans
2Marybread
\n", "
\n", "
\n", "
\n", "

df7

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedrink
0Marywine
1Josephbeer
\n", "
\n", "
\n", "
\n", "

pd.merge(df6, df7)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefooddrink
0Marybreadwine
\n", "
\n", "
" ], "text/plain": [ "df6\n", " name food\n", "0 Peter fish\n", "1 Paul beans\n", "2 Mary bread\n", "\n", "df7\n", " name drink\n", "0 Mary wine\n", "1 Joseph beer\n", "\n", "pd.merge(df6, df7)\n", " name food drink\n", "0 Mary bread wine" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'], 'food': ['fish', 'beans', 'bread']},\n", " columns=['name', 'food'])\n", "df7 = pd.DataFrame({'name': ['Mary', 'Joseph'], 'drink': ['wine', 'beer']},\n", " columns=['name', 'drink'])\n", "display('df6', 'df7', 'pd.merge(df6, df7)')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Here we have merged two datasets that have only a single \"name\" entry in common: Mary.\n", "By default, the result contains the *intersection* of the two sets of inputs; this is what is known as an *inner join*.\n", "We can specify this explicitly using the ``how`` keyword, which defaults to ``\"inner\"``:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefooddrink
0Marybreadwine
\n", "
" ], "text/plain": [ " name food drink\n", "0 Mary bread wine" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df6, df7, how='inner')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Other options for the ``how`` keyword are ``'outer'``, ``'left'``, and ``'right'``.\n", "An *outer join* returns a join over the union of the input columns, and fills in all missing values with NAs:" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefood
0Peterfish
1Paulbeans
2Marybread
\n", "
\n", "
\n", "
\n", "

df7

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedrink
0Marywine
1Josephbeer
\n", "
\n", "
\n", "
\n", "

pd.merge(df6, df7, how='outer')

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefooddrink
0PeterfishNaN
1PaulbeansNaN
2Marybreadwine
3JosephNaNbeer
\n", "
\n", "
" ], "text/plain": [ "df6\n", " name food\n", "0 Peter fish\n", "1 Paul beans\n", "2 Mary bread\n", "\n", "df7\n", " name drink\n", "0 Mary wine\n", "1 Joseph beer\n", "\n", "pd.merge(df6, df7, how='outer')\n", " name food drink\n", "0 Peter fish NaN\n", "1 Paul beans NaN\n", "2 Mary bread wine\n", "3 Joseph NaN beer" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df6', 'df7', \"pd.merge(df6, df7, how='outer')\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The *left join* and *right join* return joins over the left entries and right entries, respectively:" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefood
0Peterfish
1Paulbeans
2Marybread
\n", "
\n", "
\n", "
\n", "

df7

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedrink
0Marywine
1Josephbeer
\n", "
\n", "
\n", "
\n", "

pd.merge(df6, df7, how='left')

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefooddrink
0PeterfishNaN
1PaulbeansNaN
2Marybreadwine
\n", "
\n", "
" ], "text/plain": [ "df6\n", " name food\n", "0 Peter fish\n", "1 Paul beans\n", "2 Mary bread\n", "\n", "df7\n", " name drink\n", "0 Mary wine\n", "1 Joseph beer\n", "\n", "pd.merge(df6, df7, how='left')\n", " name food drink\n", "0 Peter fish NaN\n", "1 Paul beans NaN\n", "2 Mary bread wine" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df6', 'df7', \"pd.merge(df6, df7, how='left')\")" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df6

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefood
0Peterfish
1Paulbeans
2Marybread
\n", "
\n", "
\n", "
\n", "

df7

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedrink
0Marywine
1Josephbeer
\n", "
\n", "
\n", "
\n", "

pd.merge(df6, df7, how='right')

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefooddrink
0Marybreadwine
1JosephNaNbeer
\n", "
\n", "
" ], "text/plain": [ "df6\n", " name food\n", "0 Peter fish\n", "1 Paul beans\n", "2 Mary bread\n", "\n", "df7\n", " name drink\n", "0 Mary wine\n", "1 Joseph beer\n", "\n", "pd.merge(df6, df7, how='right')\n", " name food drink\n", "0 Mary bread wine\n", "1 Joseph NaN beer" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df6', 'df7', \"pd.merge(df6, df7, how='right')\")" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [], "source": [ "pd.merge?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Overlapping Column Names: The ``suffixes`` Keyword\n", "\n", "Finally, you may end up in a case where your two input ``DataFrame``s have conflicting column names:" ] }, { "cell_type": "code", "execution_count": 210, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df8

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank
0Bob1
1Jake2
2Lisa3
3Sue4
\n", "
\n", "
\n", "
\n", "

df9

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank
0Bob3
1Jake1
2Lisa4
3Sue2
\n", "
\n", "
\n", "
\n", "

pd.merge(df8, df9, on=\"name\")

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank_xrank_y
0Bob13
1Jake21
2Lisa34
3Sue42
\n", "
\n", "
" ], "text/plain": [ "df8\n", " name rank\n", "0 Bob 1\n", "1 Jake 2\n", "2 Lisa 3\n", "3 Sue 4\n", "\n", "df9\n", " name rank\n", "0 Bob 3\n", "1 Jake 1\n", "2 Lisa 4\n", "3 Sue 2\n", "\n", "pd.merge(df8, df9, on=\"name\")\n", " name rank_x rank_y\n", "0 Bob 1 3\n", "1 Jake 2 1\n", "2 Lisa 3 4\n", "3 Sue 4 2" ] }, "execution_count": 210, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", " 'rank': [1, 2, 3, 4]})\n", "df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", " 'rank': [3, 1, 4, 2]})\n", "display('df8', 'df9', 'pd.merge(df8, df9, on=\"name\")')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Because the output would have two conflicting column names, the merge function automatically appends a suffix ``_x`` or ``_y`` to make the output columns unique.\n", "If these defaults are inappropriate, it is possible to specify a custom suffix using the ``suffixes`` keyword:" ] }, { "cell_type": "code", "execution_count": 211, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df8

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank
0Bob1
1Jake2
2Lisa3
3Sue4
\n", "
\n", "
\n", "
\n", "

df9

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank
0Bob3
1Jake1
2Lisa4
3Sue2
\n", "
\n", "
\n", "
\n", "

pd.merge(df8, df9, on=\"name\", suffixes=[\"_L\", \"_R\"])

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank_Lrank_R
0Bob13
1Jake21
2Lisa34
3Sue42
\n", "
\n", "
" ], "text/plain": [ "df8\n", " name rank\n", "0 Bob 1\n", "1 Jake 2\n", "2 Lisa 3\n", "3 Sue 4\n", "\n", "df9\n", " name rank\n", "0 Bob 3\n", "1 Jake 1\n", "2 Lisa 4\n", "3 Sue 2\n", "\n", "pd.merge(df8, df9, on=\"name\", suffixes=[\"_L\", \"_R\"])\n", " name rank_L rank_R\n", "0 Bob 1 3\n", "1 Jake 2 1\n", "2 Lisa 3 4\n", "3 Sue 4 2" ] }, "execution_count": 211, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df8', 'df9', 'pd.merge(df8, df9, on=\"name\", suffixes=[\"_L\", \"_R\"])')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Example: US States Data\n", "\n", "Merge and join operations come up most often when combining data from different sources.\n", "Here we will consider an example of some data about US states and their populations.\n", "The data files can be found at http://github.com/jakevdp/data-USstates/:" ] }, { "cell_type": "code", "execution_count": 221, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

pop.head()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
state/regionagesyearpopulation
0ALunder1820121117489.0
1ALtotal20124817528.0
2ALunder1820101130966.0
3ALtotal20104785570.0
4ALunder1820111125763.0
\n", "
\n", "
\n", "
\n", "

areas.head()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statearea (sq. mi)
0Alabama52423
1Alaska656425
2Arizona114006
3Arkansas53182
4California163707
\n", "
\n", "
\n", "
\n", "

abbrevs.head()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
stateabbreviation
0AlabamaAL
1AlaskaAK
2ArizonaAZ
3ArkansasAR
4CaliforniaCA
\n", "
\n", "
" ], "text/plain": [ "pop.head()\n", " state/region ages year population\n", "0 AL under18 2012 1117489.0\n", "1 AL total 2012 4817528.0\n", "2 AL under18 2010 1130966.0\n", "3 AL total 2010 4785570.0\n", "4 AL under18 2011 1125763.0\n", "\n", "areas.head()\n", " state area (sq. mi)\n", "0 Alabama 52423\n", "1 Alaska 656425\n", "2 Arizona 114006\n", "3 Arkansas 53182\n", "4 California 163707\n", "\n", "abbrevs.head()\n", " state abbreviation\n", "0 Alabama AL\n", "1 Alaska AK\n", "2 Arizona AZ\n", "3 Arkansas AR\n", "4 California CA" ] }, "execution_count": 221, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop = pd.read_csv('data/state-population.csv')\n", "areas = pd.read_csv('data/state-areas.csv')\n", "abbrevs = pd.read_csv('data/state-abbrevs.csv')\n", "\n", "display('pop.head()', 'areas.head()', 'abbrevs.head()')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Given this information, say we want to compute a relatively straightforward result: rank US states and territories by their 2010 population density.\n", "We clearly have the data here to find this result, but we'll have to combine the datasets to find the result.\n", "\n", "We'll start with a many-to-one merge that will give us the full state name within the population ``DataFrame``.\n", "We want to merge based on the ``state/region`` column of ``pop``, and the ``abbreviation`` column of ``abbrevs``.\n", "We'll use ``how='outer'`` to make sure no data is thrown away due to mismatched labels." ] }, { "cell_type": "code", "execution_count": 222, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
state/regionagesyearpopulationstate
0ALunder1820121117489.0Alabama
1ALtotal20124817528.0Alabama
2ALunder1820101130966.0Alabama
3ALtotal20104785570.0Alabama
4ALunder1820111125763.0Alabama
\n", "
" ], "text/plain": [ " state/region ages year population state\n", "0 AL under18 2012 1117489.0 Alabama\n", "1 AL total 2012 4817528.0 Alabama\n", "2 AL under18 2010 1130966.0 Alabama\n", "3 AL total 2010 4785570.0 Alabama\n", "4 AL under18 2011 1125763.0 Alabama" ] }, "execution_count": 222, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged = pd.merge(pop, abbrevs, how='outer',\n", " left_on='state/region', right_on='abbreviation')\n", "merged = merged.drop('abbreviation', 1) # drop duplicate info\n", "merged.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's double-check whether there were any mismatches here, which we can do by looking for rows with nulls:" ] }, { "cell_type": "code", "execution_count": 223, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state/region False\n", "ages False\n", "year False\n", "population True\n", "state True\n", "dtype: bool" ] }, "execution_count": 223, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged.isnull().any()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Some of the ``population`` info is null:" ] }, { "cell_type": "code", "execution_count": 224, "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", "
state/regionagesyearpopulationstate
2448PRunder181990NaNNaN
2449PRtotal1990NaNNaN
2450PRtotal1991NaNNaN
2451PRunder181991NaNNaN
2452PRtotal1993NaNNaN
\n", "
" ], "text/plain": [ " state/region ages year population state\n", "2448 PR under18 1990 NaN NaN\n", "2449 PR total 1990 NaN NaN\n", "2450 PR total 1991 NaN NaN\n", "2451 PR under18 1991 NaN NaN\n", "2452 PR total 1993 NaN NaN" ] }, "execution_count": 224, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged[merged['population'].isnull()].head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "It appears that all the null population values are from Puerto Rico prior to the year 2000; this is likely due to this data not being available from the original source.\n", "\n", "More importantly, we see also that some of the new ``state`` entries are also null, which means that there was no corresponding entry in the ``abbrevs`` key!\n", "Let's figure out which regions lack this match:" ] }, { "cell_type": "code", "execution_count": 225, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['PR', 'USA'], dtype=object)" ] }, "execution_count": 225, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged.loc[merged['state'].isnull(), 'state/region'].unique()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can quickly infer the issue: our population data includes entries for Puerto Rico (PR) and the United States as a whole (USA), while these entries do not appear in the state abbreviation key.\n", "We can fix these quickly by filling in appropriate entries:" ] }, { "cell_type": "code", "execution_count": 226, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state/region False\n", "ages False\n", "year False\n", "population True\n", "state False\n", "dtype: bool" ] }, "execution_count": 226, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged.loc[merged['state/region'] == 'PR', 'state'] = 'Puerto Rico'\n", "merged.loc[merged['state/region'] == 'USA', 'state'] = 'United States'\n", "merged.isnull().any()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No more nulls in the ``state`` column: we're all set!\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now we can merge the result with the area data using a similar procedure.\n", "Examining our results, we will want to join on the ``state`` column in both:" ] }, { "cell_type": "code", "execution_count": 227, "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", "
state/regionagesyearpopulationstatearea (sq. mi)
0ALunder1820121117489.0Alabama52423.0
1ALtotal20124817528.0Alabama52423.0
2ALunder1820101130966.0Alabama52423.0
3ALtotal20104785570.0Alabama52423.0
4ALunder1820111125763.0Alabama52423.0
\n", "
" ], "text/plain": [ " state/region ages year population state area (sq. mi)\n", "0 AL under18 2012 1117489.0 Alabama 52423.0\n", "1 AL total 2012 4817528.0 Alabama 52423.0\n", "2 AL under18 2010 1130966.0 Alabama 52423.0\n", "3 AL total 2010 4785570.0 Alabama 52423.0\n", "4 AL under18 2011 1125763.0 Alabama 52423.0" ] }, "execution_count": 227, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final = pd.merge(merged, areas, on='state', how='left')\n", "final.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Again, let's check for nulls to see if there were any mismatches:" ] }, { "cell_type": "code", "execution_count": 228, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state/region False\n", "ages False\n", "year False\n", "population True\n", "state False\n", "area (sq. mi) True\n", "dtype: bool" ] }, "execution_count": 228, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final.isnull().any()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "There are nulls in the ``area`` column; we can take a look to see which regions were ignored here:" ] }, { "cell_type": "code", "execution_count": 230, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['United States'], dtype=object)" ] }, "execution_count": 230, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final['state'][final['area (sq. mi)'].isnull()].unique()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We see that our ``areas`` ``DataFrame`` does not contain the area of the United States as a whole.\n", "We could insert the appropriate value (using the sum of all state areas, for instance), but in this case we'll just drop the null values because the population density of the entire United States is not relevant to our current discussion:" ] }, { "cell_type": "code", "execution_count": 231, "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", "
state/regionagesyearpopulationstatearea (sq. mi)
0ALunder1820121117489.0Alabama52423.0
1ALtotal20124817528.0Alabama52423.0
2ALunder1820101130966.0Alabama52423.0
3ALtotal20104785570.0Alabama52423.0
4ALunder1820111125763.0Alabama52423.0
\n", "
" ], "text/plain": [ " state/region ages year population state area (sq. mi)\n", "0 AL under18 2012 1117489.0 Alabama 52423.0\n", "1 AL total 2012 4817528.0 Alabama 52423.0\n", "2 AL under18 2010 1130966.0 Alabama 52423.0\n", "3 AL total 2010 4785570.0 Alabama 52423.0\n", "4 AL under18 2011 1125763.0 Alabama 52423.0" ] }, "execution_count": 231, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final.dropna(inplace=True)\n", "final.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now we have all the data we need. To answer the question of interest, let's first select the portion of the data corresponding with the year 2000, and the total population.\n", "We'll use the ``query()`` function to do this quickly:" ] }, { "cell_type": "code", "execution_count": 232, "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", "
state/regionagesyearpopulationstatearea (sq. mi)
3ALtotal20104785570.0Alabama52423.0
91AKtotal2010713868.0Alaska656425.0
101AZtotal20106408790.0Arizona114006.0
189ARtotal20102922280.0Arkansas53182.0
197CAtotal201037333601.0California163707.0
\n", "
" ], "text/plain": [ " state/region ages year population state area (sq. mi)\n", "3 AL total 2010 4785570.0 Alabama 52423.0\n", "91 AK total 2010 713868.0 Alaska 656425.0\n", "101 AZ total 2010 6408790.0 Arizona 114006.0\n", "189 AR total 2010 2922280.0 Arkansas 53182.0\n", "197 CA total 2010 37333601.0 California 163707.0" ] }, "execution_count": 232, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2010 = final.query(\"year == 2010 & ages == 'total'\")\n", "data2010.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now let's compute the population density and display it in order.\n", "We'll start by re-indexing our data on the state, and then compute the result:" ] }, { "cell_type": "code", "execution_count": 233, "metadata": {}, "outputs": [], "source": [ "data2010.set_index('state', inplace=True)\n", "density = data2010['population'] / data2010['area (sq. mi)']" ] }, { "cell_type": "code", "execution_count": 234, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state\n", "District of Columbia 8898.897059\n", "Puerto Rico 1058.665149\n", "New Jersey 1009.253268\n", "Rhode Island 681.339159\n", "Connecticut 645.600649\n", "dtype: float64" ] }, "execution_count": 234, "metadata": {}, "output_type": "execute_result" } ], "source": [ "density.sort_values(ascending=False, inplace=True)\n", "density.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The result is a ranking of US states plus Washington, DC, and Puerto Rico in order of their 2010 population density, in residents per square mile.\n", "We can see that by far the densest region in this dataset is Washington, DC (i.e., the District of Columbia); among states, the densest is New Jersey.\n", "\n", "We can also check the end of the list:" ] }, { "cell_type": "code", "execution_count": 235, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state\n", "South Dakota 10.583512\n", "North Dakota 9.537565\n", "Montana 6.736171\n", "Wyoming 5.768079\n", "Alaska 1.087509\n", "dtype: float64" ] }, "execution_count": 235, "metadata": {}, "output_type": "execute_result" } ], "source": [ "density.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the least dense state, by far, is Alaska, averaging slightly over one resident per square mile.\n", "\n", "This type of messy data merging is a common task when trying to answer questions using real-world data sources." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Aggregation and Grouping\n", "\n", "An essential piece of analysis of large data is efficient summarization: computing aggregations like ``sum()``, ``mean()``, ``median()``, ``min()``, and ``max()``, in which a single number gives insight into the nature of a potentially large dataset.\n", "\n", "we'll use the same ``display`` magic function as usual:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", " def __init__(self, *args):\n", " self.args = args\n", " \n", " def _repr_html_(self):\n", " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", " for a in self.args)\n", " \n", " def __repr__(self):\n", " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", " for a in self.args)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Planets Data\n", "\n", "Here we will use the Planets dataset, available via the [Seaborn package](http://seaborn.pydata.org/).\n", "It gives information on planets that astronomers have discovered around other stars (known as *extrasolar planets* or *exoplanets* for short). It can be downloaded with a simple Seaborn command:" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "ename": "URLError", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mSSLCertVerificationError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36mdo_open\u001b[0;34m(self, http_class, req, **http_conn_args)\u001b[0m\n\u001b[1;32m 1341\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1342\u001b[0;31m h.request(req.get_method(), req.selector, req.data, headers,\n\u001b[0m\u001b[1;32m 1343\u001b[0m encode_chunked=req.has_header('Transfer-encoding'))\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1254\u001b[0m \u001b[0;34m\"\"\"Send a complete request to the server.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1255\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1256\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36m_send_request\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1300\u001b[0m \u001b[0mbody\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_encode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'body'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1301\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mendheaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1302\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36mendheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1249\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCannotSendHeader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1250\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage_body\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1251\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36m_send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1009\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1010\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1011\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 949\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_open\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 950\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 951\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1423\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1424\u001b[0;31m self.sock = self._context.wrap_socket(self.sock,\n\u001b[0m\u001b[1;32m 1425\u001b[0m server_hostname=server_hostname)\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py\u001b[0m in \u001b[0;36mwrap_socket\u001b[0;34m(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)\u001b[0m\n\u001b[1;32m 499\u001b[0m \u001b[0;31m# ctx._wrap_socket()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 500\u001b[0;31m return self.sslsocket_class._create(\n\u001b[0m\u001b[1;32m 501\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msock\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py\u001b[0m in \u001b[0;36m_create\u001b[0;34m(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)\u001b[0m\n\u001b[1;32m 1039\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"do_handshake_on_connect should not be specified for non-blocking sockets\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1040\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdo_handshake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1041\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mOSError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py\u001b[0m in \u001b[0;36mdo_handshake\u001b[0;34m(self, block)\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettimeout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1309\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sslobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdo_handshake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1310\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mSSLCertVerificationError\u001b[0m: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[0;31mURLError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mplanets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'planets'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mplanets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[0;31m# 1,000+ extrasolar planets discovered up to 2014.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Developer/py-venvs/sphinx-venv/lib/python3.9/site-packages/seaborn/utils.py\u001b[0m in \u001b[0;36mload_dataset\u001b[0;34m(name, cache, data_home, **kws)\u001b[0m\n\u001b[1;32m 483\u001b[0m os.path.basename(full_path))\n\u001b[1;32m 484\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcache_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 485\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mget_dataset_names\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 486\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"'{name}' is not one of the example datasets.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 487\u001b[0m \u001b[0murlretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfull_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcache_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Developer/py-venvs/sphinx-venv/lib/python3.9/site-packages/seaborn/utils.py\u001b[0m in \u001b[0;36mget_dataset_names\u001b[0;34m()\u001b[0m\n\u001b[1;32m 417\u001b[0m \"\"\"\n\u001b[1;32m 418\u001b[0m \u001b[0murl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"https://github.com/mwaskom/seaborn-data\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 419\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 420\u001b[0m \u001b[0mhtml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 421\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0mopener\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 214\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 516\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maudit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'urllib.Request'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_method\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 517\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_open\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[0;31m# post-process response\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36m_open\u001b[0;34m(self, req, data)\u001b[0m\n\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m \u001b[0mprotocol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 534\u001b[0;31m result = self._call_chain(self.handle_open, protocol, protocol +\n\u001b[0m\u001b[1;32m 535\u001b[0m '_open', req)\n\u001b[1;32m 536\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 493\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 494\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 495\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 496\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36mhttps_open\u001b[0;34m(self, req)\u001b[0m\n\u001b[1;32m 1383\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1384\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhttps_open\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1385\u001b[0;31m return self.do_open(http.client.HTTPSConnection, req,\n\u001b[0m\u001b[1;32m 1386\u001b[0m context=self._context, check_hostname=self._check_hostname)\n\u001b[1;32m 1387\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py\u001b[0m in \u001b[0;36mdo_open\u001b[0;34m(self, http_class, req, **http_conn_args)\u001b[0m\n\u001b[1;32m 1343\u001b[0m encode_chunked=req.has_header('Transfer-encoding'))\n\u001b[1;32m 1344\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# timeout error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1345\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mURLError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1346\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetresponse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1347\u001b[0m \u001b[0;32mexcept\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mURLError\u001b[0m: " ] } ], "source": [ "import seaborn as sns\n", "planets = sns.load_dataset('planets')\n", "planets.shape # 1,000+ extrasolar planets discovered up to 2014." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "planets.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Simple Aggregation in Pandas" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.374540\n", "1 0.950714\n", "2 0.731994\n", "3 0.598658\n", "4 0.156019\n", "dtype: float64" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = np.random.RandomState(42)\n", "ser = pd.Series(rng.rand(5))\n", "ser" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.811925491708157, 0.5623850983416314)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ser.sum(), ser.mean()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For a ``DataFrame``, by default the aggregates return results within each column:" ] }, { "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", "
AB
00.1834050.611853
10.3042420.139494
20.5247560.292145
30.4319450.366362
40.2912290.456070
\n", "
" ], "text/plain": [ " A B\n", "0 0.183405 0.611853\n", "1 0.304242 0.139494\n", "2 0.524756 0.292145\n", "3 0.431945 0.366362\n", "4 0.291229 0.456070" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A': rng.rand(5), 'B': rng.rand(5)})\n", "df" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0.347115\n", "B 0.373185\n", "dtype: float64" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "By specifying the ``axis`` argument, you can instead aggregate within each row:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.397629\n", "1 0.221868\n", "2 0.408451\n", "3 0.399153\n", "4 0.373650\n", "dtype: float64" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean(axis='columns')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Pandas ``Series`` and ``DataFrame``s provide a convenience method ``describe()`` that computes several common aggregates for each column and returns the result:" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numberorbital_periodmassdistanceyear
count498.00000498.000000498.000000498.000000498.000000
mean1.73494835.7786712.50932052.0682132007.377510
std1.175721469.1282593.63627446.5960414.167284
min1.000001.3283000.0036001.3500001989.000000
25%1.0000038.2722500.21250024.4975002005.000000
50%1.00000357.0000001.24500039.9400002009.000000
75%2.00000999.6000002.86750059.3325002011.000000
max6.0000017337.50000025.000000354.0000002014.000000
\n", "
" ], "text/plain": [ " number orbital_period mass distance year\n", "count 498.00000 498.000000 498.000000 498.000000 498.000000\n", "mean 1.73494 835.778671 2.509320 52.068213 2007.377510\n", "std 1.17572 1469.128259 3.636274 46.596041 4.167284\n", "min 1.00000 1.328300 0.003600 1.350000 1989.000000\n", "25% 1.00000 38.272250 0.212500 24.497500 2005.000000\n", "50% 1.00000 357.000000 1.245000 39.940000 2009.000000\n", "75% 2.00000 999.600000 2.867500 59.332500 2011.000000\n", "max 6.00000 17337.500000 25.000000 354.000000 2014.000000" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "planets.dropna().describe() # dropping rows with missing values" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This can be a useful way to begin understanding the overall properties of a dataset.\n", "For example, we see in the ``year`` column that although exoplanets were discovered as far back as 1989, half of all known expolanets were not discovered until 2010 or after.\n", "This is largely thanks to the *Kepler* mission, which is a space-based telescope specifically designed for finding eclipsing planets around other stars." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The following table summarizes some other built-in Pandas aggregations:\n", "\n", "| Aggregation | Description |\n", "|--------------------------|---------------------------------|\n", "| ``count()`` | Total number of items |\n", "| ``first()``, ``last()`` | First and last item |\n", "| ``mean()``, ``median()`` | Mean and median |\n", "| ``min()``, ``max()`` | Minimum and maximum |\n", "| ``std()``, ``var()`` | Standard deviation and variance |\n", "| ``mad()`` | Mean absolute deviation |\n", "| ``prod()`` | Product of all items |\n", "| ``sum()`` | Sum of all items |\n", "\n", "These are all methods of ``DataFrame`` and ``Series`` objects." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## GroupBy: Split, Apply, Combine\n", "\n", "Simple aggregations can give you a flavor of your dataset, but often we would prefer to aggregate conditionally on some label or index: this is implemented in the so-called ``groupby`` operation.\n", "The name \"group by\" comes from a command in the SQL database language, but it is perhaps more illuminative to think of it in the terms first coined by Hadley Wickham of Rstats fame: *split, apply, combine*.\n", "\n", "### Split, apply, combine\n", "\n", "A canonical example of this split-apply-combine operation, where the \"apply\" is a summation aggregation, is illustrated in this figure:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![](images/03.08-split-apply-combine.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This makes clear what the ``groupby`` accomplishes:\n", "\n", "- The *split* step involves breaking up and grouping a ``DataFrame`` depending on the value of the specified key.\n", "- The *apply* step involves computing some function, usually an aggregate, transformation, or filtering, within the individual groups.\n", "- The *combine* step merges the results of these operations into an output array.\n", "\n", "While this could certainly be done manually using some combination of the masking, aggregation, and merging commands covered earlier, an important realization is that *the intermediate splits do not need to be explicitly instantiated*. Rather, the ``GroupBy`` can (often) do this in a single pass over the data, updating the sum, mean, count, min, or other aggregate for each group along the way.\n", "The power of the ``GroupBy`` is that it abstracts away these steps: the user need not think about *how* the computation is done under the hood, but rather thinks about the *operation as a whole*.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "As a concrete example, let's take a look at using Pandas for the computation shown in this diagram:" ] }, { "cell_type": "code", "execution_count": 156, "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", "
keydata
0A0
1B1
2C2
3A3
4B4
5C5
\n", "
" ], "text/plain": [ " key data\n", "0 A 0\n", "1 B 1\n", "2 C 2\n", "3 A 3\n", "4 B 4\n", "5 C 5" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],\n", " 'data': range(6)}, columns=['key', 'data'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The most basic split-apply-combine operation can be computed with the ``groupby()`` method of ``DataFrame``s, passing the name of the desired key column:" ] }, { "cell_type": "code", "execution_count": 157, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that what is returned is not a set of ``DataFrame``s, but a ``DataFrameGroupBy`` object.\n", "This object is where the magic is: you can think of it as a special view of the ``DataFrame``, which is poised to dig into the groups but does no actual computation until the aggregation is applied.\n", "This _lazy evaluation_ approach means that common aggregates can be implemented very efficiently in a way that is almost transparent to the user." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To produce a result, we can apply an aggregate to this ``DataFrameGroupBy`` object, which will perform the appropriate apply/combine steps to produce the desired result:" ] }, { "cell_type": "code", "execution_count": 158, "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", "
data
key
A3
B5
C7
\n", "
" ], "text/plain": [ " data\n", "key \n", "A 3\n", "B 5\n", "C 7" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('key').sum()" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``sum()`` method is just one possibility here; you can apply virtually any common Pandas or NumPy aggregation function, as well as virtually any valid ``DataFrame`` operation." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The GroupBy object\n", "\n", "The ``GroupBy`` object is a very flexible abstraction.\n", "In many ways, you can simply treat it as if it's a collection of ``DataFrame``s, and it does the difficult things under the hood. Let's see some examples using the Planets data.\n", "\n", "Perhaps the most important operations made available by a ``GroupBy`` are *aggregate*, *filter*, *transform*, and *apply* but before that let's introduce some of the other functionality that can be used with the basic ``GroupBy`` operation." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Column indexing\n", "\n", "The ``GroupBy`` object supports column indexing in the same way as the ``DataFrame``, and returns a modified ``GroupBy`` object:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "planets.groupby('method')" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "planets.groupby('method')['orbital_period']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Here we've selected a particular ``Series`` group from the original ``DataFrame`` group by reference to its column name. As with the ``GroupBy`` object, no computation is done until we call some aggregate on the object:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "method\n", "Astrometry 631.180000\n", "Eclipse Timing Variations 4343.500000\n", "Imaging 27500.000000\n", "Microlensing 3300.000000\n", "Orbital Brightness Modulation 0.342887\n", "Pulsar Timing 66.541900\n", "Pulsation Timing Variations 1170.000000\n", "Radial Velocity 360.200000\n", "Transit 5.714932\n", "Transit Timing Variations 57.011000\n", "Name: orbital_period, dtype: float64" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "planets.groupby('method')['orbital_period'].median()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Iteration over groups\n", "\n", "The ``GroupBy`` object supports direct iteration over the groups, returning each group as a ``Series`` or ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Astrometry shape=(2, 6)\n", "Eclipse Timing Variations shape=(9, 6)\n", "Imaging shape=(38, 6)\n", "Microlensing shape=(23, 6)\n", "Orbital Brightness Modulation shape=(3, 6)\n", "Pulsar Timing shape=(5, 6)\n", "Pulsation Timing Variations shape=(1, 6)\n", "Radial Velocity shape=(553, 6)\n", "Transit shape=(397, 6)\n", "Transit Timing Variations shape=(4, 6)\n" ] } ], "source": [ "for (method, group) in planets.groupby('method'):\n", " print(\"{0:30s} shape={1}\".format(method, group.shape))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Dispatch methods\n", "\n", "Through some Python class magic, any method not explicitly implemented by the ``GroupBy`` object will be passed through and called on the groups, whether they are ``DataFrame`` or ``Series`` objects.\n", "For example, you can use the ``describe()`` method of ``DataFrame``s to perform a set of aggregations that describe each group in the data:" ] }, { "cell_type": "code", "execution_count": 85, "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", "
countmeanstdmin25%50%75%max
method
Astrometry2.02011.5000002.1213202010.02010.752011.52012.252013.0
Eclipse Timing Variations9.02010.0000001.4142142008.02009.002010.02011.002012.0
Imaging38.02009.1315792.7819012004.02008.002009.02011.002013.0
Microlensing23.02009.7826092.8596972004.02008.002010.02012.002013.0
Orbital Brightness Modulation3.02011.6666671.1547012011.02011.002011.02012.002013.0
Pulsar Timing5.01998.4000008.3845101992.01992.001994.02003.002011.0
Pulsation Timing Variations1.02007.000000NaN2007.02007.002007.02007.002007.0
Radial Velocity553.02007.5189874.2490521989.02005.002009.02011.002014.0
Transit397.02011.2367762.0778672002.02010.002012.02013.002014.0
Transit Timing Variations4.02012.5000001.2909942011.02011.752012.52013.252014.0
\n", "
" ], "text/plain": [ " count mean std min 25% \\\n", "method \n", "Astrometry 2.0 2011.500000 2.121320 2010.0 2010.75 \n", "Eclipse Timing Variations 9.0 2010.000000 1.414214 2008.0 2009.00 \n", "Imaging 38.0 2009.131579 2.781901 2004.0 2008.00 \n", "Microlensing 23.0 2009.782609 2.859697 2004.0 2008.00 \n", "Orbital Brightness Modulation 3.0 2011.666667 1.154701 2011.0 2011.00 \n", "Pulsar Timing 5.0 1998.400000 8.384510 1992.0 1992.00 \n", "Pulsation Timing Variations 1.0 2007.000000 NaN 2007.0 2007.00 \n", "Radial Velocity 553.0 2007.518987 4.249052 1989.0 2005.00 \n", "Transit 397.0 2011.236776 2.077867 2002.0 2010.00 \n", "Transit Timing Variations 4.0 2012.500000 1.290994 2011.0 2011.75 \n", "\n", " 50% 75% max \n", "method \n", "Astrometry 2011.5 2012.25 2013.0 \n", "Eclipse Timing Variations 2010.0 2011.00 2012.0 \n", "Imaging 2009.0 2011.00 2013.0 \n", "Microlensing 2010.0 2012.00 2013.0 \n", "Orbital Brightness Modulation 2011.0 2012.00 2013.0 \n", "Pulsar Timing 1994.0 2003.00 2011.0 \n", "Pulsation Timing Variations 2007.0 2007.00 2007.0 \n", "Radial Velocity 2009.0 2011.00 2014.0 \n", "Transit 2012.0 2013.00 2014.0 \n", "Transit Timing Variations 2012.5 2013.25 2014.0 " ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "planets.groupby('method')['year'].describe()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "Looking at this table helps us to better understand the data: for example, the vast majority of planets have been discovered by the Radial Velocity and Transit methods, though the latter only became common (due to new, more accurate telescopes) in the last decade.\n", "The newest methods seem to be Transit Timing Variation and Orbital Brightness Modulation, which were not used to discover a new planet until 2011.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is just one example of the utility of dispatch methods.\n", "Notice that they are applied *to each individual group*, and the results are then combined within ``GroupBy`` and returned.\n", "Again, any valid ``DataFrame``/``Series`` method can be used on the corresponding ``GroupBy`` object, which allows for some very flexible and powerful operations!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Aggregate, filter, transform, apply\n", "\n", "``GroupBy`` objects have ``aggregate()``, ``filter()``, ``transform()``, and ``apply()`` methods that efficiently implement a variety of useful operations before combining the grouped data." ] }, { "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", " \n", " \n", " \n", "
keydata1data2
0A05
1B10
2C23
3A33
4B47
5C59
\n", "
" ], "text/plain": [ " key data1 data2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = np.random.RandomState(0)\n", "df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],\n", " 'data1': range(6),\n", " 'data2': rng.randint(0, 10, 6)},\n", " columns = ['key', 'data1', 'data2'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Aggregation\n", "\n", "We're now familiar with ``GroupBy`` aggregations with ``sum()``, ``median()``, and the like, but the ``aggregate()`` method allows for even more flexibility.\n", "It can take a string, a function, or a list thereof, and compute all the aggregates at once." ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
minmedianmaxminmedianmax
key
A01.5334.05
B12.5403.57
C23.5536.09
\n", "
" ], "text/plain": [ " data1 data2 \n", " min median max min median max\n", "key \n", "A 0 1.5 3 3 4.0 5\n", "B 1 2.5 4 0 3.5 7\n", "C 2 3.5 5 3 6.0 9" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('key').aggregate([min, np.median, max])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Filtering\n", "\n", "A filtering operation allows you to drop data based on the group properties.\n", "For example, we might want to keep all groups in which the standard deviation is larger than some critical value:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
0A05
1B10
2C23
3A33
4B47
5C59
\n", "
\n", "
\n", "
\n", "

df.groupby('key').std()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
key
A2.121321.414214
B2.121324.949747
C2.121324.242641
\n", "
\n", "
\n", "
\n", "

df.groupby('key').filter(filter_func)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
1B10
2C23
4B47
5C59
\n", "
\n", "
" ], "text/plain": [ "df\n", " key data1 data2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n", "\n", "df.groupby('key').std()\n", " data1 data2\n", "key \n", "A 2.12132 1.414214\n", "B 2.12132 4.949747\n", "C 2.12132 4.242641\n", "\n", "df.groupby('key').filter(filter_func)\n", " key data1 data2\n", "1 B 1 0\n", "2 C 2 3\n", "4 B 4 7\n", "5 C 5 9" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def filter_func(x):\n", " return x['data2'].std() > 4\n", "\n", "display('df', \"df.groupby('key').std()\", \"df.groupby('key').filter(filter_func)\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Transformation\n", "\n", "While aggregation must return a reduced version of the data, transformation can return some transformed version of the full data to recombine.\n", "For such a transformation, the output is the same shape as the input." ] }, { "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", "
data1data2
0-1.51.0
1-1.5-3.5
2-1.5-3.0
31.5-1.0
41.53.5
51.53.0
\n", "
" ], "text/plain": [ " data1 data2\n", "0 -1.5 1.0\n", "1 -1.5 -3.5\n", "2 -1.5 -3.0\n", "3 1.5 -1.0\n", "4 1.5 3.5\n", "5 1.5 3.0" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('key').transform(lambda x: x - x.mean())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### The apply() method\n", "\n", "The ``apply()`` method lets you apply an arbitrary function to the group results.\n", "The function should take a ``DataFrame``, and return either a Pandas object (e.g., ``DataFrame``, ``Series``) or a scalar; the combine operation will be tailored to the type of output returned." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
0A05
1B10
2C23
3A33
4B47
5C59
\n", "
\n", "
\n", "
\n", "

df.groupby('key').apply(norm_by_data2)

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
0A0.0000005
1B0.1428570
2C0.1666673
3A0.3750003
4B0.5714297
5C0.4166679
\n", "
\n", "
" ], "text/plain": [ "df\n", " key data1 data2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n", "\n", "df.groupby('key').apply(norm_by_data2)\n", " key data1 data2\n", "0 A 0.000000 5\n", "1 B 0.142857 0\n", "2 C 0.166667 3\n", "3 A 0.375000 3\n", "4 B 0.571429 7\n", "5 C 0.416667 9" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def norm_by_data2(x):\n", " # x is a DataFrame of group values\n", " x['data1'] /= x['data2'].sum()\n", " return x\n", "\n", "display('df', \"df.groupby('key').apply(norm_by_data2)\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Specifying the split key\n", "\n", "In the simple examples presented before, we split the ``DataFrame`` on a single column name.\n", "This is just one of many options by which the groups can be defined, and we'll go through some other options for group specification here." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### A list, array, series, or index providing the grouping keys\n", "\n", "The key can be any series or list with a length matching that of the ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
0A05
1B10
2C23
3A33
4B47
5C59
\n", "
\n", "
\n", "
\n", "

df.groupby(L).sum()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
0717
143
247
\n", "
\n", "
" ], "text/plain": [ "df\n", " key data1 data2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n", "\n", "df.groupby(L).sum()\n", " data1 data2\n", "0 7 17\n", "1 4 3\n", "2 4 7" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L = [0, 1, 0, 1, 2, 0]\n", "display('df', 'df.groupby(L).sum()')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Of course, this means there's another, more verbose way of accomplishing the ``df.groupby('key')`` from before:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keydata1data2
0A05
1B10
2C23
3A33
4B47
5C59
\n", "
\n", "
\n", "
\n", "

df.groupby(df['key']).sum()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
key
A38
B57
C712
\n", "
\n", "
" ], "text/plain": [ "df\n", " key data1 data2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n", "\n", "df.groupby(df['key']).sum()\n", " data1 data2\n", "key \n", "A 3 8\n", "B 5 7\n", "C 7 12" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df', \"df.groupby(df['key']).sum()\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### A dictionary or series mapping index to group\n", "\n", "Another method is to provide a dictionary that maps index values to the group keys:" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
key
A05
B10
C23
A33
B47
C59
\n", "
\n", "
\n", "
\n", "

df2.groupby(mapping).sum()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
consonant1219
vowel38
\n", "
\n", "
" ], "text/plain": [ "df2\n", " data1 data2\n", "key \n", "A 0 5\n", "B 1 0\n", "C 2 3\n", "A 3 3\n", "B 4 7\n", "C 5 9\n", "\n", "df2.groupby(mapping).sum()\n", " data1 data2\n", "consonant 12 19\n", "vowel 3 8" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df.set_index('key')\n", "mapping = {'A': 'vowel', 'B': 'consonant', 'C': 'consonant'}\n", "display('df2', 'df2.groupby(mapping).sum()')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Any Python function\n", "\n", "Similar to mapping, you can pass any Python function that will input the index value and output the group:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "

df2

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
key
A05
B10
C23
A33
B47
C59
\n", "
\n", "
\n", "
\n", "

df2.groupby(str.lower).mean()

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data1data2
a1.54.0
b2.53.5
c3.56.0
\n", "
\n", "
" ], "text/plain": [ "df2\n", " data1 data2\n", "key \n", "A 0 5\n", "B 1 0\n", "C 2 3\n", "A 3 3\n", "B 4 7\n", "C 5 9\n", "\n", "df2.groupby(str.lower).mean()\n", " data1 data2\n", "a 1.5 4.0\n", "b 2.5 3.5\n", "c 3.5 6.0" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display('df2', 'df2.groupby(str.lower).mean()')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### A list of valid keys\n", "\n", "Further, any of the preceding key choices can be combined to group on a multi-index:" ] }, { "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", "
data1data2
avowel1.54.0
bconsonant2.53.5
cconsonant3.56.0
\n", "
" ], "text/plain": [ " data1 data2\n", "a vowel 1.5 4.0\n", "b consonant 2.5 3.5\n", "c consonant 3.5 6.0" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.groupby([str.lower, mapping]).mean()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Grouping example\n", "\n", "As an example of this, in a couple lines of Python code we can put all these together and count discovered planets by method and by decade:" ] }, { "cell_type": "code", "execution_count": 99, "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", "
decade1980s1990s2000s2010s
method
Astrometry0.00.00.02.0
Eclipse Timing Variations0.00.05.010.0
Imaging0.00.029.021.0
Microlensing0.00.012.015.0
Orbital Brightness Modulation0.00.00.05.0
Pulsar Timing0.09.01.01.0
Pulsation Timing Variations0.00.01.00.0
Radial Velocity1.052.0475.0424.0
Transit0.00.064.0712.0
Transit Timing Variations0.00.00.09.0
\n", "
" ], "text/plain": [ "decade 1980s 1990s 2000s 2010s\n", "method \n", "Astrometry 0.0 0.0 0.0 2.0\n", "Eclipse Timing Variations 0.0 0.0 5.0 10.0\n", "Imaging 0.0 0.0 29.0 21.0\n", "Microlensing 0.0 0.0 12.0 15.0\n", "Orbital Brightness Modulation 0.0 0.0 0.0 5.0\n", "Pulsar Timing 0.0 9.0 1.0 1.0\n", "Pulsation Timing Variations 0.0 0.0 1.0 0.0\n", "Radial Velocity 1.0 52.0 475.0 424.0\n", "Transit 0.0 0.0 64.0 712.0\n", "Transit Timing Variations 0.0 0.0 0.0 9.0" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "decade = 10 * (planets['year'] // 10)\n", "decade = decade.astype(str) + 's'\n", "decade.name = 'decade'\n", "planets.groupby(['method', decade])['number'].sum().unstack().fillna(0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This shows the power of combining many of the operations we've discussed up to this point when looking at realistic datasets.\n", "We immediately gain a coarse understanding of when and how planets have been discovered over the past several decades!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Pivot Tables\n", "\n", "We have seen how the ``GroupBy`` abstraction lets us explore relationships within a dataset.\n", "A *pivot table* is a similar operation that is commonly seen in spreadsheets and other programs that operate on tabular data:\n", "- The pivot table takes simple column-wise data as input, and groups the entries into a two-dimensional table that provides a multidimensional summarization of the data.\n", "- The difference between pivot tables and ``GroupBy`` can sometimes cause confusion; it helps me to think of pivot tables as essentially a *multidimensional* version of ``GroupBy`` aggregation.\n", "- That is, you split-apply-combine, but both the split and the combine happen across not a one-dimensional index, but across a two-dimensional grid." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Motivating Pivot Tables\n", "\n", "We'll use the database of passengers on the *Titanic*, available through the Seaborn library:" ] }, { "cell_type": "code", "execution_count": 101, "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", "
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": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import seaborn as sns\n", "titanic = sns.load_dataset('titanic')\n", "titanic.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Pivot Tables by Hand\n", "\n", "To start learning more about this data, we might begin by grouping according to gender, survival status, or some combination thereof.\n", "If you have read the previous section, you might be tempted to apply a ``GroupBy`` operation–for example, let's look at survival rate by gender:" ] }, { "cell_type": "code", "execution_count": 102, "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", "
survived
sex
female0.742038
male0.188908
\n", "
" ], "text/plain": [ " survived\n", "sex \n", "female 0.742038\n", "male 0.188908" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.groupby('sex')[['survived']].mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This immediately gives us some insight: overall, three of every four females on board survived, while only one in five males survived." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is useful, but we might like to go one step deeper and look at survival by both sex and, say, class.\n", "Using the vocabulary of ``GroupBy``, we might proceed using something like this:\n", "we *group by* class and gender, *select* survival, *apply* a mean aggregate, *combine* the resulting groups, and then *unstack* the hierarchical index to reveal the hidden multidimensionality. In code:" ] }, { "cell_type": "code", "execution_count": 103, "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
sex
female0.9680850.9210530.500000
male0.3688520.1574070.135447
\n", "
" ], "text/plain": [ "class First Second Third\n", "sex \n", "female 0.968085 0.921053 0.500000\n", "male 0.368852 0.157407 0.135447" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This gives us a better idea of how both gender and class affected survival, but the code is starting to look a bit garbled.\n", "While each step of this pipeline makes sense in light of the tools we've previously discussed, the long string of code is not particularly easy to read or use.\n", "This two-dimensional ``GroupBy`` is common enough that Pandas includes a convenience routine, ``pivot_table``, which succinctly handles this type of multi-dimensional aggregation." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Pivot Table Syntax\n", "\n", "Here is the equivalent to the preceding operation using the ``pivot_table`` method of ``DataFrame``s:" ] }, { "cell_type": "code", "execution_count": 104, "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
sex
female0.9680850.9210530.500000
male0.3688520.1574070.135447
\n", "
" ], "text/plain": [ "class First Second Third\n", "sex \n", "female 0.968085 0.921053 0.500000\n", "male 0.368852 0.157407 0.135447" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.pivot_table('survived', index='sex', columns='class')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is eminently more readable than the ``groupby`` approach, and produces the same result.\n", "As you might expect of an early 20th-century transatlantic cruise, the survival gradient favors both women and higher classes.\n", "First-class women survived with near certainty (hi, Rose!), while only one in ten third-class men survived (sorry, Jack!)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Multi-level pivot tables\n", "\n", "Just as in the ``GroupBy``, the grouping in pivot tables can be specified with multiple levels, and via a number of options.\n", "For example, we might be interested in looking at age as a third dimension.\n", "We'll bin the age using the ``pd.cut`` function:" ] }, { "cell_type": "code", "execution_count": 105, "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", "
classFirstSecondThird
sexage
female(0, 18]0.9090911.0000000.511628
(18, 80]0.9729730.9000000.423729
male(0, 18]0.8000000.6000000.215686
(18, 80]0.3750000.0714290.133663
\n", "
" ], "text/plain": [ "class First Second Third\n", "sex age \n", "female (0, 18] 0.909091 1.000000 0.511628\n", " (18, 80] 0.972973 0.900000 0.423729\n", "male (0, 18] 0.800000 0.600000 0.215686\n", " (18, 80] 0.375000 0.071429 0.133663" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "age = pd.cut(titanic['age'], [0, 18, 80])\n", "titanic.pivot_table('survived', ['sex', age], 'class')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can apply the same strategy when working with the columns as well; let's add info on the fare paid using ``pd.qcut`` to automatically compute quantiles:" ] }, { "cell_type": "code", "execution_count": 106, "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", "
fare(-0.001, 14.454](14.454, 512.329]
classFirstSecondThirdFirstSecondThird
sexage
female(0, 18]NaN1.0000000.7142860.9090911.0000000.318182
(18, 80]NaN0.8800000.4444440.9729730.9142860.391304
male(0, 18]NaN0.0000000.2608700.8000000.8181820.178571
(18, 80]0.00.0980390.1250000.3913040.0303030.192308
\n", "
" ], "text/plain": [ "fare (-0.001, 14.454] (14.454, 512.329] \\\n", "class First Second Third First \n", "sex age \n", "female (0, 18] NaN 1.000000 0.714286 0.909091 \n", " (18, 80] NaN 0.880000 0.444444 0.972973 \n", "male (0, 18] NaN 0.000000 0.260870 0.800000 \n", " (18, 80] 0.0 0.098039 0.125000 0.391304 \n", "\n", "fare \n", "class Second Third \n", "sex age \n", "female (0, 18] 1.000000 0.318182 \n", " (18, 80] 0.914286 0.391304 \n", "male (0, 18] 0.818182 0.178571 \n", " (18, 80] 0.030303 0.192308 " ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fare = pd.qcut(titanic['fare'], 2)\n", "titanic.pivot_table('survived', ['sex', age], [fare, 'class'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result is a four-dimensional aggregation with hierarchical indices, shown in a grid demonstrating the relationship between the values." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Additional pivot table options\n", "\n", "The full call signature of the ``pivot_table`` method of ``DataFrame``s is as follows:\n", "\n", "```python\n", "# call signature as of Pandas 0.18\n", "DataFrame.pivot_table(data, values=None, index=None, columns=None,\n", " aggfunc='mean', fill_value=None, margins=False,\n", " dropna=True, margins_name='All')\n", "```\n", "\n", "We've already seen examples of the first three arguments; here we'll take a quick look at the remaining ones.\n", "Two of the options, ``fill_value`` and ``dropna``, have to do with missing data and are fairly straightforward; we will not show examples of them here.\n", "\n", "The ``aggfunc`` keyword controls what type of aggregation is applied, which is a mean by default.\n", "As in the GroupBy, the aggregation specification can be a string representing one of several common choices (e.g., ``'sum'``, ``'mean'``, ``'count'``, ``'min'``, ``'max'``, etc.) or a function that implements an aggregation (e.g., ``np.sum()``, ``min()``, ``sum()``, etc.)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Additionally, it can be specified as a dictionary mapping a column to any of the above desired options:" ] }, { "cell_type": "code", "execution_count": 107, "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", "
faresurvived
classFirstSecondThirdFirstSecondThird
sex
female106.12579821.97012116.118810917072
male67.22612719.74178212.661633451747
\n", "
" ], "text/plain": [ " fare survived \n", "class First Second Third First Second Third\n", "sex \n", "female 106.125798 21.970121 16.118810 91 70 72\n", "male 67.226127 19.741782 12.661633 45 17 47" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.pivot_table(index='sex', columns='class',\n", " aggfunc={'survived':sum, 'fare':'mean'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice also here that we've omitted the ``values`` keyword; when specifying a mapping for ``aggfunc``, this is determined automatically." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "At times it's useful to compute totals along each grouping.\n", "This can be done via the ``margins`` keyword:" ] }, { "cell_type": "code", "execution_count": 108, "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", "
classFirstSecondThirdAll
sex
female0.9680850.9210530.5000000.742038
male0.3688520.1574070.1354470.188908
All0.6296300.4728260.2423630.383838
\n", "
" ], "text/plain": [ "class First Second Third All\n", "sex \n", "female 0.968085 0.921053 0.500000 0.742038\n", "male 0.368852 0.157407 0.135447 0.188908\n", "All 0.629630 0.472826 0.242363 0.383838" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "titanic.pivot_table('survived', index='sex', columns='class', margins=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here this automatically gives us information about the class-agnostic survival rate by gender, the gender-agnostic survival rate by class, and the overall survival rate of 38%.\n", "The margin label can be specified with the ``margins_name`` keyword, which defaults to ``\"All\"``." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Example: Birthrate Data\n", "\n", "As a more interesting example, let's take a look at the freely available data on births in the United States, provided by the Centers for Disease Control (CDC).\n", "This data can be found at https://raw.githubusercontent.com/jakevdp/data-CDCbirths/master/births.csv:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 258k 100 258k 0 0 258k 0 --:--:-- --:--:-- --:--:-- 258k\n" ] } ], "source": [ "!curl -O https://raw.githubusercontent.com/jakevdp/data-CDCbirths/master/births.csv" ] }, { "cell_type": "code", "execution_count": 111, "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", "
yearmonthdaybirths
count15547.00000015547.00000015067.00000015547.000000
mean1979.0374356.51591917.7698949762.293561
std6.7283403.44963215.28403428552.465810
min1969.0000001.0000001.0000001.000000
25%1974.0000004.0000008.0000004358.000000
50%1979.0000007.00000016.0000004814.000000
75%1984.00000010.00000024.0000005289.500000
max2008.00000012.00000099.000000199622.000000
\n", "
" ], "text/plain": [ " year month day births\n", "count 15547.000000 15547.000000 15067.000000 15547.000000\n", "mean 1979.037435 6.515919 17.769894 9762.293561\n", "std 6.728340 3.449632 15.284034 28552.465810\n", "min 1969.000000 1.000000 1.000000 1.000000\n", "25% 1974.000000 4.000000 8.000000 4358.000000\n", "50% 1979.000000 7.000000 16.000000 4814.000000\n", "75% 1984.000000 10.000000 24.000000 5289.500000\n", "max 2008.000000 12.000000 99.000000 199622.000000" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "births = pd.read_csv('data/births.csv')\n", "births.describe()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Taking a look at the data, we see that it's relatively simple–it contains the number of births grouped by date and gender:" ] }, { "cell_type": "code", "execution_count": 112, "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", "
yearmonthdaygenderbirths
0196911.0F4046
1196911.0M4440
2196912.0F4454
3196912.0M4548
4196913.0F4548
\n", "
" ], "text/plain": [ " year month day gender births\n", "0 1969 1 1.0 F 4046\n", "1 1969 1 1.0 M 4440\n", "2 1969 1 2.0 F 4454\n", "3 1969 1 2.0 M 4548\n", "4 1969 1 3.0 F 4548" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "births.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can start to understand this data a bit more by using a pivot table.\n", "Let's add a decade column, and take a look at male and female births as a function of decade:" ] }, { "cell_type": "code", "execution_count": 113, "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", "
genderFM
decade
196017536341846572
19701626307517121550
19801831035119243452
19901947945420420553
20001822930919106428
\n", "
" ], "text/plain": [ "gender F M\n", "decade \n", "1960 1753634 1846572\n", "1970 16263075 17121550\n", "1980 18310351 19243452\n", "1990 19479454 20420553\n", "2000 18229309 19106428" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "births['decade'] = 10 * (births['year'] // 10)\n", "births.pivot_table('births', index='decade', columns='gender', aggfunc='sum')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We immediately see that male births outnumber female births in every decade.\n", "To see this trend a bit more clearly, we can use the built-in plotting tools in Pandas to visualize the total number of births by year:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "sns.set() # use Seaborn styles\n", "births.pivot_table('births', index='year', columns='gender', aggfunc='sum').plot()\n", "plt.ylabel('total births per year');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With a simple pivot table and ``plot()`` method, we can immediately see the annual trend in births by gender. By eye, it appears that over the past 50 years male births have outnumbered female births by around 5%." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Further data exploration\n", "\n", "Though this doesn't necessarily relate to the pivot table, there are a few more interesting features we can pull out of this dataset using the Pandas tools covered up to this point.\n", "We must start by cleaning the data a bit, removing outliers caused by mistyped dates (e.g., June 31st) or missing values (e.g., June 99th).\n", "One easy way to remove these all at once is to cut outliers; we'll do this via a robust sigma-clipping operation:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "quartiles = np.percentile(births['births'], [25, 50, 75])\n", "mu = quartiles[1]\n", "sig = 0.74 * (quartiles[2] - quartiles[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This final line is a robust estimate of the sample mean, where the 0.74 comes from the interquartile range of a Gaussian distribution." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With this we can use the ``query()`` method to filter-out rows with births outside these values:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [], "source": [ "births = births.query('(births > @mu - 5 * @sig) & (births < @mu + 5 * @sig)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we set the ``day`` column to integers; previously it had been a string because some columns in the dataset contained the value ``'null'``:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "# set 'day' column to integer; it originally was a string due to nulls\n", "births['day'] = births['day'].astype(int)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Finally, we can combine the day, month, and year to create a Date index.\n", "This allows us to quickly compute the weekday corresponding to each row:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "# create a datetime index from the year, month, day\n", "births.index = pd.to_datetime(10000 * births.year +\n", " 100 * births.month +\n", " births.day, format='%Y%m%d')\n", "\n", "births['dayofweek'] = births.index.dayofweek" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "\n", "births.pivot_table('births', index='dayofweek',\n", " columns='decade', aggfunc='mean').plot()\n", "plt.gca().set_xticklabels(['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'])\n", "plt.ylabel('mean births by day');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apparently births are slightly less common on weekends than on weekdays! Note that the 1990s and 2000s are missing because the CDC data contains only the month of birth starting in 1989." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Another intersting view is to plot the mean number of births by the day of the *year*.\n", "Let's first group the data by month and day separately:" ] }, { "cell_type": "code", "execution_count": 133, "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", "
births
114009.225
24247.400
34500.900
44571.350
54603.625
\n", "
" ], "text/plain": [ " births\n", "1 1 4009.225\n", " 2 4247.400\n", " 3 4500.900\n", " 4 4571.350\n", " 5 4603.625" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "births_by_date = births.pivot_table('births', [births.index.month, births.index.day])\n", "births_by_date.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result is a multi-index over months and days." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To make this easily plottable, let's turn these months and days into a date by associating them with a dummy year variable (making sure to choose a leap year so February 29th is correctly handled!)" ] }, { "cell_type": "code", "execution_count": 134, "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", "
births
2012-01-014009.225
2012-01-024247.400
2012-01-034500.900
2012-01-044571.350
2012-01-054603.625
\n", "
" ], "text/plain": [ " births\n", "2012-01-01 4009.225\n", "2012-01-02 4247.400\n", "2012-01-03 4500.900\n", "2012-01-04 4571.350\n", "2012-01-05 4603.625" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "births_by_date.index = [datetime(2012, month, day)\n", " for (month, day) in births_by_date.index]\n", "births_by_date.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Focusing on the month and day only, we now have a time series reflecting the average number of births by date of the year.\n", "From this, we can use the ``plot`` method to plot the data. It reveals some interesting trends:" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12, 4))\n", "births_by_date.plot(ax=ax);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In particular, the striking feature of this graph is the dip in birthrate on US holidays (e.g., Independence Day, Labor Day, Thanksgiving, Christmas, New Year's Day) although this likely reflects trends in scheduled/induced births rather than some deep psychosomatic effect on natural births.\n", "\n", "Looking at this short example, you can see that many of the Python and Pandas tools we've seen to this point can be combined and used to gain insight from a variety of datasets." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Working with Time Series\n", "\n", "Pandas was developed in the context of financial modeling, so as you might expect, it contains a fairly extensive set of tools for working with dates, times, and time-indexed data.\n", "Date and time data comes in a few flavors:\n", "\n", "- *Time stamps* reference particular moments in time (e.g., July 4th, 2015 at 7:00am).\n", "- *Time intervals* and *periods* reference a length of time between a particular beginning and end point; for example, the year 2015. Periods usually reference a special case of time intervals in which each interval is of uniform length and does not overlap (e.g., 24 hour-long periods comprising days).\n", "- *Time deltas* or *durations* reference an exact length of time (e.g., a duration of 22.56 seconds)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Dates and Times in Python\n", "\n", "The Python world has a number of available representations of dates, times, deltas, and timespans.\n", "While the time series tools provided by Pandas tend to be the most useful for data science applications, it is helpful to see their relationship to other packages used in Python." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Native Python dates and times: ``datetime`` and ``dateutil``\n", "\n", "Python's basic objects for working with dates and times reside in the built-in ``datetime`` module.\n", "Along with the third-party ``dateutil`` module, you can use it to quickly perform a host of useful functionalities on dates and times:" ] }, { "cell_type": "code", "execution_count": 237, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2015, 7, 4, 0, 0)" ] }, "execution_count": 237, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "datetime(year=2015, month=7, day=4)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Or, using the ``dateutil`` module, you can parse dates from a variety of string formats:" ] }, { "cell_type": "code", "execution_count": 238, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2015, 7, 4, 0, 0)" ] }, "execution_count": 238, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from dateutil import parser\n", "date = parser.parse(\"4th of July, 2015\")\n", "date" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Once you have a ``datetime`` object, you can do things like printing the day of the week:" ] }, { "cell_type": "code", "execution_count": 239, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Saturday'" ] }, "execution_count": 239, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date.strftime('%A')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "A related package to be aware of is [``pytz``](http://pytz.sourceforge.net/), which contains tools for working with the most migrane-inducing piece of time series data: time zones.\n", "\n", "The power of ``datetime`` and ``dateutil`` lie in their flexibility and easy syntax: you can use these objects and their built-in methods to easily perform nearly any operation you might be interested in.\n", "Where they break down is when you wish to work with large arrays of dates and times:\n", "just as lists of Python numerical variables are suboptimal compared to NumPy-style typed numerical arrays, lists of Python datetime objects are suboptimal compared to typed arrays of encoded dates." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Typed arrays of times: NumPy's ``datetime64``\n", "\n", "The weaknesses of Python's datetime format inspired the NumPy team to add a set of native time series data type to NumPy.\n", "The ``datetime64`` dtype encodes dates as 64-bit integers, and thus allows arrays of dates to be represented very compactly." ] }, { "cell_type": "code", "execution_count": 240, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array('2015-07-04', dtype='datetime64[D]')" ] }, "execution_count": 240, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date = np.array('2015-07-04', dtype=np.datetime64)\n", "date" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Once we have this date formatted, however, we can quickly do vectorized operations on it:" ] }, { "cell_type": "code", "execution_count": 241, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['2015-07-04', '2015-07-05', '2015-07-06', '2015-07-07',\n", " '2015-07-08', '2015-07-09', '2015-07-10', '2015-07-11',\n", " '2015-07-12', '2015-07-13', '2015-07-14', '2015-07-15'],\n", " dtype='datetime64[D]')" ] }, "execution_count": 241, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date + np.arange(12)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Because of the uniform type in NumPy ``datetime64`` arrays, this type of operation can be accomplished much more quickly than if we were working directly with Python's ``datetime`` objects, especially as arrays get large.\n", "\n", "One detail of the ``datetime64`` and ``timedelta64`` objects is that they are built on a *fundamental time unit*.\n", "Because the ``datetime64`` object is limited to 64-bit precision, the range of encodable times is $2^{64}$ times this fundamental unit. In other words, ``datetime64`` imposes a trade-off between *time resolution* and *maximum time span*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "If you want a time resolution of one nanosecond, you only have enough information to encode a range of $2^{64}$ nanoseconds, or just under 600 years:" ] }, { "cell_type": "code", "execution_count": 242, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.datetime64('2015-07-04')" ] }, "execution_count": 242, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.datetime64('2015-07-04') # a day-based datetime" ] }, { "cell_type": "code", "execution_count": 243, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.datetime64('2015-07-04T12:00')" ] }, "execution_count": 243, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.datetime64('2015-07-04 12:00') # a minute-based datetime" ] }, { "cell_type": "code", "execution_count": 244, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.datetime64('2015-07-04T12:59:59.500000000')" ] }, "execution_count": 244, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.datetime64('2015-07-04 12:59:59.50', 'ns') # a nanosecond-based datetiem" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The following table lists the available format codes along with the relative and absolute timespans that they can encode:\n", "\n", "|Code | Meaning | Time span (relative) | Time span (absolute) |\n", "|--------|-------------|----------------------|------------------------|\n", "| ``Y`` | Year\t | ± 9.2e18 years | [9.2e18 BC, 9.2e18 AD] |\n", "| ``M`` | Month | ± 7.6e17 years | [7.6e17 BC, 7.6e17 AD] |\n", "| ``W`` | Week\t | ± 1.7e17 years | [1.7e17 BC, 1.7e17 AD] |\n", "| ``D`` | Day | ± 2.5e16 years | [2.5e16 BC, 2.5e16 AD] |\n", "| ``h`` | Hour | ± 1.0e15 years | [1.0e15 BC, 1.0e15 AD] |\n", "| ``m`` | Minute | ± 1.7e13 years | [1.7e13 BC, 1.7e13 AD] |\n", "| ``s`` | Second | ± 2.9e12 years | [ 2.9e9 BC, 2.9e9 AD] |\n", "| ``ms`` | Millisecond | ± 2.9e9 years | [ 2.9e6 BC, 2.9e6 AD] |\n", "| ``us`` | Microsecond | ± 2.9e6 years | [290301 BC, 294241 AD] |\n", "| ``ns`` | Nanosecond | ± 292 years | [ 1678 AD, 2262 AD] |\n", "| ``ps`` | Picosecond | ± 106 days | [ 1969 AD, 1970 AD] |\n", "| ``fs`` | Femtosecond | ± 2.6 hours | [ 1969 AD, 1970 AD] |\n", "| ``as`` | Attosecond | ± 9.2 seconds | [ 1969 AD, 1970 AD] |" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Dates and times in pandas: best of both worlds\n", "\n", "Pandas builds upon all the tools just discussed to provide a ``Timestamp`` object, which combines the ease-of-use of ``datetime`` and ``dateutil`` with the efficient storage and vectorized interface of ``numpy.datetime64``.\n", "From a group of these ``Timestamp`` objects, Pandas can construct a ``DatetimeIndex`` that can be used to index data in a ``Series`` or ``DataFrame``:" ] }, { "cell_type": "code", "execution_count": 245, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2015-07-04 00:00:00')" ] }, "execution_count": 245, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date = pd.to_datetime(\"4th of July, 2015\")\n", "date" ] }, { "cell_type": "code", "execution_count": 246, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Saturday'" ] }, "execution_count": 246, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date.strftime('%A')" ] }, { "cell_type": "code", "execution_count": 247, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-04', '2015-07-05', '2015-07-06', '2015-07-07',\n", " '2015-07-08', '2015-07-09', '2015-07-10', '2015-07-11',\n", " '2015-07-12', '2015-07-13', '2015-07-14', '2015-07-15'],\n", " dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 247, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date + pd.to_timedelta(np.arange(12), 'D') # do NumPy-style vectorized operations directly on this same object" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Pandas Time Series: Indexing by Time\n", "\n", "Where the Pandas time series tools really become useful is when you begin to *index data by timestamps*:" ] }, { "cell_type": "code", "execution_count": 249, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2014-07-04 0\n", "2014-08-04 1\n", "2015-07-04 2\n", "2015-08-04 3\n", "dtype: int64" ] }, "execution_count": 249, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.DatetimeIndex(['2014-07-04', '2014-08-04', '2015-07-04', '2015-08-04'])\n", "data = pd.Series([0, 1, 2, 3], index=index)\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now that we have this data in a ``Series``, we can make use of any of the ``Series`` indexing patterns passing values that can be coerced into dates:" ] }, { "cell_type": "code", "execution_count": 250, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2014-07-04 0\n", "2014-08-04 1\n", "2015-07-04 2\n", "dtype: int64" ] }, "execution_count": 250, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['2014-07-04':'2015-07-04']" ] }, { "cell_type": "code", "execution_count": 251, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2015-07-04 2\n", "2015-08-04 3\n", "dtype: int64" ] }, "execution_count": 251, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['2015'] # additional special date-only indexing operations" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Pandas Time Series Data Structures\n", "\n", "The fundamental Pandas data structures for working with time series data:\n", "\n", "- For *time stamps*, Pandas provides the ``Timestamp`` type. As mentioned before, it is essentially a replacement for Python's native ``datetime``, but is based on the more efficient ``numpy.datetime64`` data type. The associated Index structure is ``DatetimeIndex``.\n", "- For *time Periods*, Pandas provides the ``Period`` type. This encodes a fixed-frequency interval based on ``numpy.datetime64``. The associated index structure is ``PeriodIndex``.\n", "- For *time deltas* or *durations*, Pandas provides the ``Timedelta`` type. ``Timedelta`` is a more efficient replacement for Python's native ``datetime.timedelta`` type, and is based on ``numpy.timedelta64``. The associated index structure is ``TimedeltaIndex``." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The most fundamental of these date/time objects are the ``Timestamp`` and ``DatetimeIndex`` objects.\n", "While these class objects can be invoked directly, it is more common to use the ``pd.to_datetime()`` function, which can parse a wide variety of formats.\n", "Passing a single date to ``pd.to_datetime()`` yields a ``Timestamp``; passing a series of dates by default yields a ``DatetimeIndex``:" ] }, { "cell_type": "code", "execution_count": 252, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-03', '2015-07-04', '2015-07-06', '2015-07-07',\n", " '2015-07-08'],\n", " dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 252, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates = pd.to_datetime([datetime(2015, 7, 3), '4th of July, 2015',\n", " '2015-Jul-6', '07-07-2015', '20150708'])\n", "dates" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Any ``DatetimeIndex`` can be converted to a ``PeriodIndex`` with the ``to_period()`` function with the addition of a frequency code; here we'll use ``'D'`` to indicate daily frequency:" ] }, { "cell_type": "code", "execution_count": 254, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2015-07-03', '2015-07-04', '2015-07-06', '2015-07-07',\n", " '2015-07-08'],\n", " dtype='period[D]', freq='D')" ] }, "execution_count": 254, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates.to_period('D')" ] }, { "cell_type": "code", "execution_count": 255, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['0 days', '1 days', '3 days', '4 days', '5 days'], dtype='timedelta64[ns]', freq=None)" ] }, "execution_count": 255, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates - dates[0] # A ``TimedeltaIndex`` is createdwhen subtracting" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Regular sequences: ``pd.date_range()``\n", "\n", "To make the creation of regular date sequences more convenient, Pandas offers a few functions for this purpose: ``pd.date_range()`` for timestamps, ``pd.period_range()`` for periods, and ``pd.timedelta_range()`` for time deltas:" ] }, { "cell_type": "code", "execution_count": 256, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-03', '2015-07-04', '2015-07-05', '2015-07-06',\n", " '2015-07-07', '2015-07-08', '2015-07-09', '2015-07-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 256, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2015-07-03', '2015-07-10') # by default, the frequency is one day" ] }, { "cell_type": "code", "execution_count": 257, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-03', '2015-07-04', '2015-07-05', '2015-07-06',\n", " '2015-07-07', '2015-07-08', '2015-07-09', '2015-07-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 257, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2015-07-03', periods=8)" ] }, { "cell_type": "code", "execution_count": 258, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-03 00:00:00', '2015-07-03 01:00:00',\n", " '2015-07-03 02:00:00', '2015-07-03 03:00:00',\n", " '2015-07-03 04:00:00', '2015-07-03 05:00:00',\n", " '2015-07-03 06:00:00', '2015-07-03 07:00:00'],\n", " dtype='datetime64[ns]', freq='H')" ] }, "execution_count": 258, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2015-07-03', periods=8, freq='H')" ] }, { "cell_type": "code", "execution_count": 260, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2015-07', '2015-08', '2015-09', '2015-10', '2015-11', '2015-12',\n", " '2016-01', '2016-02'],\n", " dtype='period[M]', freq='M')" ] }, "execution_count": 260, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.period_range('2015-07', periods=8, freq='M')" ] }, { "cell_type": "code", "execution_count": 261, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['00:00:00', '01:00:00', '02:00:00', '03:00:00', '04:00:00',\n", " '05:00:00', '06:00:00', '07:00:00', '08:00:00', '09:00:00'],\n", " dtype='timedelta64[ns]', freq='H')" ] }, "execution_count": 261, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.timedelta_range(0, periods=10, freq='H')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Frequencies and Offsets\n", "\n", "Fundamental to these Pandas time series tools is the concept of a frequency or date offset.\n", "Just as we saw the ``D`` (day) and ``H`` (hour) codes above, we can use such codes to specify any desired frequency spacing:\n", "\n", "| Code | Description | Code | Description |\n", "|--------|---------------------|--------|----------------------|\n", "| ``D`` | Calendar day | ``B`` | Business day |\n", "| ``W`` | Weekly | | |\n", "| ``M`` | Month end | ``BM`` | Business month end |\n", "| ``Q`` | Quarter end | ``BQ`` | Business quarter end |\n", "| ``A`` | Year end | ``BA`` | Business year end |\n", "| ``H`` | Hours | ``BH`` | Business hours |\n", "| ``T`` | Minutes | | |\n", "| ``S`` | Seconds | | |\n", "| ``L`` | Milliseonds | | |\n", "| ``U`` | Microseconds | | |\n", "| ``N`` | nanoseconds | | |" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The monthly, quarterly, and annual frequencies are all marked at the end of the specified period.\n", "By adding an ``S`` suffix to any of these, they instead will be marked at the beginning:\n", "\n", "| Code | Description || Code | Description |\n", "|---------|------------------------||---------|------------------------|\n", "| ``MS`` | Month start ||``BMS`` | Business month start |\n", "| ``QS`` | Quarter start ||``BQS`` | Business quarter start |\n", "| ``AS`` | Year start ||``BAS`` | Business year start |" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Additionally, you can change the month used to mark any quarterly or annual code by adding a three-letter month code as a suffix:\n", "\n", "- ``Q-JAN``, ``BQ-FEB``, ``QS-MAR``, ``BQS-APR``, etc.\n", "- ``A-JAN``, ``BA-FEB``, ``AS-MAR``, ``BAS-APR``, etc.\n", "\n", "In the same way, the split-point of the weekly frequency can be modified by adding a three-letter weekday code:\n", "\n", "- ``W-SUN``, ``W-MON``, ``W-TUE``, ``W-WED``, etc.\n", "\n", "On top of this, codes can be combined with numbers to specify other frequencies.\n", "For example, for a frequency of 2 hours 30 minutes, we can combine the hour (``H``) and minute (``T``) codes as follows:" ] }, { "cell_type": "code", "execution_count": 262, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['00:00:00', '02:30:00', '05:00:00', '07:30:00', '10:00:00',\n", " '12:30:00', '15:00:00', '17:30:00', '20:00:00'],\n", " dtype='timedelta64[ns]', freq='150T')" ] }, "execution_count": 262, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.timedelta_range(0, periods=9, freq=\"2H30T\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "All of these short codes refer to specific instances of Pandas time series offsets, which can be found in the ``pd.tseries.offsets`` module.\n", "For example, we can create a business day offset directly as follows:" ] }, { "cell_type": "code", "execution_count": 263, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2015-07-01', '2015-07-02', '2015-07-03', '2015-07-06',\n", " '2015-07-07'],\n", " dtype='datetime64[ns]', freq='B')" ] }, "execution_count": 263, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas.tseries.offsets import BDay\n", "pd.date_range('2015-07-01', periods=5, freq=BDay())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Resampling, Shifting, and Windowing\n", "\n", "The ability to use dates and times as indices to intuitively organize and access data is an important piece of the Pandas time series tools. The benefits of indexed data in general (automatic alignment during operations, intuitive data slicing and access, etc.) still apply, and Pandas provides several additional time series-specific operations.\n", "\n", "We will take a look at a few of those here, using some stock price data as an example.\n", "Because Pandas was developed largely in a finance context, it includes some very specific tools for financial data.\n", "\n", "For example, the accompanying ``pandas-datareader`` package (installable via ``pip install pandas-datareader``), knows how to import financial data from a number of available sources, including Yahoo finance, Google Finance, and others." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Download some data (**ADD A DESCRIPTION FOR IT**)" ] }, { "cell_type": "code", "execution_count": 21, "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", "
VIXCLS
DATE
2004-01-01NaN
2004-01-0218.22
2004-01-0517.49
2004-01-0616.73
2004-01-0715.50
\n", "
" ], "text/plain": [ " VIXCLS\n", "DATE \n", "2004-01-01 NaN\n", "2004-01-02 18.22\n", "2004-01-05 17.49\n", "2004-01-06 16.73\n", "2004-01-07 15.50" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas_datareader import data\n", "\n", "goog = data.DataReader('VIXCLS', start='2004', end='2016', data_source='fred')\n", "goog.head()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "goog = goog['VIXCLS'] # for simplicity consider its sole column" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn; seaborn.set()\n", "goog.plot();" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Resampling and converting frequencies\n", "\n", "One common need for time series data is resampling at a higher or lower frequency.\n", "This can be done using the ``resample()`` method, or the much simpler ``asfreq()`` method.\n", "The primary difference between the two is that ``resample()`` is fundamentally a *data aggregation*, while ``asfreq()`` is fundamentally a *data selection*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's compare what the two return when we down-sample the data; we will resample the data at the end of business year:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "goog.plot(alpha=0.5, style='-')\n", "goog.resample('BA').mean().plot(style=':')\n", "goog.asfreq('BA').plot(style='--');\n", "plt.legend(['input', 'resample', 'asfreq'], loc='upper left');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice the difference: at each point, ``resample`` reports the *average of the previous year*, while ``asfreq`` reports the *value at the end of the year*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For up-sampling, ``resample()`` and ``asfreq()`` are largely equivalent, though resample has many more options available.\n", "In this case, the default for both methods is to leave the up-sampled points empty, that is, filled with NA values.\n", "Just as with the ``pd.fillna()`` function discussed previously, ``asfreq()`` accepts a ``method`` argument to specify how values are imputed." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We resample the business day data at a daily frequency (i.e., including weekends):" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(2, sharex=True)\n", "data = goog.iloc[:10]\n", "\n", "data.asfreq('D').plot(ax=ax[0], marker='o')\n", "\n", "data.asfreq('D', method='bfill').plot(ax=ax[1], style='-o')\n", "data.asfreq('D', method='ffill').plot(ax=ax[1], style='--o')\n", "ax[1].legend([\"back-fill\", \"forward-fill\"]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The top panel is the default: non-business days are left as NA values and do not appear on the plot.\n", "The bottom panel shows the differences between two strategies for filling the gaps: forward-filling and backward-filling." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Time-shifts\n", "\n", "Another common time series-specific operation is shifting of data in time.\n", "Pandas has two closely related methods for computing this: ``shift()`` and ``tshift()``\n", "In short, the difference between them is that ``shift()`` *shifts the data*, while ``tshift()`` *shifts the index*.\n", "In both cases, the shift is specified in multiples of the frequency.\n", "\n", "Here we will both ``shift()`` and ``tshift()`` by 900 days; " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(3, sharey=True)\n", "\n", "# apply a frequency to the data\n", "goog = goog.asfreq('D', method='pad')\n", "\n", "goog.plot(ax=ax[0])\n", "goog.shift(900).plot(ax=ax[1])\n", "goog.tshift(900).plot(ax=ax[2])\n", "\n", "# legends and annotations\n", "local_max = pd.to_datetime('2007-11-05')\n", "offset = pd.Timedelta(900, 'D')\n", "\n", "ax[0].legend(['input'], loc=2)\n", "ax[0].get_xticklabels()[2].set(weight='heavy', color='red')\n", "ax[0].axvline(local_max, alpha=0.3, color='red')\n", "\n", "ax[1].legend(['shift(900)'], loc=2)\n", "ax[1].get_xticklabels()[2].set(weight='heavy', color='red')\n", "ax[1].axvline(local_max + offset, alpha=0.3, color='red')\n", "\n", "ax[2].legend(['tshift(900)'], loc=2)\n", "ax[2].get_xticklabels()[1].set(weight='heavy', color='red')\n", "ax[2].axvline(local_max + offset, alpha=0.3, color='red');" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We see here that ``shift(900)`` shifts the *data* by 900 days, pushing some of it off the end of the graph (and leaving NA values at the other end), while ``tshift(900)`` shifts the *index values* by 900 days.\n", "\n", "A common context for this type of shift is in computing differences over time. For example, we use shifted values to compute the one-year return on investment for Google stock over the course of the dataset:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ROI = 100 * (goog.tshift(-365) / goog - 1)\n", "ROI.plot()\n", "plt.ylabel('% Return on Investment');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This helps us to see the overall trend in Google stock: thus far, the most profitable times to invest in Google have been (unsurprisingly, in retrospect) shortly after its IPO, and in the middle of the 2009 recession." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Rolling windows\n", "\n", "Rolling statistics are a third type of time series-specific operation implemented by Pandas.\n", "These can be accomplished via the ``rolling()`` attribute of ``Series`` and ``DataFrame`` objects, which returns a view similar to what we saw with the ``groupby`` operation (see [Aggregation and Grouping](03.08-Aggregation-and-Grouping.ipynb)).\n", "This rolling view makes available a number of aggregation operations by default." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For example, here is the one-year centered rolling mean and standard deviation of the Google stock prices:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rolling = goog.rolling(40, center=True)\n", "\n", "data = pd.DataFrame({'input': goog,\n", " 'one-year rolling_mean': rolling.mean(),\n", " 'one-year rolling_std': rolling.std()})\n", "ax = data.plot(style=['-', '--', ':'])\n", "ax.lines[0].set_alpha(0.3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As with group-by operations, the ``aggregate()`` and ``apply()`` methods can be used for custom rolling computations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Example: Visualizing Seattle Bicycle Counts\n", "\n", "As a more involved example of working with some time series data, let's take a look at bicycle counts on Seattle's [Fremont Bridge](http://www.openstreetmap.org/#map=17/47.64813/-122.34965).\n", "This data comes from an automated bicycle counter, installed in late 2012, which has inductive sensors on the east and west sidewalks of the bridge.\n", "The hourly bicycle counts can be downloaded from http://data.seattle.gov/; here is the [direct link to the dataset](https://data.seattle.gov/Transportation/Fremont-Bridge-Hourly-Bicycle-Counts-by-Month-Octo/65db-xm6k).\n", "\n", "As of summer 2016, the CSV can be downloaded as follows:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 2024k 0 2024k 0 0 331k 0 --:--:-- 0:00:06 --:--:-- 462k\n" ] } ], "source": [ "!curl -o FremontBridge.csv https://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Once this dataset is downloaded, we can use Pandas to read the CSV output into a ``DataFrame``.\n", "We will specify that we want the Date as an index, and we want these dates to be automatically parsed:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "slideshow": { "slide_type": "-" } }, "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", "
Fremont Bridge TotalFremont Bridge East SidewalkFremont Bridge West Sidewalk
Date
2012-10-03 00:00:0013.04.09.0
2012-10-03 01:00:0010.04.06.0
2012-10-03 02:00:002.01.01.0
2012-10-03 03:00:005.02.03.0
2012-10-03 04:00:007.06.01.0
\n", "
" ], "text/plain": [ " Fremont Bridge Total Fremont Bridge East Sidewalk \\\n", "Date \n", "2012-10-03 00:00:00 13.0 4.0 \n", "2012-10-03 01:00:00 10.0 4.0 \n", "2012-10-03 02:00:00 2.0 1.0 \n", "2012-10-03 03:00:00 5.0 2.0 \n", "2012-10-03 04:00:00 7.0 6.0 \n", "\n", " Fremont Bridge West Sidewalk \n", "Date \n", "2012-10-03 00:00:00 9.0 \n", "2012-10-03 01:00:00 6.0 \n", "2012-10-03 02:00:00 1.0 \n", "2012-10-03 03:00:00 3.0 \n", "2012-10-03 04:00:00 1.0 " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_csv('data/FremontBridge.csv', index_col='Date', parse_dates=True)\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We'll further process this dataset by shortening the column names and adding a \"Total\" column:" ] }, { "cell_type": "code", "execution_count": 50, "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", "
Fremont Bridge TotalFremont Bridge East SidewalkFremont Bridge West SidewalkTotal
count64934.00000064934.00000064934.00000064934.000000
mean113.80503351.97619161.828842113.805033
std145.23540267.01324790.605138145.235402
min0.0000000.0000000.0000000.000000
25%14.0000006.0000007.00000014.000000
50%61.00000028.00000030.00000061.000000
75%148.00000070.00000074.000000148.000000
max1097.000000698.000000850.0000001097.000000
\n", "
" ], "text/plain": [ " Fremont Bridge Total Fremont Bridge East Sidewalk \\\n", "count 64934.000000 64934.000000 \n", "mean 113.805033 51.976191 \n", "std 145.235402 67.013247 \n", "min 0.000000 0.000000 \n", "25% 14.000000 6.000000 \n", "50% 61.000000 28.000000 \n", "75% 148.000000 70.000000 \n", "max 1097.000000 698.000000 \n", "\n", " Fremont Bridge West Sidewalk Total \n", "count 64934.000000 64934.000000 \n", "mean 61.828842 113.805033 \n", "std 90.605138 145.235402 \n", "min 0.000000 0.000000 \n", "25% 7.000000 14.000000 \n", "50% 30.000000 61.000000 \n", "75% 74.000000 148.000000 \n", "max 850.000000 1097.000000 " ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['Total'] = data[\"Fremont Bridge Total\"]\n", "data.dropna().describe() # have a look at summary statistics" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Visualizing the data\n", "\n", "We can gain some insight into the dataset by visualizing it:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import seaborn; seaborn.set()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data.plot()\n", "plt.ylabel('Hourly Bicycle Count');" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ~25,000 hourly samples are far too dense for us to make much sense of.\n", "We can gain more insight by resampling the data to a coarser grid:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAEMCAYAAABtKgnyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydd5wU5fnAvzOz5W7v9no/EBClCCLNqEGNNYoFiWJEooYgFixBI6g/VFQiQRFji2jsNSYxJhoxSrB3BOwRFencHdfL9t0pvz9mtt3t3u213QP2+/nw4Xbfmd1nZ2ff532fKmiappEmTZo0adKkADHVAqRJkyZNmn2XtBJKkyZNmjQpI62E0qRJkyZNykgroTRp0qRJkzLSSihNmjRp0qSMtBJKkyZNmjQpI62E0qRJkyZNyjClWoCBSnOzC1XtOoWqsDCbxkZnEiTqO9IyJ4e0zMljT5R7T5QZ4sstigL5+Vndfr20EoqDqmoJKaHgsXsaaZmTQ1rm5LEnyr0nygx9K3faHJcmTZo0aVJGWgmlSZMmTZqUkTbHJYimaTQ31+P3e4HwVrSuTkRV1dQJ1gPSMieHtMyRCFgsGeTnFyMIQj+8fpo9lbQSShCnsxVBECgtHYQghDeQJpOILO9ZE01a5uSQljmMpqm0tDTgdLZit+f1+eun2XNJm+MSxONxYrfnRSmgNGnSJIYgiNjt+Xg8e140WJr+JT2jJoiqKkhSeuOYJk1PkSQTqqqkWow0A4y0EuoGaVt2mjQ9J/376T+afviRTQuvwdvqSLUo3SZpS/vLLruMXbt2IYoiNpuNm266idGjR3PcccdhsViwWq0ALFiwgKOOOgqAL774gsWLF+Pz+aisrOTOO++ksLCwV2N7CzNmnI7FYsFi0a/bxImT+O1vr0mxVB157713KCoq4qCDxsYcX7r0Ftav/5Tc3DxUVSE/v5BFixZTWloW8/hHH32IYcP25/jjf95h7LHH/ozH4+GKK67qtdytrS3Mn38ZAB6Pm4aGegYPHgLAEUdM4ZJLLo977rvvvkVpaRljx8b+zJE8/PBKFEVh3rwrey1zmn2XLZ9/R05zI83VtZTn2lMtTrdImhK64447sNv1i/PGG2+waNEi/vWvfwFw3333MWLEiKjjVVVl4cKFLFu2jMmTJ7Ny5UpWrFjBsmXLejy2t3HbbXew//4HxB2XZRmTKbUmxPfff4dRo0bHVUIA5533a8466xwAVq68l2eeeYIFC/6vw3GKojB37qX9Jmskubl5PPnkXwD47LP1PPDAvTz22DMJnfvuu28zbtwhCSmhNGn6goo8K04gy7LnGbeSNkMFFRCA0+nscmv+zTffYLVamTx5MgAzZ87k+OOPZ9myZT0e2xdYuvQWJElix47tuN1unnzyL/zvf9/w0EP343K5ALjkknkcdtgUamqqmTv3fE4//ResXfsRPp+PxYtv4+WXX+Tbb7/BYrFy++13UVhYhKIoPPjg/axd+xEAhx32U+bNuxJJkli69BYsFgs7d+6grq6WMWMO5sYbb+XTTz/hgw/eY/36T3nllZc555xZTJ16WlzZVVXF7XZjt+cA+uR/770rGDlyNJs2fc/cufN45503GTVqNGeddQ5Op5Pbb1/Cli2bKSgopLS0lPx8fcfrdDpZtuxWtm7dQnFxCUVFxeTnF3DFFVcRCAR4+OGVfPHFBvz+AAcccADXXPN/2Gy2hK+zLMusXHkv69atBYK7oyv49NOP+fjjD/nii894+eV/cu655zNhwiRuvfVG3G43fr+Po446ptOdVJo03cXpcAPQ2OQiZ3j4edXnQzSsTAOVpC6Tb7jhBj788EM0TePRRx8NPb9gwQI0TWPSpEn87ne/Iycnh5qaGioqKkLHFBQUoKoqLS0tPR7Ly+vb0NA7nvuMo8dXcMSYMmRF5a6/fsHRh1RwxNgyfAGFe/7+JcdOrOQno0txe2Xuf/ErTpg8iEkjS3C4/az81zec9JP9GH9gEa1OHw+9/D9OOWIIB++fmOnwxhuvC5nj5s27ksMOOwKATZt+4E9/epjMzEwcDgcrVvyBO++8j6KiIhoaGrjoogt4+um/AdDa2sq4ceO59NIr+Mtfnuaqq+Zx//1/5rrrbmTFitt58cW/c/HFl/Hvf/+LTZt+4PHHnwNgwYLf8u9//4tf/GIGAFu2bOaee1YiiiK/+c2vWL9+LYcddgRHHnl0SGnE49lnn+KVV16mqamRrKwsHnzw8dDY1q1bWLhwEePHj0eWVd55583Q2BNPPILNlsVf/vIiLS0tzJnzK4477sTQmN2ew1/+8iJtba1ceOH5/OxnxwHw3HNPkZWVxSOPPA3AypX38cwzT3RLMbz00j/Ytm0rTzzxF1RV5Xe/u4JXX/0306b9giOOmMK4cYcwY8YvkWUVn8/LnXfeS2ZmJoFAgKuuuox169Zy6KGHJfx+adJ0RsAXwAyYhHB4vdzawpZrrqL4nHPJP/Gk1AnXBUlVQkuXLgXgpZdeYvny5TzyyCM899xzlJeX4/f7Wbp0KUuWLGHFihXJFCsmhYXZUY/r6kRMpuitbnAzZzKJIOiPRUnAZBJRNE1/LOqPTSbRGBejHkvG8VK7x4mwbNmdDB8ebY4TBIHjjz8Bu10vJLhx49fU1FSzcOFvo47ZvbuK3Nw8bDYbRx99NACjR4+mpKSU0aNHA3DQQQfx6aefYDKJbNjwKaeddjqZmbrSO+20abz77tucffYvEQSBY445lqysTABGjRpFTU218RmF0DWIhSAIXHDBbM4+eyYAjz/+CMuX38by5X9EkkQGD96P8ePHh65z5Ot9/vkGrrnmWkwmkaKiAo499riYYwUF+fzsZ8eExj766H1cLhfvvvsWAH6/nwMPHBFXRknSv5vI8Q0b1nH66WeQkWEJXY+PP/6QM888y/jexZDMfj888MDdfP31VwA0NjawZcsmjjjiCERRQNMS/86TQX/KIooixcX947Por9ftT/pKZrfbSy4wpNxOofGau2pqAKj/2/OMmDWjT94nSF9e65Q4DKZPn87ixYtpbm6mvLwcAIvFwqxZs5g3bx4A5eXlVFdXh85pampCFEXy8vJ6PNYdGhudUUX6VFXtkMR37ayJUcl9186aCIAsq0iCEPXYYhKjHmdaTFGPszPMUY8TQVE6yqRpGlZrRuh5WVYZPvxAHnjgkdAxQZlraqoxm82hYzVNwGy2RLymgCzLyLKKpukFXYNjqqqhaVpozGQKv44giAQCgZjntaf9+NFHH8fTTz+BLKsoikpGRiayrIZkjj5ei7oGqgqCEG9MA/QxVdX43e+uY9KkQ6NkiSejoqhoWvS4pnV8/eAxmkao6oAsqzzzzFO43R4eeeRpLBYLf/jDrXg83pAsnV2fZNPfCbaqqlJf3/cRXMXF9n553f6kL2UuyTbhA9qanKjGa9bWNofGd26rI8NYJPaWeHKLotBh8Z4ISVl+uVwuagytDPDWW2+Rm5uL1WrF4dA/jKZp/Oc//wmtwseOHYvX62X9+vUA/PWvf+Xkk0/u1di+yNix49i1aweffbY+9Ny33/4PTeteFdzJkw/jtddWGUpJ5rXXViVkTsrKysLpTDxB8bPP1jN48H4JHTtx4qH85z+vAHo023vvvR0amzBhEq+//ioADoeD999/LzR25JFH87e/PYfP5wXA7XaxbdvWhGUEmDz5J/znP/r1CAQCvP76q6HrYbNFf2aHw0FhYREWi4Xa2t189NH73XqvNGm6QvUHANheHVY8xVnm0N9N/9uYdJkSJSk7IY/Hw/z58/F4PIiiSG5uLg899BCNjY1ceeWVKIqCqqoMHz6cm2++GdC37cuXL+fmm2+OCrXuzdi+SE5ODrff/kceeOBe7r33LmQ5QGXlIG6//Y/dep1p037Brl07+c1vZgHwk58cwemn/6LL80466RSWLr2Vt99+M25gQtAnpGkqNlsWixbdkpBMs2fPZdmyW5k16ywKCgoZP35CxNhF/OEP+lhhYRGjRo0mO1tfpZ133mwee+zPzJ17gWE2E5gz5yKGDh2W0PsCTJ8+g+rqqtD1OOKIKZxyyukAnHzyqdx++xLeemsNM2eexy9/eS433XQ955//S0pKypg48dDOXjpNmm7j8/gQgcwIU6omB0J/ZzTXpkCqxBC07i6J9xHam+N2795OWdmQDsel64Mlh+7KLMsyiqJgtVpxuZxcdtlcrrji6qQGA+wL17m7xPsd9ZZ93Rz33m13U7btS8ouupScww4HYMu7HyM/82cA7IcfQfncS/rkvfraHJeuQ5Nmr8ThaOOaa36Lqqr4/T5OPPHkdDRamr2WQQVW5G2AEi6L5PX4MAEeazZ88jFZB40l56dTUiViXNJKKM1eSX5+AY8//myqxUiTJilIqoIM/LijkYk/1Z8blG9lNyCWD4Jt37H78UcGpBIaOHGhadKkSZOmR3jdPgCyzOEiAFpA9wkNPfn40HOKMvAKyKaVUJo0adLs4dQ36j6aktxwdYSdRqScMHQ4wgl60IzmD3Q4N9WklVCaNGnS7OGU5ehJ05osh54LeP0ACCYzRUV6cqmgyB1PTjFpJZQmTZo0ezhm9IjG77c1hp7brzADgMysDFRRd//Lfl/yheuCtBJKkyZNmj0cr1tPvM7NkELPBX1CgsnE1gYPAE3NruQL1wXp6Lg9lHQ/of7tJxTkyCMnM3z4AVFt3R955CnMZnMnZ8Wmq2uxadMP3HvvCpxOJ7IcIDvbzh/+cCcFBYXcfvvvmTr1NA45ZEKH85YuvaXLIrF9wZFHTua//30Pm83GjBmns3z53Z22EkmTPFpb3eQBJYZZDmBHdTOZoglBECgtzsED2MSBlxaaVkJ7MKnqJ6T6/Qhmc0KdMvfUfkKRPPjg491q8xCPrq7FrbfeyLx5VzJlit7UcefOHWRk6PW+rr/+pl6/f5q9l3ybhOYFLcLno/j8KKK+M8rPz8YDWIW0EtqrcL+yDEEQouqwmfb/CZYxx6PJPjyvdSyNYx5xJOaRR6F6HXjX/Knj+EHHYR7e86TKfu8n9MmHaLLMT35yOJfPX7BP9xO69tqraG1txefzcdBBY1i4cBFms5mvv/6Su+9ejqZpBAIyv/71HHJycru8FvX1tRQXF4ceR9bQu+KKizn33POZMuUo6uvruO22m2lsbKCsrDxUsRvA5XJy//13s3nzJvx+PxMmTObKK6+mqmonixZdy7PP/h1Zljn11OP59a8vZNasC3jzzTW8//473HLLUp577hnWrFmNoshYLFYWLLieAw8c2em1eP75Z/nkkw9ZuvTOUGmkNMlFVGUU4PutjQTvoP0KM3Bm6X6hoDLye71kpEbEuKSV0B5MKvoJPXj3Q2itjfzfXXfsM/2E5s2bEzLHlZaWcscddyNJEjfffBu5uXlomsZtt93Mq6++zPTpM3juuac499zzmTr1FAIBBafTid1u7/JaXHDBHC6//CLGjh3H2LHjOOGEkxgyZGiH4+65504OOWQCc+ZcTFXVLmbPnhX67u+//27Gj5/I9dffhKqq3HrrjaE+R263i4aGBnbvrmbYsOGsX7+OWbMuYMOGT5k8Wa9nd8opp3HOOb8CYN26tdx55zIefvjJmPKqqsY999xJa2srK1bc1yMTZZq+Qfb5EYB8W3hKVwMBBOM72d2qj1fVtJAzKjUyxiOthHqB7fT/i1trSzBZsZ3e0aQURMywdzqeCPHMccccczyZmboZ55tvvqSmppoFC6L7CVVV7SQ3N4/MTBs//emRAIwYMYri4pLQynfUqFGhzqHr16/llFNOw2Q2gcnMz485gbXr14aU0FFHHYPV6OA4cuRIqqp2cWiCdTojzXFPPvkod9zxe5YtuwuAQYMGM3bsuJjnff75eq66aiEAeXl5ISXTfiwnJ5ejjvpZaOzDD9/D5XLxzjt6P6FAwM8BBxwYV75Y5jhVVY0dwEeoqoLD4SAjQ19jTpw4maeeepyammomTfoJY8Yk1ub7V7/6NSeddAobNqxj/fpPufDC81ix4j7Gj58Yddxnn20IfbbKykEhBQLwwQfvsXHj//jrX/Xmg16vl5KS0pBcGzZ8Sk1NNWeccSbPPfc0gUCA9es/5bzzZgPw3Xff8uSTj9PW1oooiuzcuSOuvMuWLeHgg8exePHvEzLNpuk/Al4/FqAwO7wQqKppweTT56bCwhyagPzMgTflDzyJ0vQamy3cN0TT6LSfkMUSvmlFUQztrPTHUocMa1EUUQk39AtitVo6PS9RjjnmeJ599snQ48zM3vti2qNpcM0113foJ9Qd1qx5na+++oKVK/Xd2NNPPx6asH/5y1lMmXI0n332Kffcs5xDDz2ciy++LKHXLSoq5qSTTuGkk07BarXyzjtvdlBCnaPxhz+soLJyUIeRSZMOZcOGdVRXV7F48e/54ovPeOON1WgaVFRUEggEWLToWv70p0cYOXIUDQ31TJ8+Ne47jR8/gc8/30BLSzP5+QXdkDFNX6EGAmy7+UYsmu4LivQJIQdQjNBse04mTUCWeeD5hNIh2ns5fd1PSFMVZFnmjXff3Kf7CTmdDqMzrf751qx5PTS2Y8d2KisH8YtfzODss89l48b/AV1fi/fffyekvH0+H9u2baW8vKLDcZMmTebVV/8NQHV1FevXrwuNTZlyNM8++1TodVpaWqiurjLOO5S1az/G4XBQUlLK5Mk/4bHH/hzaSfn9PhRFCe2c/vnPFzq9BqeeOo2ZM89j/vx5NDTUd37B0vQpG154lY8ffg5fczNyXbhNw4/bG0PffVmOheJCPUlVlXRl5HV5ky9sF6R3Qns5fd1P6MLL5oKqMHnC5H2mn1CkTwhgxYp7Ofnk03j//feYNess8vMLOOSQCfh8eiLgP/7xVz77bAMWixmTyczVVy9M6Fq8/fabrFx5HxaLFUWRmTz5sJj+o/nzF3DbbTfzxhurKS+vYMKESRFj17By5X3Mnn0ugqB3yv3tb6+hoqKSkpJSbDYb48bp7dInTTqU2trdTJw4GYCsrGwuuuhSLrroAnJycjn22OM7vHd7fv7zqVgsFubPn8eKFffFVJpp+h77an2BIP3ixKjnS6u/Z/MlFzLi0SfRInxCTr++6Nz5vx/JGzsGc8HA2bmm+wnFId1PKDa+NgdaUwOKJZOsiti5PP1Bup9Qckj3E0oevZH5h7mzAbAvuAnHit93GB/x6JNsWPh/aJk2Ji+5CU9zCzsX6vlz1nETGPLb+X0ud7qfUJqkIEkCMh19QgONdD+hNPsCkbXi2iOqMrIRmm3NDAdmV23fTd8vA3pOWgml6RYCuvYxSQNbC6X7CaXZF8jPEInnZczLkMgoz9MfRCStZ2gDq4hpOjAhTbfw+Y0onLQRN02alBOsDxdvLOgTEiOUkDWthNLsyYiivgOSlT3L15EmTWd4d2xHdrSlWoxuE+wZ1B5N03A53exs6lg126L4+1usbpE0JXTZZZcxbdo0pk+fzqxZs9i4cSMAW7du5ZxzzuGkk07inHPOYdu2baFz+mMsTe8wGUpoYBvj0qTpHjuW3MyWq3/b9YEDDJMWJx9PUZBUBdHSsYqF7PagqgNnEZk0JXTHHXfw73//m5deeok5c+awaNEiAG6++WZmzZrF6tWrmTVrFosXLw6d0x9jaXqLbocb6D6hNGkSRZHDE7ln84+dHuvbuYOm/6zqb5E6RY4wwRVm6L/Dyt8tpLYsXPXD6/ZhRmW/ivwO50uoqJ0ENCSbpCkhu90e+tvpdCIIAo2NjXz77becdpqeL3Haaafx7bff0tTU1C9jexMzZpzOrFlnMXv2LGbPnsV9992VlPf1+rrnE3rvvXf49ttv4o4vXXoLv/jFKcyePYsLLjiH+fMvo7Z2d9zjH330Id58878xxx577M/86U/3JCZYAixZclNU9YYXX/wbP/vZYbhcYVfw+ef/kvXrP+3R63d1bTZt+oErrriY2bNncd55Z3PppXNoatKblt1+++/58svPY563dOktvPji33okU3c48sjJuN1uQL8ft2zpfAIfqKiucI+d799f32FccToJ+Hys//urbLv1Zhr++Q+0FO4kNH/YnBZw6dffUloaVTfOsbsWTZYRrdYO5wPgHThJq0mNjrvhhhv48MMP0TSNRx99lJqaGkpLS5EkPYxQkiRKSkqoqalB07Q+HyvoRoJW+3j3ujoRkym2zo73fH+zbNmdDB/es1YOPZXZYpJQ0X1CmaqMGpAxZcUvrfPBB+8yevRoxo2LXf9NEAQuuGA2Z589E4D777+HZ599kuuuWxTjWI1LL41f/kYUBURR6LPvY/LkQ3nrrTeYPXsOAF9++TmjRo3mm2++ZMqUo2hubqaqahfjx4/v0b3R1bVZsuRGLr/8txx55NEA7Nixg+zsLEwmkRtvvDnu6wpC765Dd84zmcK/C0kK/63KcpQzPIgoihQX2zs83xf09HXdvrAvyCx2fJ0PjZycnIjnCnOtSBm9r0fdE5l9op9gfY/6+lZMgDUni3ybRFCdbn/yabIFiUEnHku28R4/RLyGzQy5vfge+vI7TKoSWrp0KQAvvfQSy5cvZ/78nidM9Tftk1VVVY2ZxJfKhERF6ShTf7dy+OTjD0BRmDx+Ehf9ciaSKHHXc0/FbeXw/vvvsm7dWl5++aWYVQI0TUNVNWRZRVVVXC4XdnsOsqz2uJWDLKt90srhkEMmcs89d+H1+jGZTHz33UYuueRy1q9fz2GHTWH9+nWMHj0Gk8mCLKu89toq/vnPF1AUhezsbK67bhGVlfuFWjvonzPc2qGra1NXV0tBQVHoO66o0OvBybLaZWuH4DXtbmuHCy6YzerVq0OtHZ5//lnefPO/cVs7yHL4Hgzej88/9xQfvfc2ty1dTm5RSdRnUlW1X5JKe5P42bCpKvR3abaJ+noH/ro6AnW7sY6IXXJ66+Zackt6V3WgpzK3bq8LP/DqOyGnO4DsDQch5NZtIzB6Ap6MHDwx3uP7jbsYlpnT4flE2CuSVadPn87ixYspKyujtrYWRVGQJL3oZV1dHeXl5Wia1udjfcnamg18XLMOQej7cOUjyg/lsPJJXR6XilYOD9/zIEprM4tW3M6rb73BtBNOAvbOVg6VlYPIzs7m+++/w2azMWjQYCZOPJS//lXPP/r88w2hkjlffvk5b721hgceeASLxcLHH3/IbbfdyoMPPhZq7XDiiSejadqAbu1wwQWzo1o7nHzyqZx77nlA4q0dmpua+MPCRZhNcUxBA4yanXUEJQ2GPDeveR3Huk8pufG2mOdo/o5RZ8miqTG8c8uVVFxAhi2TxkYHkSqgqKyjPyhIjmngBCYkRQm5XC7a2tpCiuCtt94iNzeXwsJCRo8ezapVqzjjjDNYtWoVo0ePDpnN+mNsbyIVrRxUTcBsMnPScSfwwccfhpTQ3trKYcKESXz++XqysrKZMGES+fn5+Hw+XC4nn3++gauvvjb0mj/+uImLL54NYCgbfbUYbO2gX5PD96jWDt9/v5FnnnmiW60drr/2RoSGOvwBZcA1UItFaaZGi/H3tqpmioFNP9ZS6HRj0WKHM9tSmOZfmCEQ9Jr6nPpOSDCZsBKtWFQxvpBWNX5+UbJJ6FJ++eWXHHLIIR2e/+qrr+LasyPxeDzMnz8fj8eDKIrk5uby0EMPIQgCt9xyC9dffz0rV64kJyeHO+64I3Ref4z1FYeVT+Kw8kkDsj5Yf7ZyCIZoq0r09m9vbeUwceJk3nrrDbKzs5gxQ/dbHXzwIbz77ttUVVUxZszBodc89dRpUe3Hg9c52Nph3bq1A761w3//+3pUa4ebbrqu260dnK2t2AGTtGekIZp8HgBkyYyo6vdtc5ODElRUI/Ci7OJ5VD38EJIRHar6U5drI0UokJaGFjIECUEQkNqFa2+udRHP/uNsdTJQeuAmdJf85je/ifn83LlzE3qToqIi/v73v/PKK6/w8ssv8/TTTzNmzBgAhg8fzgsvvMDq1at54YUX2H///UPn9cfYvkaft3LQ9FYOa957i0nGDqWz19rTWzlMmDCJr7/+ko0bv2X0aP2ePeSQiTz99BMcdNCY0O5vypSjeP31V6kzyuorisJ3330LhFs7TJ9+1oBv7fDIIw/1urXD7667iobmJiwpCtjpLs11TWiiSEZ+LhV5+mJqwhDd8e5s0JNBvYIJIWJBVLO7NfmCGrQ2hf0xVi0QKsljbrcTKi2O9vnYDzscwbCQ7Ij0K6WYTndCqqqiaVrUvyA7duwIRaClGbj0dSuHi+bPA1Vl8viJnJJAqf89vZVDRUUlOTk5VFRUhiINJ0yYyK5dOzjxxJNCx40fP5GLL76M66//neGgD3D88SdywAGjQq0dzGYTZrNlj2rtcOGFl3S7tQOyyrXLlrBsyR0MyemZ8zuZVO+oxy5asJrMoYKgqtGWo6GqHhPQ4gOrPZuARw/uEZXUmbOqd7eEIvUy1ADYdKOnz+ONmtALC6Ij2MovuhS/x8O2K+dRbh84c3enrRxGjRoVt22vKIpceumlXHnllf0mXCpJt3KIjWN3HWavC8FsDjlxzYP367Agcbc6UAMBsov6xhe3r7VykFtaUP0+TLl58XM9+oG+uJ+9bQ5oaiBgy8FeUhg1NhBbOWy77z4CNdU4fCqyPZef3HoDG363EHtbPZmnnYln1T8pX3QzdU8/gbJL94lVXHkV2YeMT4nMdWvW0PI33cen5eRhtpjY//YV/PjoE6ifvBs6Lv/scyk+6aSoczVNY9MlF1Jw8ikUnTmjT+Xul+i4N998E03TOP/883n22XBFYkEQKCgoIKMP4uT3ZdRAAMFkiqvoByJBn5CiqCFbbvB/NRDAX1ONuawcsbkBEdAK81Py+fb0Vg6BtjYEVUExm5OqhPoCk6i3+9hTimpIPjdSXg6ORicmwycU8OimWrlNN7tZs2xUO1VKjXO0QOp8QqaIXZjiduOUswAYPufXuA+fTNU9elDP1no3xe3OFQQBrBk4WhwUJUvgLuhUCVVWVgLw9ttvd3ZYmh6g+nz4a6oxFRRi2gNMFkFMooBCu9pxxmY64PGCquJze0OKSVMUhDgJs/3Jnt7KQdM0BPQKFR2rfw1sgqtrReQAACAASURBVPeGOY5PqLGqjsLKkphjqcBZU4tl2P4URyyWim0SSiuoDn3Fr5gslJYXQssuALZsb+SQySkRNypE2yT7MeXo1gZBFJGywya4spLY84pDEXHvbCB2H+Hkk9Ds0NLSwuOPP87GjRtDZTqCPPfcc/0i2N6O7NNXUrLXu0cpIc2IDopUQoqqYgJENBTAJIBqJFBpAX9UL5OBgOr3o8kykq3vI+/6ClEQQIM9xLcfhc8v67tgtaOlX/H7aVtyM99NOIYpl89Oumztcbc5kdqa2S3mMMTkRTXK2QTzgBx1jdgALFZyCnMJTv9Wehb92Rfs3t1CpArPz8sK/V3v9Ec8H9s0lp1nJ88+cH6TCUlyzTXX4Pf7mTp1aij/JE3vCARkJCAgq3tELkUQn1/RV+Za2G8QnGx83gAmQNBUFEFC0mR8Li+2fgiz7g1+IzpMihGIMHAwCsWKe4hNK4KgxH5ZxtJuTDMm+eLP38G77WcgimTsl7o+n0KDHs14wIRRbF+9C8nRxiBVRfbqu3mb7AFBwGqz0hwQCHo+S+2p258OK87EtTH8ONgzCCAjw4rH+DvYVbU9mfYsBHXgtHNISAl9/vnnfPLJJ1gs7W+pND3FLImogMUycFYkiRCaFCPiWSTjOZOgP6fJCoIogAqaPHCS4tqjadrA9ccZ1zfWbmKgYw62gG/3vKYoaIEAmSNG4vnhe6pX3o8WCLD/H+9L2ffgr6kGIH//IewymzGhovgDiMb1V50OJIsVUZLY3BRghHGemkqfULtQ7F1NXgYbf+fmZhLsMFTV4iNWzYSAZEFp6/vSST0loc3+yJEj2b07fmXjNN1HNCZsPUR4z0GKtTI3frCS8Zl8/gCSMamYGbiTaCorIXeGpmmhaxrsZLtHYcjePk8oENA/S0vJUADkpiYUh4Pm3Q1JFS+SXd/8iCaZMJeUUFGaS45VRIxYOAkuJ4pJ32kcMiac8LtpW33SZQ3S3OxCizBx27LD1ilBCj9fXBjbzF/tVGhtGjgN/BJahh9++OHMnTuXM888k6Ki6JiKGTN6Fua3r6MYP0hFVfcox3OsiH5ZUbEAqpEQaRbCk+hA7gOuyAriAM912xPNcT6/bmpu/90LxmPb4EEEEBCNBYpz+04KytvHcSWHph3VWM3ZCKKIYDajBgKoEXXhBDTaZF2ZFo08kJqiIuSGBmxi6u7r+gYHOZjJRJ9DSiKSUl2B8MIqJye266SyshDZUdO/QnaDhJTQ+vXrKS0t5cMPP4x6XhCEtBLqIX6/HvUU6EF9rYsu+jWBQABZDrBz5w6GDRsOwIgRI1m0KHaJ/w0b1qGqakJhyq+88hLr16/l1luXdZQ7oHRQmkGTUcAvh31Csh7CHZCVDn6BgYI0UHdpkabOPU8HEbSstb9XgkqnfHAJ2+x5iA7dcGR3NSZZwjBDciXULH1hvaPBQ6bTS0tTdBWLQmOSzzzwQPa/fQWbr7oypT6hIcWZ+APZqA2690cwhWWxRoTzK3Fqx9nz7LQYirbquy1se/N9jph3fsqsMgkpoWeeeaa/5djnsIi669li0n+xmrGLEBJYmT/yyFMAoVYMTz75ly7P2bBhHYqi9DpXxiQJIMd4jvCkrikqQiiKboBO9IDicoEgIA4wX2fkblPTBqbJsDPMktAhdsy1a1fIzyJl2rBXluH5TldCwUCRVKC6XZgN644lw4KEgtsRrYTM7aIoBYslqrFcshFVBbPNRnC/trnOTZnxtzUzfC+3eJWY9eE8ggnN50ORFRrvu4tivwtf25lk5vVPn6euSEgJddaPfE/zafQVbR99SOsH7yEIQrfrsIFRAFFVQZIQzWZUnxc0EDMyyD3yaOyHHY7idCLl5HTLafv004+zZs3rABx00Fiuvvpadu7czqpVL6NpGmvXfszJJ0/lzDPP4brrrqa1tRW/38+YMWNZuHBR3CZ4QSRBoOPdYCgcY8LUFCMwQRvYK3mlrRWlrZWMARYlF/l7C8gqe1aqKqGdnNkoYBrw+ZEi/Cxtiog/KxcA2ZLB9m9+DCWBJht3cytigT6FD6rIp+lrlWKbxK6IY5xK9E3c7FXZvaMxNPEnm7ZWN6giJlEEVSU3N6wkI3PycnOzYp1OdZtCAeBpc5Kh6NGKZiF1i52ElNBBBx0UdyLcuHFjzOfTdEF7n0k7PSa36hOkIElI2YmVwvjgg/d4883/8uc/P0Fmpo0lS27iqace45JLLue0085AURTmzbsSk0nE75e59dY/kJOTi6qqLFlyE6+9torTT5/ehdgdFW4goCBmaLpSFQTd9m+Y6DRNI9BQj2TPGTiZ//3RBKoPESN+awNZicfD51eMicVYnHiicwuz83NY57YwRJBwlQwhoyl1QU+q202jT2QUxgSuKKFcoSANnuhzTBlWTKbU3T8trW40yUSxsVipHB4OmNAi7p3MrNiG/iFDi3F8AibFD4YFJpU7u4SU0Jtvvhn1uL6+nocffphjjz22X4TaE8j56RRyfjqlx7W23Nu3I2oqsmQme/AgvEYV5+Cq3F2nl73xOlxkJaiE1q//lBNOOBmbTV8BnX76dB588P4OzdpAX20/++xTfPrpJ6iqQltbGzkJJM0GZKXDTaNpGopR+FGTTAiRYdmKguJ0orhcZMRoyJYKNIQBbSYMKUihaznVQADV5ULKzR0w4eZihE/IAlGOfoAMexbHXXouDTt+Rsm3n9H83x/RVBUhyVYVNRDAosmMGqlXJt9a7yYH2Lm9lkij+PDxI6LOy8/PRrSmLqClPM+CZM/B27wTAHNJeB8piiKqKCGqClocn1B2nh0HIER8Lw2NbZQXpyY4JCElFCzfE/n4jjvuYMaMGZx99tn9ItjejKZpiIbpyhxnqasqCiIg+r3IjjZM9r6tqrB69X/YuPF/rFz5KDabjSeeeITa2q5XpJIo0N7gb5HE0M5HMJkgVm7QgNp5RMjSbuJTA35QtZTu2kLmOEHs8rqpbhdySzOS3Q4DJNLPJOom2+CVVWQ1KmdIEEUysjIZNHo4Lbu36QuVtjZMeXlJlVN16xWxzXZ9kZdpVKP2tjqINGTl7B9trhUtlpT2ExIUBVOEH7PFnB3t+5EkUBUUUYoZeesT9GfbmsO5Qqn8PD1eejidTpqamvpSln2HyIml3SQTzF2xiJph2lKRW1pIhMmTf8Kbb/4Xt9uNpmm8+urLoUCErKwsXK6ww9XpdJCbm4fNZqOtrY033lid0HuIAgjW6G2+3NaK6tZfW4vM0h6g/sLICVETomX0V1WFEhhThaLo94CidZ2s6nbrk4cip66MTEeMag9SuNhtPBqM2NAdm+J3bO0vmuv0wIg2VV+LV5bpSnCwPfqeMA0aHPV4Z5OPmt2J/Sb7A7fTQ6s3/H0XDo1uWCgZFRTMGbEDbpr9+vdSWxOev/MzUvdbTWgntHDhwqitvtfrZd26dUybNq3fBNubiUySVNv9QFVFRRJFNFlGzMxEFSQ0d2JN4Y488mi2bPmRSy6ZDeiBCRdcMAfQO5YuWrSQ2bNncfLJUznllDP48MP3Q714DjlkQqcBKAByWxua34+QacNSOQjZ4UBta0Xz+1GMlZRkMaMaLgBBFKM+aypMLqH3lmX8tbsxF5dEKX4twnelBgZGdQeTJBAAJJMEAQVNVVH9fqQYVeuDuTeyLGOyDowoP7/hEwr6D80mAS2OjswsLsYFCG3Jn9Rb6nUl5DSSCASzPh0qbdEN6ywF0e1IbPZMRF/qmtp53V5cTjkUzJGZFZ0P5PKrZIhS3H5vZeX51ADl2SLB4PgB7xMaMiS6tlNmZiYzZ87kpz/9ab8ItbcTXBlqCB1CcIM+AFWW0cxWVA1Mhs9FEMWoaMTy8gpefTXaX3fBBXNCiieSyspBPPXU80C4Z8x99z0UU77TT58eM0BBbtJvWb+sYjWbEe05qO1+sJE7IVkjyrYu+3yYU1R70OtwIQQC+Jqao3ZCoqARaG5Gbm1BzBoYDY+NwhOIkogaAG9TM4KzDa2kFFNEuLAiK1jNAqofzAPDHQSEfUJyMLJP0/RdcYxFTtnQCjYDeYru/a/fUUPxfvGaUvct5TaBamDo/vp0vr3RSwaw44edZJmtlE07A39jQ4cI4JLiHLwttUmRMRY5GRJlQwtx7ow9LlnMaIH4C8oMw/woRviEtu9q5KCxfSpmwiSkhK644or+lmOfIuhWESQJQW23RNQ0VEVB0DQUQcRqMaG4IbBrJ6rJgm1QZczXTCbBEv2S0TcmEslsCj0niBIo4SP8Xn/KlJBkklABwZBHtedhFjWU1laU1hYEQPPqE6FGauvKycFFimEq1POuQHW5wFBCPrcXrS4i630A5RNJRg5c8OqpqgaCRKzgfjErC8Fiwd/YyA9rv4JH/ojzt4sYNm5Eh2P7GsWl+4RMRuBPVlYGCmB2teI1Z1Iw9ZSY5wmihNb+d5tM5AAmi4W2n5+NNadjbo8miPjU+PeulJ2NhkD1tz+GfEYmJXXloRKunvniiy/y8ssvU1tbS2lpKWeccQZnnXVWQuc2Nzdz7bXXsmPHDiwWC0OGDGHJkiUUFBQwcuRIRowYEVptLF++nJEjRwLw1ltvsXz5chRFYcyYMSxbtixUxbunYwOBoAlFkCQ0RY4Ke1YUJbR7yMy0hlonAIjywKh8KwVXhrEm6QgTgMksoUZYuCwpKkGjqipGPVU0WUZALxwb8Aeii2wGE4ZBX72nSAkphtLxKxpmQJL0/bHi0ZWka/sOBFGIcugG/DIILgRJQrSmuC67cctKor5bUxUVTTLFnGwEQaAltwzPO+8iSNlYAaUtOXXNqnfVIwFahq7YS4tzqAayfI5OIzk31zjIcnjjjvc3sj9As1tm8oWnxhzPzMpA7SRGRbRaabYVYP32q5ASKklha4eEDPQPPvggDz/8MKeeeio33ngjp556Ko8++igPPvhgQm8iCAJz585l9erVvPLKKwwePJgVK1aExv/617/y8ssv8/LLL4cUkMvl4qabbuKhhx5izZo1ZGVl8dhjj/VqrLf0JCk1FophllCNSS7SbyIHlLDZQpJQtQFkZzEIS9tONkFAjEiWa+//EVK0Wnfv3IWvuTlKBkEQOr+2KYzmCxb+tBg+CsG4HwRV9w9JmoLYbuUq+wME6usJNDT02X3aU2QjSEILBPDt2okkaFisZn1BFUO0il//hgzFh33jekAPQU4GzfXNaIDJpi9Qgy0RNL8fqZN0hZycTCwp8uOrqoqgyNQ74+9cGp0B3F1sbMomHEyWJ6zsNX/q/KEJXcoXXniBxx9/nHPOOYejjjqKc845h0cffZS///3vCb1JXl4ehx0WLhczfvx4qqs7j0B67733GDt2LEOHDgVg5syZvPbaa70a6w2iKKH00ZZVDug/0mB6UWT0kFnUkz8BFFVDGSCRzZETmz8oeLs5XEWIMmH52lksZDn5W35N0zBpClK77y6gaGRkxK//pSgpNLcY11o06cvZyMi3eJW/TV630UQwgNfh6n8ZOyFywyuiJzELgoBUUIQ5v2NzgcpRw0CS8Lbok2Jbq7vDMf3BgSU2RIsl5MDf3RK2NNQF4u8MSguzsbTbaax9+kV+mDsbj6t/ZRdUfZc8clj85twWq6XLUlSFYw+Kerw5hVXBE1JCHo+HgnYRInl5eXi93d+SqqrK888/z3HHHRd67vzzz+eMM87grrvuwm9EadTU1FBRURE6pqKigpqaml6N9YbMzGwcjpY+qeUVzA2yWvVJMCpVSNNCE76GgMUaPVGmqv1ApBIyG5Nje5+JIIpRz4lS+PZSBVE3GSWbeNdLEKLMbcFMFs3YvQW8/g6Ri8lCDmaxh3bKEUooniLXVBRRAoSoJMRUEMvqGlBUXIqXrJxYHW4AkxkMn1xdQ2LRoL1FkwNRxT9t2WEzZsAau+QNBM3o0YuUnHVvAXoFhv4k+P1LlvgLKL8mdLkTyjr4YITS8tDGNJWdYhMyBB511FEsWLCAa665hoqKCqqqqrjnnns48sgju/2Gv//977HZbJx33nkAvPPOO5SXl+N0Olm4cCEPPPAAV199dbdft68pLMxu9ziLnTt30tBQ1WtLjerzEXC1IWk+FLcbSz34Xbq5SNR8SCYTAVcbFgsgCKExAPNuokxeyUJT1ZAckurFpOkThi9CNsFkwlIXfs4kBJCDuUmShOCT8NQld9uvKgqBCBmDmE0qqqqhuPTVd8jZLEm6b8jVjCqayCyMM2n2I16nC8HjRlN8CF53VGSZsDuA5oo9SYtWqx7KrXowqcnZTcTC39bYYbGm+FyUDK5g8ODKmPUmv1QgU9aVZ3aGSHFx94tpdvec75pdqITfK3v0ID4zxiYeekDc1/u0zkW2X44a/1FTUIHyYjvWbsjRXZmd9frvx6PFv0blg4pQZaWL17ZT/NB9+Nw+vphzIcPKsrolS0++n3gkNJstXryYJUuWMG3aNBRFwWQyMXXqVG688cZuvdkdd9zB9u3beeihh0I3Ynm5Ho6ZnZ3N2WefzRNPPBF6fu3ataFzq6urQ8f2dKw7NDY69aieCGy2Amy26B1hcbGd+vrudSncseZtvH97CsvpZ+N/5QWs86/Fc+99ANRPOIaDJ41g96MPU3rb7ShmKzvvviV0rgfwzpjDuJOP7vZn6o3MisvF5hv1NhGZRxxJxYVzAfhh0U2hY8wjDmLQtdeGniu98CJqH3sEMTMT65ChaIpCyXWLkiYzwM5vNuG5574OzxddfwM1zR7kP+tj1v2H49uyGd+B47Bu+ip03JBHn+yRvL2RuXnj29Q/8xT2Cy7C8fQjCNYMNJ9udQgcexrmt1fFfr9zf0Xjq6vIHDuOkjkXJlXmSL6+6fdYleggmrypp2IbOZbGxtimQmtmBhjO/qJMqdsy9ETupiYnGQqh8zRTeOHpEaxxX89usyKiUv3dVkRbFlJmZqje3O7qRmwJlpxNRGbnF5+DppE9YSIAjbv0NImqBg+Vcc6tOP8C0LSEr4dgtuBqdSZ8fDy5RVHosHhPhITMcdnZ2SxfvpyvvvqKDz74gC+//JLly5cnVGssyB//+Ee++eYbHnjggVCb8NbW1pBJT5ZlVq9ezejRowF99/X111+zbds2QA9emDp1aq/GBgq7a/XEvEa/fvkb68MOwmEFFnZW6+NuWUOyxYjqq01+Q6pIk1BNTcedBcD39dHm2WqnrsQVyYxXsuBsSn6Cn12KbVJr9qhUVhaGHnsk3RRTOCQ5OSqdYph6cgr031dQAQEUEt8ErhaX0+JV2bIjdZ1KIXY3XakLH4XVFp645SQlTg4tzqQgPzxpCoJAc6UeGt7ojx+0UlKUjaBpbL1uAZtvil5UNTb37Q60+k/3Uv1AeBFlt+pzxsj94/uEzIVFmIsSrwPnCGhs2Z66eyYhJfTSSy/x3XffIYoihYWFiKLId999x0svvZTQm2zatIk///nP1NXVMXPmTM444wwuv/xytmzZwtlnn820adOYNm0aJpOJ+fPnA7riW7JkCZdccgknnngiDoeDOXPm9GpsoDCsWA8JPWC4niRXkhX+GiTZj+LTf4SCxYIlMwOtXebz4MGFJBuXK+xnyBJjT+xZedGLEnuhXq7frUnsdoPUWMuH9z+eVKe/OWJFLtvDtckkixkxogJBnU+fdNTciJ1uCsyeoHfOBFDMEROzSZ/EA43xJwvLoEHYsjMpykpduC2AGKM8QqOrczOsIoTv8ardyVmsaLIcqpIQZMz8y2k49AQqJ3aSuRlpTmyJXpDlWPs3bE4zOjIHI/n6AtFiJXOgt3K49957OyicsrIy5s2bx/TpnZf+BzjwwAP5/vvvY4698sorcc874YQTOOGEE/p0bCAgqfqNZDEyl6WI/J+mhlYGjymjHsg2escrZiuqFqBs6sk0vfoKmi/5+UJKRAinVYs9oQSrEQcpLitgO+BDYuiwMjxbv6T4y/fY/M5IRhw/pT/FDeFoCZsNbDnZ+B36LrOg0I5iCq/OC0oKYAdouWEfULDQY7JpaHZRBLQp4Yk5Iz8Pub6O+u01HRqVqZVDsKJgL8gjy25DSmH5BFWWYwaDNLk6X3g0OGWC6l9OUrhwQ0Mbgj9615ZdkMtPLzmv0/N+qHIQuQyMDNqx9PNk3tam77Ra3Ap9VdI4Nz8bU5Z+r6UiSTshte10Oslu107AbrfTlqSksr2NxkZ9YvQYa4CWxvDKr7GmMVTDLJS3YMlAysqiYJqu8LftTP7WOTuidH2spNnimb8id0p0oIpoJAhXlOeTlZ8bet72xUf9JGVHdkZcKyHCJCSYLaGOmY2HnojZyDy3FpeET05Rx9WR5fpvraA8wuSSbcjn6fibyz76WIbdehsAmsmM7PWiaVpKIimba/WimIoter7ozHwEkJ8fjkbbrzA5ybZetw93oPtRRoX50Z1W5YhCzl5P/ywQA17dEhFUQm2+vsvdECwWtEAATVXZfPWVNLz0Yp+9diIkpISGDx/O6tXRVZbXrFnD8OHD+0WovZ3aulYCgoTHKK1RXxdWQhUWme27jJvaMMM5VAmXaEWUJGTRlJpigxE+IXdbR7t3/gknYimP3gmpVv3H2uyDVkf4HO+2Lf0kZEcG5YQ3+7si8kACiEgmiRGPPskRl/yK/Q6fiG3MWIqHhSsSB3eiyUaTZRBFMvNyQqafNqPIptnv6XB86SFjQn/vavFRU9tK20cfsOniOQSSXeneKETqskav07uK6MzKDk/sccPQ+5jyPAuDKrof/VhcEK1g638I3881tf1jShS8+u+nPE830e6/X0Fnh3eLmlY/VTXNNFbVoTqdNK16JWnfASRojluwYAEXX3wxr732GoMHD2bHjh18/PHHPPzww/0t317J/iWZuLZaKSrMxgWU2AR8gGrJQG1thgoZRZRCEYQHHHM4wcxQiy2Dwvzkr9AbW8JKRDvqxM4PHjIctm/GnGFBRaAtALKQhR3w5JdibWvs/Pw+xBJRNygv347qy0Z0OzFlREcwZe4/nEFXL4h6Tktivo2vaheWikoEQaC2wYEk6DlXgi0bzdmG32LD1u6cNmsOkx+IjvwrLLBDS4Cad99HBNq2bqewoO8mrK6wevVdflZ5CTSHE9Kb3Aq58U4C/BGZzzuqmklGezUtICP0pFyNFL123/HFxpApsTinf0y4isOBKS8fLWgl6UN/pdWWiejwojSFrQY/vPURI3/e8wjc7pDQTmjy5MmsWrWKgw8+GI/Hw7hx41i1ahWTJk3qb/n2SkRF1jO1DXNbhpEoJhUWono8lGWAOaIsf9H0syiafqZ+rsWSEp9Q0CGqnTOHg6ef1OmxByxcyNDbbkcURT2B0mxlwlknkbVgMc79RiIqcpdtI/qKtqaw+SqvwM7wxTdTOntO1PWNhztJlQe8O7az/eYbaXr1FRzr12H+9F38mv7TbDb8QsOGlqCZoie4gqKOXoG8/GwyBBWXrJ/fUJ/cFgmeBn2BUdyux02rt/Pvu6o5fE8LLge+XXFKRPchra0uGjopfxOPTdXR4ckVpvBipb/a8lTt0Kt2B4NW2nx99/spLc3FboZMd/i30rI7eSb/hNVpRUUFF198cX/Kss/Q1OREQEQW9MvfakyUXlsuVqrw1NbGjX5p80NjVRNlSZNWJz/bghOoLO3aHSpmZGAp0yW0FeZTMmY/RFGkctT+ZGz+H41fGvXQktBbaFdVY6jvikcTMRcVk3tkYutskxIIOWrdP3yPd8tm8n5+csxky94Q9BE2rFmD4NL/thklhXKK8mFnM4LFgkeTsBHe2cUqzaKIJmSfj/xKO/IOUL/5nGbJT/6JnS8c+orvv9lGISJibvS+54AhnUd0lpflohqNfbM3f832W75m+N336x1j+wnFH8DbA6tTUUFWVPX4yF5ILqcHm6IgCEKf3ifBkkaONjdW6LRKdncRzBY0fwB/Q7h0zwElySuCOzBbX+7lNDY6cPi1UOh1c6N+g2WX6xO3d3ctzjgBQqrJjKAkr+pA3d+e54e5s8MVpqXodUtt6YHU58VvLzFowfUUnnZ66HHQjJCsBnKDc8Py7mxO7D2HLf8j+SeehGjUYgNoePEfNPzj73z6xAt9LqPfb1xbV0S7ZaP1dFaO7rCvaQ2QnaMb5ExG/TVHjI+ztd6D2+khy66fJ333FfV/e77PZY5HkehDzc5ha030bqEr81G2vaP/rW3d2hhH9h05VpFhPfCtFOVFl/RprQn3Ftq1u5UfL7mQz264udfyRVKeqQciDCnWr1NZSWfGze6xtcGDs83Fxi9/xGs2vock+p3TSigFDC3KoLg4B6vRfjffot9gXpt+Y5ldrdFtsiMoLs6lNDt5eSAta/SAlN1GhnRdW7Sf5KilNzBlxdK455sLCxEzwhNMoxGq63F1dLD3B+YIhV1RnpgT2lxQgKlY3y2pRqKoKU//biw/fBX3vJ5Smhc/w95v5M8oJjOa0f/GPGg/AFpjREiVleaRIajUtKWmKnJWwI29tKhDvkyLp/Mth1fpuLLf9sa7fSpbe9rXjksUtX3NREc4GKEy34oA5NT3jTlRM3xlisOo6iAH84T6bg7IzsnCgkK+7ELNK0Q1mamrTZ4ZN62EUoEsY7Lq0W5IEhmafmNVHBDuZZ+XH7v8hWCxoPl9uFocVH+/LRnSAqDKhkM0jnJMlKAt2+tOjtPf2eKETH0HYc+LX5SyPVUt+udtbtB3qdt26lFmhbbeff6YdOIfa3DrY0MHFYQCJXaIukIsKe64Gs4vyEaQAwRSVJrf19CIKS+fvMzoqcUjd24+2tnUsRKE0tq/SasBr5/atu6v+LfVRUeHRi50Mvrw9tA0LdRpedtmo0BzrX4/+mIo7Z5SXpaHqMhk+RyUDq3Aq0k0NCSvukm3lFBNTQ1ffPFFf8myz9DW4gyZUlRBxN2mr3AtuTkEDD+RGMcntLstQEN9G9/cehvOO29JhrgAFBtVHUqLPNID8wAAIABJREFUetcC+0CjBH2ONTkJcc2NrTQLun17V0viE7PZpp+j+Yyimiaj7Xo/mClqG+NXjS4pNkr3RFSZGDRuFADWrI52+6CfMTI0PVn4PF7khnq2+q042zV9G1SeF+csnf0qO+5S8zP7d40sKDKeHkzmRfnt4xTDBPOk+oSI71zz6IrPYcwVQh/msAV9i3KbAzHTRk5eNgcUJy89IaFvubq6mpkzZzJ16lR+85vfAPD6669zww039KtweyuONjeNbv0G82siXqd+g7kCGhlG6Zu6WAZ/ALMFSZXJd+h26KTF8xuTb3ufUHcJmj+0JPmECjMEivbfj5ri4RSMG9P1CQaDBumOdLtZVz55RthTW2vfR8z5vfEVWzAiLnJlWjpM98E5YtQ329agmzn9jt4VIe0J/ppqRDTKDzqQ1na5ZF2Zj7LtHSf2/syH0xQFEa3LgIlY5OXGn6B3b++7uo6+iPui3FgE7l+kLzxsOYnv6rtiS73R1t7nZXO9BzEjI6npCQkpocWLF3PMMcfw2WefYTIcjFOmTOGjj5KX+b43UWo3M2yw7hDNys4kw4i1cftVpCz95ooXHTd4UAGRLiHFlZww4p1Veo2sJlfvJoYmo9FJQ3U9qq//b3RRDpCVl8PPlt3EAZMSV0KiVZ9ogtWRgzugYMmlvqSysOOklv/zk/X3NerdqSYLgxZcR+lv5oJZX7k2xwjTLS/TTXTNddE1zZJRr0+tqQJg0MEjOviEXF1UJvDEEE/29t/9EfKt9Mgn1HHaVI3FWbml7+4PNWKBqRo7IdXnQzCZOnQt7g05eWHrRm6+HZcs0NiQvGo4CX2Sr7/+mosvvhgxommZ3W7HkYLV1t6AFghgsurOaMFsQgzoP7aSIjsuo+t7WUnsUOigTyhIY21yEj8DHn21JPUySc5rhJa6Hr6PH2/4v17L1RWyx4tb7f4Pttlw+m/broetNhg/yv5o/qW1a54njJtM8S9nAjBs+mm0nnAWB5x+MrZRo8mdcmTIlGuLsXvIz9dDmkVfdOBHoJPdVl/RtGkrmM2YS0oZdPKJSPYcvJn6fRxZoDQWkXlCQURVQe6nHbPbqV+f3T3wCVU1hK+tZiwIzDYbSBKis+8mb4sQVtyNtfqiorq6iYDYUXFqmobD37NmgGWlYVNpeVkeLX5wtiansSAkqIQKCwvZvn171HM//vhjj/r0pAGvx0eTsfRzBwjZfiWzmaaA/pXE2wntbPIhe30EjB+1N0k3S4WRCZ6fF98engj7VUaExLb0b0kZVVXR/D6qexApZsnSP6fF2PlkGpXDtUAgqmBlX1BdFz1x5UQEUEgmiUNnno5kCk/i2YYppqCgYw5N8L6IzCcCkOj/5OCqjT/SZM1DEEUsZeUMv/s+HJn6zqyr+yaWTwj0xO7+IGDsbP1a931CBZE+ISPyU8jIQJNMuOr7blGoRXx2U0DfkXucbnwxFPr3zT+y6MPbaPF1P6BAjOjSKlitDN2vkIok+hQTUkJz5szh0ksv5cUXX0SWZVatWsXVV1/NRRdd1N/y7ZUE/AEaHfqPwC2HJzSvCgceqCv2XTGihQCkDCuipmIylFShNTmVB4RA0CfUu/CfvixB3xWaLCOiMWy/zotnxiLPmOCLbUYr9uAkrmmd+nB6Qvu2536t82uckWun6MwZVP6sY2fj6lZdNrWdmVZIgu+w2Ar5pdE+lmBttq7MXlnt6vTJFsMc6vMTaGrq0E67twS7XQzrQVuUnIicJtGmLwhq3RpeBUxe/bqrpt4HDjQbvYk0WzYZRuX6/fItod1uJE3eZlRNjbkb8sgePqv7Ku7iaWdT+H7eUu9FzMhATWJVloSU0IwZM1i4cCGvv/465eXl/Otf/2L+/PlMmzatv+XbK7GZBUYM1W/+0uKw2U1BDPmETHHKygwxHOaSZPS/cSWnjXOV0cjO2ctyIY52uS2Opn7MRzBWu7HMVl0hGubSoC9I8/tCycVKH/uyBhdFy7c9zgIkiCAIFJxyGpaSkg5joSRGRcEx6ECsZ/0KAI+789fsC6yCir2dw9xl6D6lCx9Ge5+QyWiY2VpTx9Zrf9fnCbfhvjzdX/ErEXXunEbRmZyCHDIjGvP5+iD7RTD6MgnZdjS/HzUQQPX5Eawd88p8Rt+sQEStRFVTeW3rGzz/3T957Jtn2dK6vcN5ALkRFcwLCu00ebWklayCbpTtGeg9evYoFCVUVTgyFDs7O4MtAX2iKyuIPXEGb0DNaD2+bVst447oT2F1AsYkJvUySU5un2fU1AgFnYfv9hR3MOpQEelurWTN+F42bamj6NOv0WQZxWbH5HZgjtG0rTe0X+X3pLJzkOzcLIIhCYog0eCUsQOONg/2frae+z1e2q9r6xwyFYBk7nxnUOcIRDXFljOyMAFttXoNs5YNGyiZ1Xmfn+7Q2OQIvW93+/LUR/iR7AW5qLWQV5iDz9OKbLjJsyy9TxjKsYo0A0pmFhLQ1tRKfX0LgiAwpN2xfkMJ+SNylurcDaza+t/Q449r1jE8b2iH9ykozCG4fyouyePzLzQKvR42r/ua4Yce3OvP0RVxZ5R//OMfCb3AjBkz+kyYfQVVlml0+CkGmt0ywWwP0WymRZXII35k0K5mPxbA75cxA7IzOT6h8hwTbiDLFj+7PxGKCrOJCmdpbgT6pyVIa7Mx0bgUBnVx7P+z9+ZxktT1/f+zqrqr7+7pue/dZQ8griwgohEJQlSMiXhE/RmDGg80GkTzjfrVgIooRgETTIJRYk7DVzwicojccoOKy7Uce8+1c/X0fVbX9fujqu/umZ6eHjWa1+PBg52qrqpPV38+n/f9etdDkiQMUSK89170vfdax/x+yKW7njo8t5SkeosOhjpPv9WrhPzEaBj3RJgIEN6MIts6ZNI5sjGFrVXHJJfFpF4d02qGseEeqikz3b09aHOWG1QFMrnuvnPNdjcZayRMNENP0EOJZc10W8qiKbtRTbFsI5naxhMqyuUXPit7Tcvm0AsKmrtxfhSbWEKKXtlDhrwDPBF5mvNPfEvDtUKVgiC6XJy4c4jYfh39G18hPXElgeHN5TRvKYRuvPHGNS8WBOF/hdA6YRgGgmmykrEmTUY1y0IISeLE48dZuBdi0TSTTa53ed2YgNNmWRgP/HJIL4TSoupyTCg6PUfgxadv6J7NoGs6frNIDtjaYTt0h9td5nADyswLy5Ek40NDLa5aPzRVRwZUwYHT1FDMzn/TaiofQXbitFtWCL+EFG2fZBKqs+J2HDdEZn5tMszq4DhATnIjAy5UMoC/m1QEQL/PwRydWZ0+n6sshJx+H0Xg4HIBb14rW9zd4EY8ZrMjSAHLVvOh0e8Rkccb57NilIRQJfZX0CwhdP6JbyVRSHDL0TvQDR2pzhtRPWcW0hphV+X3cm2+7tJaCH3rW9/a/Kf/FkKwKVpOsJkDto71klk+ioFg0fjY7ja5RSrw6EiYY1V/b2ZMqLrdwvJyEh+gmQIbmZd6nbtm9shijebcLTz8+SsZOvY8AC5/Zxl9okuuEUKiz48JXSeQnez3sILdiTaXZi5epFPPWU84QGnEx+JFRu0YXjKZZbN5kUVNbbDi+s99DaGTT17zWrXOIgkM9KIASbvrsNRlgo1KndD63ctGVUwopUu4gWBfkJDmx8hZGZ+CaaJr+poW4GqQRZM84AwFUbFqhYyigig3eiPKlpDeaAmN+YcpaJY7vaAr+MTa9eANeClFZnvCAaKzVXFfY/OVl7ZUrgcffJCjR4/WHDt69CgPPfTQpgzqNxlmHRt1KTBairXkdOsnKVk69RDdtVvJ7MzypowTQFcrY9ALpZjQxlSj+vYD48HNseRKAgig0KFlES/UJlEUHNbiD7u6PGZb2LuDlttlvEW6cjvw9Fb45EzJQbJgzbdYYnMDzbquY2qNVpwzHMZ7wolrXl/Pb6rL1jzP2G1ONLW7m+GxRWvbjTerkl0DyarB9g1ZJQdbtgwg1zVKFDaYXt7rtfYEZ9D6TY8eXSSfzrHYpAdSs8SEgi2EXJILl2SNrWQdVaM6cScY9pNSK0J2eWXz3f1trabLLrsMn69Ww/F6vVx22WVtPSQej3PBBRdw7rnn8rrXvY4LL7yQmN12+IknnuC8887j3HPP5T3veQ/RaCXPfjPO/apRtH3RK3aKdiRd2ymxVHmtKc217Whdc7D6osRuwlQrfvg+m8dro8Wqjjq3i+uX0JYio3UmNOq7r/rtBIpu88fNLFjavm775gPBzmuxRKcMtjtl60RvmbNtPLy5dlDRJqSdjXWWOTgw0gtV7NR+W5h67NRkpdjdFHPDJnjtpGTAX8XZZ9jv2pRd5O2WHIbTTh7aoBAqWWtyyHLHOYoKoqaiNPFFlBISqt1xJcHklly4bQWqoDdmSVa/A8Eps3W4kgLu+iWUC7W1OqPRKIN16aCDg4NEIpEWV9RCEATe9773cfvtt3PzzTczMTHBVVddhWEYfPzjH+czn/kMt99+O6eddhpXXXUVwKac+3WAYguXuK1NZWw6E8VtacHDL9hF8Mzf47gPfbDp9e46ZaBvY3kCq0Ksri1RiyBJZcaMTlFzvdtDJrH59CCDQ531XgnXFYNKdoB4ara7So2pWZvXfNr6/0ZiQgAZs2RlO3HYludGtfK1INkaeKdWnGdggMlPX4o6YDkiNckad0kIuZ3dtT5H7fYZfU0KftdCqQULQNHe3J9ZyJOwM+5UnyU08tn20+IP/9VHmbv6b2uOHZ2z8hyLsqWUDLpNJFNnx7bG1PzV3HEuyYXbtoSqkxVKEEQRzaYi0iQnxVQldSjwS5BCbf2yExMTPPLIIzXHfvrTnzI+3l7OUU9PDy95yUvKf5988snMz8+zb98+XC4Xp512GgBve9vbuO222wA25dyvA3z2YjrerhPaMWn9Py7ZnHGSxPC73oNrdLTp9T19tYumG1k4rVBdD5NN5dA6qC5fDWmHl1gdx9lmwOnuzAqo15KdQevdu7rMPjAx4AVRxGe741ayG3M9eUPWOOfiSrn+JhrbXLdKSchtJLPPPbmF7R/8c7wv3EP4hF0ApGOWlSjSXZaKSkxo/e5ls0qRGtt9PEs7XsSeV72MPpc9xqBlfebX0a5ETybI7avtVeV12oXS9u+ppSyFrRmDdsnqKVa742zXmyw5cTusNZBv4o4DMB0yJiB7XAye/QorPsnGrbl20JYQuvDCC/nwhz/Ml770Ja677jq+9KUvcdFFF3HRRRet+4GGYfDtb3+bc845h4WFBUarNtve3l4MwyCRSGzKuV8HlGNCYomex9I0du7e1tb1oqt2Q00lNy8xYTlSsVJErdj1dtzB4QH65O5uLs1gdsjSMFfHZ5a3tclgdBY93z03qKnrCKLIoM0XODS4sbqpUmxJdDrLsZaV2ObGhAp2k8JO428luCe3MP6Rv8Tht4SZkraEp651NyY0ZRPyFjq4bbGqtbbplDnzkx8mPNwPBesdDG619p+Qe2PvYiBgCZtQyIsmShyxewotphsFQ9FonqLtkmREQSxbQsu5CJli41xw+9yILjeiKCL5/ahvehcAswub31eoLVvrla98Jf/6r//K97//fe677z6Gh4f55je/yUknnbTuB37+85/H6/Vy/vnnc+edd677+l8W+vra75szMNC+Sb+csiZ/zhDYMRDgQMqauD1bxtu6j6F7OVT1t2Tq63p+Ce1co/V6OGL/22FoOPy+jp5VjwP2//u2jJJYmmv7nut59kGHo6ztDo714+igyDbY64dK52Ymto9yFEjefx/u/j52vOtP17xHO2N+MpLBaQoEfF7ywNhkH94NvOc5n5ci8IITRgnuHGIvsGdH76a85xJih613ndIEdndhjpimyVFRxCtY99V1Y81xrWfcHtkSJP1DPQT71jfeHp+jnKHaNxgsW7D7czkEQAhb3o2egAtfm2M+UPc3gO6x5mz/YA+HJCdew7ZsmqxDzWbid8hC+ZwwZeJxuhkYCCB4LeH0/YM3ccPhH/Htt/xjzfVTLheYZvna9FgvC8DIQPM13419oIS2VmY8Huekk07qSOhU48tf/jLT09N8/etfRxRFRkZGmJ+fL5+PxWKIokhPT8+mnFsPotEMhrG2lj4wECASWZ1N3FBV8gf243vBbhYWLItsKZYnEkkTm1umF5jPi7jWuE8DRBG3aK75/E7GDFDMVGlMpokpiOt+1mrIIKNmsiwtJRHXsLLaHXMZVfeLJzqzWvrCAaojVqpUcYMce/xZQq9dfTztjlkrqjgEkaenU2wBluMKPk/n73khYxACkukChp0Ak0lk2hrLut+zDclmgg+HfF2bI6IsIygFdMAhsup91zvufq+DFSCf11DWOd5qhotsViWnWNcLNjdbym6iePRohCFv6xhZszFX//34vmMEgdmlNC6vG7+oUcCi+qq/Ll+04k+pbLZ8LpnNIAsykUiaXFXdkm7oDdfPxYs4q447REtIi6ra8NlW71oUhXUp7+Xr2vnQ2WefzQc/+EFuv/12ih1mBv3t3/4t+/bt45prrkG2fZq7d++mUCjw2GOPAXD99dfzmte8ZtPO/aow+1/XcezvriJx8BB9fss1tN3uJ9QrWItX965fsxA9nk1tDqfWsTakC92NhRzLWIW7+XR3XYq6pneF1UCo4+9zViWF6POzG75/CeP9HtxuGdnu5rpRl5a/x5pLSwuxMoPC8srmtl0pURl1wtPXCgoSaomIdYPM5UaxWNO/aiN1QjVu6SbF24rLegeZTHvKj9GivbvfLgWQZRnR6UTPWL+h2IQ7rtgiJuSyFadSinYruH1uHJ4qV789b9oljjU1jeQD97f12Xq09Qvcc8893HLLLVx77bV8+tOf5txzz+X1r399Ofi/Fg4ePMg3vvENtm7dytveZvVJGR8f55prruGKK67gs5/9LIqiMDY2xpVXXgmAKIpdP/erQmbuGE4guRTDPWlV2pfYqENbJ0jOHGHLie3FhKqhiDJOLYthGGtaEp1gejZaU+C40RqhemzZMkjmpyWa+o21Da+GmuuOUDu8nKeaf7u6oNKlZMmsxPD39zZeuF7oOkgiO7cNkHkW/BtI0QbwBP0UAYeuljfJlViGXRsfaUuU2k4XEemWGCoi4SvFL1ps1O3iyMf/D0Y+x65r/xWwMs8CCB2xwguCgIFgFS5XJSmMXvSX5PY9jX+ijzlgJNQek7bWgrF6MCCzArg8MrG8jquQQQZiBYPq9A/TNMuJCY8tPUFRV/nASe+yYkJ29l49S0I9hsf6axS3paRlWR2ei7Nnz9rfIffcs8R+dBPHveG1a3+4Dm0Jod7eXt75znfyzne+kyNHjnDjjTfyiU98AkEQOO+883jzm9/M2NhYy+t37tzJ/v37m5479dRTufnmm39p534VcNgZOH63g3jC2iCjGRU/MPC2PyX0e6/A2dc+tYwuiEimQV5w4gT0ooro7n6udtgrUa3L+f3drTUJ9NrEiUp3GZ4lrTt1PD12x8m0K0Cub4wddcwLwtI8dEEITc8ncSkG46e/GKeuIvs31rp59FXnMP3wvUye/fIyG/vxI90T8s0wv2gxaqSK0C062nCvn+J8d1L4jWxtdqCEgbEBxc0QxQbjzH/SHvwn7SF/6CBQxf22BqQWGWilzDTB4cDhkpHtrsaCy0VOzaGZOkE5gGZomFXZg0+tPANYiQkBuT0Py+Db/hSzStAH/G6iQI+nPUtRS3Se5bruX2FlZYWVlRWy2SyTk5MsLS3xxje+kWuvvbbjQfymo1TEhmGQs9M2c6r1g4uyjHvr+qwgwdZq+gas5S6am9NTKFiXVLbRXkL1UGwXQSra3Qwcw85cE31+3C9cmzKmFYaHrfc7ccbpnHnZJxuszY0svGpIggmiiGtsnIE3v3XDtVjy0DA7v3Yt8tCwRQUlSW1viJ1iLGRNlmaN9jqF0ISeplsYC7txtmiX0g6cTmdNvVA10jZVUrsu0FY8c/uPrmBipYRX16wNDvbw1w9dzqce/DxQ4Y2rh6IXy1lx9SjWFYnLw8M1ZSEBu2dS2NeeEHrm6am2PtcMbT3h4MGD3HTTTdxyyy14PB7e8IY3cOONNzI8PAzAhz70Ic477zze//73dzyQ32SEQx6UWVCKKiP9PuaALaOd64sO2YGRV5GDflSsbp94PMQXV6xU0S5BzdfGhCKpYld43rZe/mVMXWPumMWasTgfZWBjOS81mJuz+JjNN53P5Fkv7fg+pXqM6s3Q/ZG/xiGYZK7+G+YXEnRWBluL0bCbQmrzGA0MQWQpkqJ7M6MRJa5Dt7d73yOeN7ri2mvWItzUtTJ1VicwRbGG4aEapWLjTLq9mFB0pbm1F/JImKKEKIoWE4YN0eUqp2Kbpsl39/+wcXymaceEmguhnJZDllaZvbbClbj/PlKHjzL+9rev+h1CpoLm7ExpaMsSOv/888lms3z1q1/l1ltv5f3vf39ZAIEV33nXu97V0QB+G1CivYrEc2WTd0NWhT1BYkVrESQSWfbf/3Mil3yMp269dyNDrcGhaYsZoETY6HJ1pyuqPDSEa3SMoRHLlTXq624RrMOmG3IHNuaCOrRkbSIz8YownnzhLkLjVlV/rs3A81qw6oQ2j664aIrEN5k7LpkodRTtXoV9fWM4vcO4kFHV7kS3A+1Tc3Gy6vrv91zsAP/x7PVkiwapFg0eh/otq2XLgAdl/tia7eDFFtRVAwG5THM1F6+4rFWx8o4TSpJfLD/ZcK1u6ih6EVeLDq85dfW5m7SrnAv7nyd3zx2rfhYgjIIn3Jli3daMefDBB3GuUfD3kY98pKMB/DZANUwkLLbkkokez2l4Vr+sJbKKgQfI47Qagekq8uxhVKAntbT6xevAYNCJBkgeD2Y+R0+oe5lPAO6AFfuQusz60OuCBWBwuHMiUIBgjzW+vFm7TLx2bGjrQKe/YC1mF1M4MuqmsImD1Tp7cHhjcaa1MDcfZwCgC22tS5gY6yWzVCFOVvMKkm/979xIVyyNfCqHPxzAKZjQgSX0j098E4A9oohJc+WpVICeP3CAxW9ei/GSszjhgne3vGdAFmhWSm9qGthC3V31vZ1VWWx5rXk89bnYARRdwS01t0xz2upCyOORqXY2m4ZRLrBvBjWZwDPcWXuTtiyhL3/5y+zdu7fm2N69e7n88ss7euhvG1J2Wbaoa+QLpcrmzrV/p83nNDFpOVgW738Y85jVutcf6l4AOminiEo27U23Y0Kmw1Js4rGNpQ///MKP8OhHPlb+W89byR+ie2NCYmzEEmK7j69rrCBJIAg1BK8bgVM0ETdA+b8WBKdj02NCW/vdIIo45O5ZQvX0NI4OO9rGjlWY5kW7nmakx1WOe3SCQMBFX09zwa7otodiv5WgIP70PhJLrfkGW5UTHJyKkrGtrSGbTUNwOGrmSla15voZoy9he2hr+fi/P3M9YXcPLxl+UfnYhSe/j7PHXw5Afk0hVOta09OtE0T2fuz/ohw5zLF8Z3taW0LolltuYffu3TXHdu/ezS233NLRQ3/bMD5omefRlTQTfdbEHx7oXFi47YBoyd0kP3Ab2oHnAFg6ttLyuvWimFfA4UCxBeZctMuM3bZ1vbC4sQB/qJCkN1v53vufmwPA9GzMcqvEhGo3Q0EQ0EUHc/PdoYIaDLro6+mulVmNnGoS+SXUCQlOuaulAoupOsHZocV8bHqx/O9S5qSpaeuqEVJ1lbtnKnUwqgl6C0sIW0iYS5WieUex9dqZnmsuoHo8Ik7bBV6KCQmyq9wbCCBVtITDGaOn17VxKPDC/hMZ8Faybk/s3cVZ42cAa7vjzLrfMb8Sa/45TcOfsLwv/r7OPA9tzRhBEBr8mrqutyyy+l/UwrQZapciyUrx1wZiAKX7RZr0FYnMd08IHZ6JohhiOdvH6+tutpJTlkGS2NrfHbdWCT4ljeryIns2FiR/fsGKc+ybayT/1AQJJdcloWwYG+5YuxpyKqTbDJJ3imQig9Hl76DWrZFshzG4Ld7K3pVPWb/l7EKClUytUFvKRcqtEFRdJaNW4mi3Td/DDw5VlO54VmUx2dyC8dqus2rSVafQOi7kEqz1ZdZ9316PiC9oWVtHIpbFkzUEMmqlDi6hWELI4/A09AqSxUbXqNdpjW0td5xaJ2CnDx1r+jmjUBGIpXYv60VbV5122mlcffXVZaFjGAb/8A//0Hax6m874nZ+//ZBL4vLlkaaKXYuwBdclnbTLBvluFD3NNHhoIzTLdPfZy2E/nVybLUDUZZxGN11FfUYOfwjG2+/vfuMPSwdfzp7XtmYYecLeNnS1x3hOb+cYjHe3VqpagwNBtnSZUFfj8VjUdJ6dwumj5uszedLdZpcka1YgaXMSVkwy40kAQ4ljnLZo1fyk9kHALht6m6ufMziV/vSz7/KbVN319xSdIgtXag1Fpb973y+ucCafnI/uQfuBUCr244NRSlnZvptJgrTIZOtEo4JxSpv8Do9DfGhZplxHptNO6euXtDtrONaDAvNx5+MV95t8GUvX/WerdCWPXrxxRfzgQ98gJe//OWMjo6ysLDAwMAAX//61zt66G8bkmmFQeyYkFrEQ22L4PXiRZ+4iOnHnuG4yT5mbrSOmQ4nzmAAI9M9t0tAFsi5XUgOBxrg7Ot+kq8mOojH0jR2SGkPJfbmmntGo8gjnTbIrsDlcXPmxz/U9JwgO7sWE5JFMLuYVVYPUZZr4g6aqhKdW2JoW3utWNrBuJjF2DrRtftBoxu0r82alXrEVpLl7b3Uf6vf7wQqyVbfP2AtpHTRspQi+SjRfIyiXmQ23WgF9ITceDzNlbLq2KnRP4K4OMtKNEPPzsbPKv/wN5S+pasuDjM9G0UQBLYAo8M9RLF6XKVrLCFLCHkkN2eOvZRbp+4qn2uWGScKIl6Hp2xNZdQsU8kZdvfXdr+V6hLR3E2YtwFU2xugveF85KFNTEwYHh6uGNdhAAAgAElEQVTmhhtu4JprruG9730v11xzDT/4wQ9q0rT/F62x3c5Miqyk2DJg/Tu8gRiAx+flhLNejOCoTBT9vLejjGwlHWnuu+0ESkHBlBxkktbCnCl2L/OphIwmsLzcebGqVNdZ1jAMMkvLzCjdSSdvhZRiMr/YnSLbXr/MQAfEj+0iXoR4tBJYvvtfbmDli58lHe8OG4FpGGhLiwQnuyuE5uvcXUKHMaFIJFlOa/Zg19foerlOqKirzGWsNgmCrRxm1RwmJiv55uupaJq0yNC2nhmeQPMGCb3oFAD6A23MxzpFpMclELD7M5V6W4kuV42bMKEkcUsuJFHitdtexV+eWmmG6ZKar9ceV6gsvP7pyX/jn576t5o4E9h0RFVxocxy87hVqaB9crJzBbVt1UIURU455ZSOH/TbjFJm0spKipEdtuupC/7zRFUzlC2T/ex9xkE4173mZTPH4shZFX/B2qx6J1tTM3WKcG+AwQ20hzVylQVpmiZqOoNsaAQ6TBdtF0VETKWzVtb1KPUT2iykNRF3FZ/ecXIe09QRs2kIBzd8/9jMPKaqovZ2as82hyHVbtyxeIZOZuCWPjdFJYwRjZBNZOgBliJpDK/JOBDJr5Rpb0rsA1nNel+RvLX5vucFb+fWo3exmLMy7SLZImoyRxPjBoAzrrTYDHL7nyf9o5uQm/y8SrRWwBXrmkb6HCZyv/X7HF7OEQLmkmqNKy2hpPA4LFerIAjIVe+sVaFqr7uHWMFKBppKzQBWqnep8V0JqimUbcWZw/NsaXIv06bc2kgmaksh9Ad/8Af8+Mc/BuCss85qSSVy7733dvzw3xasxDK4sWJCc0spZEDVhfY1gBaQq/jiRLebE06cIL7/Zzz4hb/lZX/90Q1nKg0GnBiiDylnLZaxXZMbul8zOD0uxA10b4wuVRayqamYCevvyeO7P9ZqDA92gyvBQiSWRdNcHW2w7WDHcYNk0pVMLb+aJQ2I+e4UsM4/dxgXkA20z3/YDrZN9rNY9fdKJNnROxI1DWcoSCEa4ejUMmOASzTR7SzTpVyk/FnFzp4rpT5H8lYMyev0EnQFy0Io/5rTOSG8Ns2HYuuJmWyhgf3h2N59NX9n6+LEhlIsuyRDtkUkud0NltCIr6JwyWK1EGpuCYXdYY4mZ2qO5bUC9bltkkMqV9oPeZonVszOrSAACcXsmIK45T74+c9/vvzvXzUL9a8ChqaC2B0/fSZTsNioNZViQbV8wF3QfANBL6Xlk1QF3Dbx5eDUUxRSGbw9G9NyvQ7A7ymTmDr7BzCLefL3fB33y9+J6N/4ppPVBcxE59ZbZCFaLvrNpXKoi1a66HoIYTuBIMvome5YnbIEknvz3IeCy12TxZSYX0YCEktRPK1U+XVglAxRYPIFOwDLIv350uOcPLAbucVG2A7KKfJ+P2Ymw5ZAZ3HUVDKDIMtIwOBT97P3v0cJu0XcdmO25ZwlaPrc4XKH0lLwv2QJeR0eQlVkoNLxw2zf+sI1nx3LWQrWUqQx7nlw35GajbsvUGu5pBIZji3lGQGGh0IsApPjvRytyoIzTKOcbADgbEMI9bp6yGq5mmy6ZkWvDqcTw457uvTm8U9TKSIA0gYyUVvuhNWZb6effnrL/35TEb/tx127V6k2KBZNs2XQ0odcno3HV4SqDBaH14vvpD3l3vCOfOcbpK7rPH7jXRQSSTShMkVElwvtyM/RZ55EeeyGzgdehWjO6DzrCdgSrLg1dUXh2ceesyj2BzbXHbec1ojHOnvHz9z1EPdfdlX574BbYri/+5mHJazkDExFYenb/0VhZprMkqW6zB5dXOPK9qCtRBB9Plx23dpyfoX/ePZ6noo8s+p1Dx57lP949vqW55eztoUcsOhg9HRnSTepZJZotuK6dv7iQdD0cgxmORchJAcJygEUTUEztHJrhIgtoHxOL8EqIVSfDt0Kg73WOxnpaXSNTfTXsbJTa224BYM+2x1XigkJLheKXvtsr6NyH2cb7riw23qfcaVS59a0eLVKUVYyzdfocMAmU+7v3DPQljpeLBb56le/yqtf/WpOPvlkXv3qV3P11VejdMkn/uuI2NRc1+5VigklE1mrdwzdYR/QhIoQCvcFcfb2MfLBC61zHS5YgKe+dwu+m/8Lc3GeubhC4Y3vInaG3Sek5JbtEnP35Hgvg/7O34WRr/jHPYJOn5JE9ffg8m5uSrIqiKAVO7KGnNf/M8Mz+9A1ay6Ydj+hzULGsN5v8u67mP785wgZ1oYz3qVciOWj86j+Cm9YKcittNCeDXvuPLnyDL9YehLdaM6EINgFmllTwnC6WJjpjJJq0O9gcqKP/j9+CwA+PU8ylWNq2Zo785kFhrwDyJJM0SiWXXFQawkFXRUhVC8IWkG2XX5ykykecNUVhBYqiRemaSLqKoM2U8JM1Hre0zNpFL2I31lha1i3JeS2HG8lAQvNLaG0UvldCqnm+0nJwhZcm2AJVePSSy/l0Ucf5eKLL+b73/8+F198MT/72c+49NJLO37wrztKGWHdQCJpTeqJXhezi0lMhK4EoqspUkSbWictWBPvyIHmxWXtIPR4pTJ8qD/ISX94Ni9991sBENzWQnQe/3sd378asscN6+gOq+s6D179zyxPWTGOxbmKP99QiriTEcLHNQuhdhdbxnvx5pIc/uiFFJMdZsmVWjKnCkwtbR7B6K4dFatQMI1ygzhHl2JChUiElSomxJLwUZvUfy1kl/j4/Zfy4LFHWclH0U2duNL8/Y3Y3H/ZokFGdK1KfbMq1CKyx03vH/wh/W/5/9CiUbzFLF6vi3ghwWxmnhN6d+KSXCh6rRCKFeIICLgdbraHtjHqG8bv9FFoUwiptnGTTjdu8tls7bFClRAyikUwTQS7FjBoZ9P6Qz4UXamxynzOiiVUGxNqnZgAsD9+qHysmSXkKTWxFEVchtqUiPXIlL3+5M49O23thHfffTff+MY3OOuss9ixYwdnnXUWX/va17j77rvXvvh/KPrc3WN2Vmy+OFNV0VQNQ+iO1itVWVOlAjl32Fq4Yr4zS8jUdbRoZbEH6rp8iv1bcJ/zAaTe7tSYJIusi3lg6dAMg/se4rGbfwJArCoxYXY2QnFxEXlktNXlXYNQRa2vpTpLdS71PXKKJl7v5vXOKSko9Ui0SLtdD0zTpEfPsuMFlZ5YxbIQalQufrH0BAW9wLf3/6AciykF/+sh2v1+xodDDIwNsDXQ2bpRcgWSRWsDTQYqAnlkKMiTdgO4PQO7kSUniqbUFIOCZWmIgsi20CQXv+T/lN127SBnv4L5pcY5cmg6WlMvGPJV5lTWbnl/0LbW+nsti2jX9qEGS2jQO1D+tyRKiPb+0ioe1+MKsTU4yb1zD5WPNY0J2duL4fUjmGY5E64akq6ii46avWi9aOtX7e/vJ5+v3SgURWFgYKDFFb8BKHbP1Tjgt7STdCrLln5vmZ59MxAaCIMgMOjsjOyxWPc7F+umiOgLYySX0JePdDzGakQyOoZS5Nmbbufhv/pr1BatjksImdZCOP24ENNPPM9Y6hjY9VL5mVnQNWbMzWWMBphPVMap5NbHdqDbm0Q8kqC4uICzmN8Ql+BaiBUaNdi85CZyLNLk0+uDkclgFou4Byp1IiVLqNhECD298lw5pbiESK65MEzbrzirgiMYRFuFRLMauq7zwGVf4ejeZ60xKsUyxVX/jkrWpCA5OBg/TL+7l2HfoGUJ1bnjwMqMq4bb4WrbEgoGLQVgsgnj+uSAF8Ehse3LV+HZuYtSq9b99zzC4if/EoDBASvWIth7hiDLNW27AUZ9tfWaJWuolTtOEATefsIf1xxrJoQMwxqP5rbZ5FON3qHRgITs2xjvYUsh9Mgjj5T/e/3rX8/73vc+vvvd73Lffffxne98hwsuuIDXv/71G3r4rzO03Oq0FutBqU2vkivYRXKb5/8XJAnJ71+V9XY15LO1i2tmpa4YNBOj+Isfos080fEYq7Fz2wBOU8Pxk1vpT85z9I6frPp5w7Y6Ig8+hPKPX0JdidB77msACNua9ciu9XWq7QRGVRuAxfn1WRSleGA6nmbqkk+BYXSdobwaxSoXjW/PyRhvfQ+BE45n2L16n5t2sHTUip1mPZVMzJIlpNW54zJqlrnMPK+aPKvmeCtLyGHHU9KKTtKUyUbbI7pNLEYZmnmaQ/c9immaOE2NndsshdkXrgTQDy9lWcnHGPJZeWsuSa5xx/W4rM9664SmS2pfCDltN5XcxLHid0lITifOvn7S/l6Uor1P/Pzh8mf6bSE0HbWExE8PJa0+QVUCpjpFG6y4kCRIOFbJ7h3zj3DFmZfy0VM+QMDpb+qOUxRLiRD81m8bbUI0bBQURPfGrPiWo7z44osbjtXT9HznO9/5je2mKqhFMvEU/g0U8yXvvw/3jp1kswVkoMclMruYxKVtfPGv+lxcRA4eo5P8MK9UO7axkdpGVcWjv+CnQTen5xJ0o4ems0RVkk4ieL3ITzwCrzu35eef3TdFGBDSVmaPc2yc4Et/l9iPbsZYsOJgg9u7W7nfDFsneok+Zv170Ls+161DljE0lSGfQKl65/BCpmPqorUwOdFPqSpk5II/Z8ztZmnxMJnZo6tetxZ+/u2b8BhWyYHqrWzupYJPta5ZW6JgxX4GvBWryevwtBRCgZCfZaBoCMR0B/35LIauWy3LV0FA0okCJ496rK7DVHrwiE4ngsNqbeH3u4kWpjjOboHgkmRUXSVVtFzZW4MTPBFJlql8SnBLViypHRh2Ik8ylWuow8lmCmXXfDSlELSFUP9QL5mD9ofsrLidJ+/iZ2f8IWe+8VXcu29fTbynREpaglNy4mqj7YXP6WVneDseh7tsCZmmyXJ+hQFPH7IkggaBgV4KUxCUau+Z3fc06Z8+QiY4wEbUvpZC6J577tnAbRvx5S9/mdtvv51jx45x8803s2vXLgDOOeccZFnG5bJe6sc+9jHOPPNMAJ544gk+85nPoCgKY2NjXHnllfTZ9R+dnlsPpEyy44py0zBY+ta/0/PKV6Or1uQy1SKG1r2YUMtne324WzS7WhN11CjBupjQvvw8NwwGiesJ3tLpAKtQ5dWi54wzid9zl20tNt9ogrY7TihYmtvkJy8mbSeRFGZnEN1uJP/mpTuXUN1u2aGtj0OuxJZcncHo7zJDeTWqY0KCvc4yuohW6NzlHJtdIHT3DwCQevsY372jfK6oNbrj9scOlavzQ3KQD+15D/fPPYwsyRxJTjcft21FHDfRi2dygpV9D2Hm8+Bf3XWp2zFGJZ2hYDNvJwomvfb5vCnhRqO/3yL97PNY4sEluTAxWcwtE3D6efPO83giso8dPbVbrJVF114yTWmtzy+nGpoWHpmN4bELVHdN9pJetOaFWJXZORcv8jtYjDUvfbe14uotoXo4RSem1L6i63FY78E0Tb7yi69xNDXNBbvfgddOGS/Y2XeOOuvv2NVfASrp451ic3fDKvz+7/8+1113HWNjjTXPf//3f8+NN97IjTfeWBZAhmHw8Y9/nM985jPcfvvtnHbaaVx11VUbOrdemLnOs4eyiTSYJs/tn8fntLQhXSky0efF7++GDdEao1uGCRmrCyE9n2Pm6r8luX9/zfFkXc1Ooa75Xsnfn0DDyCXQIxvTpqM5axGqooOUvw90neWjrdPjw1jPL4/K4SinYwumSVQKtGT36CaOJSsLMhldn+szbW88x44ulI+NDG6e4FSqiDpL72YhrqCvIyuxHp4qQsuBN/1x2e0EFUuo5I5LFdP8/RPXctOR2wAIuQK8oO8EPrjnPWwPbSOhJMuWRbXVITgcGILIYlLBEbQsLS1lWVOZx39BYWqq6diWF61klf0H5slmLNdaNF/R4h22VZQzrXH2uy3xVArkL2aX6XWHCbt7uOLMSxviJw7R0eBq1A2daBOeOaedXLFtsDFOOdnvLSekCKJYjgmltYoC1ldXP2aYBkW9iEty8dmXfoLLz2j0WMmiY1UhVQ/LEsoTya9wNGUpBLFCHNPOotQ81thT0eZZjL7Mxvgqf2lC6LTTTmNkHczG+/btw+VylYtm3/a2t3Hbbbdt6Nx6EVuKoqfTaB2k4Cp2Xn02kcbUNExBQDANlFisTJzYDYz+xUWMf+JTNcfcW49DXYmQmW2dpr1y040U9j3F/pvvrDleL4RmorXCTLJrOnQMst/5JLkbPreR4bNzm+Wa8Q0NQp/lkMrMtR63lqy4QXREJKcTt79irYUmNz8zDipElwCzs+vr4eT1WZugEqv42I01EjI2gmY++20TYRx07hYurYnRiz5K8KUvqzlXrEtMuGfmgZrzQbniXTguZKXTH0lOMZOa41MPfp7FbKUTal6UyeFE8VlCaHb/FAAz//IvTP9384LpTMJae32yUSbYLMWEgPJ8OWyT/fZ5LCFU2rgXskvlgk6f09uQZeYUHQ3p5989eCOfeeRLDc3iRLsLr1NsfNdeWUS2hdRKSkG1KXKWoxULWXNrLFW9j6Lt4nRJMoPe/nLcqmZ8knNdTBUld9xUarZ8LKvl0XVLCPWOWO9udnYFZX6exy/6y9r6uCZZc+vBL00IrYaPfexjvO51r+PSSy8lZQeeFxYWGB2tbCi9vb0YhkEikej43HoxPxvhmWu+wfNX//26r/XZWtZJYz50VUMb2wpA/uABkvnu9c/xn3Iq3l3H1xxznfIiTOCJG1oL3/QjVnpmOFzr2hjtsalSbBfOxGhtTEi0hZA5uB3UjffAKVHGO/r62Gq7dMIt6kYAjk1VrIdSPKm65mpg2+bHgwCqk5229KxPqXDZlYvDckU7P/hsc5dUN+ANNmrhbrcMplnWdteL2cOWoiCMNL7vcp2QvWEey1b9ZqKzhmRzzD+CU3TyXOwgMSWBiVlTyd/3F3/Jnne+BXnQUlDScwso2RyOQo58rHmiwrjNotEj6eV2G44qQVwurHRb372vzhLSTb1cS9MMzSyhxxYft797o4vTFCUSyTzxxZWaWqdstoBmKzOxtIJuF7JvH6r8Xl977j+57KcVT07p3baqAQI4LrSV7T1bW56vR8kSmkrNIotOPA43OTWHZOtZvj7rXYwHRJb3HyI3PUN6xhZYosTI+z/Y4s7tYfOamLSJ6667jpGREYrFIpdffjmXXXZZx+6zbuMFI16e2hvFpSkMDLR2lzQ7F5+1JrhQzCOaBoXRrciLs4iaBqK06v02jIEAB8e3MzT3HP39/gb3lGmaaJksItDvMmvGEpu2FrDT56NYKDA62ltz3rfzZHh2GskpEHz5W1h56Hv093kROuwUO7VgWRFZV4DhbSPMhIJIiWjT9zMwECBkVha55HaVP3fAPjZ57jn4NvPd2pjLVwSwzywS9jlwNGFpaPY9DhetzbmYqGyiYbG4qXOiFOcuPWPR/r16AjJy3bjbGUcxmUREYHznOI66BmjCYUvrFxzW3DKEyoatGVrD/c/e9rvcefgBgnaqr9tXWR8Dv295NAzDYMXrZbtXo1dSmQbIpmvuVfp3UbSbb+ay6DZbielyl88/VjAIAt6QA6fkZMuoJeCGtIrgmewfbvkeQos+NEPjUOEAI/4htobHy9lyvpCTgWDtdftMiMWyGJd8DF2U2HnDdwF4aD6BM2u9j1NOHGbhiMjAQIC0S6Lk4NUcQs130+0OuQPhUMvxvX/gbU2Pt0LvsRCFZYX53DG2920lkU+iSWqZRkh3exBlmR6XwN65OENAcslatzv+4gMMvfL31/W8erQlhL74xS/yxje+kRNPPHHtD68TJRedLMu8/e1v54Mf/GD5+Px8hfk3FoshiiI9PT0dn1sPBIeTXDTOkFdEz5tEIs2LPwcGAk3PPfPEUZxAdH4FNzA53sf81DDy8hzhkIel6Vmy37sY16mvR37hq9c1tnaw9VWvYOnf/oXZnz6BZ/uOmnPhoKvceji5uFIz/qnDFjVKShdxA5GkglR1PmnYVCqROb4qLrB/+yD/uBBFkD3okSlyN1yK902XIvVvbWuc/lNO5cjtdzDxynOJRNIkHX5WnjpEqO6dDgwEWF6I1zA/5zShPPalnafhGh8n5+sl1+K36iacu0+B238EQOTe+4jcex+7vvnvDWOufrfJg4d46od3EE5YTOrpxRVK+mzQ726YR6ZpdjW+lRzaVn7G1EKGXmDmqUP4B/uQAoGGMadjCWSPG1cTcsphh0o2FCSeaEztTWet3yhbKBCJpEkXcvidPjJqFpPGtXTu2Cu58/ADPDRtpRtG4kkirsbf0DE4RGpmDumgZTU6C9nyvarH/fxzc7iBfCLFzHQECViIFQjY5/1BHyxBRi3iEuXydflMxTKVNU/LNV8s6JiY/N3D3wTgmnOuKJ9biMSQlVrL0+WSCfkF8lju7NJ9x/s8KFjPyeVVTMMgEkkzdyxKSaVTbSG0vJxCEATm05biouSMluNbN4oiil5kPr3Mnv7d5MQC8UwK07BKaTN5HV1ysnQsSm/YEtgLB2foBQ6tqIj2OERRoK+DvlhtueMMw+C9730vf/RHf8S1117L4mJ3iA9zuRxpO0PINE1uvfXWsqDbvXs3hUKBxx6zJub111/Pa17zmg2dWw902cXKYpRsMk0+3UGCgs1pJhXsayWJRJ/FMmBqGuozd4OSxch2rwldNfynngYOB5GHHmk8WdURtJr2BqyeLQAFm/5nLlKbnqokLAGv5uLsV21N3naHGUlrXmiz+yg8ej3Z7/71muPsHx/i9H/8O0Z2WrEBTXSUXX4Nw66LzWX1ygZ95v+9kNP/9A1rPq9bGDpxB7u++e9E/e0lVmupFEtf/gJD+3+GbFraeYlkNvC7L2P4vRfUfH7xgX/hoz/5FA/P/6wr45346tc4+bOV2OFxE5YLKvKNf2DhO99ues3CJz7K3k99puk5PZnAEWqu2CnlOiG1/PdEoHUTBrfDjUuqNGsrtuCcS8kBYkdnmdlvCyGtaNHb1KFUVOk0dcb81twcH+8tn3faJL+JTK4mgF9NfzPkbV2IX19/k6hyHzcbu+h0UDx8sPx3if7G4xBw2y7lSErBsGMwkZWqmJDtEyvV8ZTcfetJPFgLpeLhrJrD6/Tgc3jJqXkEe5wD/QFyqsHcUopRm4h1ULItv/7e5jddB9qyhC655BI+9alPcf/993PzzTfzT//0T+zZs4c3vOENvOpVr8LnW7tC/Qtf+AJ33HEHKysrvPvd76anp4evf/3rfPjDH0bXdQzDYPv27Xz2s58FrJTEK664gs9+9rM1qdYbObcepA0HycUo4aKC09DWrZUOeyCKtRAAFpMKp/7RK5h77lGK88cwEnaShrI5nGGSx0NS8rF06Bj1nXX0KuLZHqk2Q2r7gJclYGS0l3z8GGO9tVpwfu4pcJRIKC19zZScCIBja6npocnjh3/CsizxulwS0ds+w+7wQKCm7UA1Zo/M23cXEDAZHlqfdVuCvnwYI7mEc+fL1v7wGhgYCGJkltf8nDI323BMsmMm4d9/NY6e2iqS7ySeQvO5eObYY7xsdONs9Z66qvYSsWYxnmB5aolWJEx9Lb5bZG4JIRBq2uis1A4hmo/zk9kHUTSlTJr5spHm38ViIVid+DTnCxPKPU1idr6cbq2nkoj9tQJjS4+z7M7S7UQWSa7EUBweNzrg1DVkqTK/h72DfOCF7yLkCjLsa11lVy+EnqxiC282dtUQEFeqOA6zWSS/34oJ2fpWIlOk1970tw96yc47GHrHn6ErN1nnlRRep7etmNB6UU2A6nV48Do9LFfVbgkOBz6fm/CAl1jc2q/kbAoNGJzYOFt92zEhSZI4++yzOfvsszl48CB/9Vd/xSc/+Uk+97nP8drXvpaLLrqIoVV6jF9yySVccsklDcd/+MMftrzm1FNP5eabb+7quXbRNxQmFIuTXyoiYmJq2rry4fVsrXBRDAHPjkrzFiNhBWuNvLVc9Pgx0IpIA92r9g+EfPQEG3/ixQXLgjG9PqRCxZ2y979vw/XY/TgBR8k/X5fVo9pCVauSx8ViDrfLDwgI7gBmeoX/GrEEz0vUJMO0L4RKhYT1uO8/fkju4QcJAjmXH5+S7rg+IfdDq1dWN4SQVMjRTmj/6L7DtNJdY4pBfU7fostO2FijpbVhGhQ0paFgcS2UGJIdpk55J1wHxGyaTHi46bnSRpnVcnz/oLWJuiUXX33FF8u8ZvWo1uxbWUI7dwyz8rjJuJClxGdybGqRrf0DTF/3bea++312/vO/1TCrL08vIAAKUtn1mVKx/q0WcUmVuSkIAicNvGDN7+6sE0LTVVllil4koSRxis6yZZUpWjGoEpam5xl9wS4Wl9MYoshOYNeWXmJP2bE0XUceGiZ0xsvhHuv9pYppRhneJEuoSgg5vficXjJVKfjZoolTduCS4Nm5GBNAbtkSqo7gxjvztp0dl8lk+N73vsc73vEOzj//fPbs2cN1113Hrbfeitfr5X3ve9+GB/PrBNnvR0/Gy7ETdR0kmwBHj9S6LI8b70WQJIbe/V6GL/hzjKQVezFtIZT73sUbTneuhzfgxSM0poY6Spk9oTCmUkCz04P9P74eZ8SyNqKKJWUiK7XuuFJqqlplFeYihwGYuuMrXDbsYjGzyLD9iPuX9q5rzPMJhWi80Tp0/OBbBBetmqT+LdaWnVA6SzG+O+zlH8fDmOrG+QHVeHtUMoVVXNheX60AMU0T+/WT966eJPCzxb18+uG/aWk9tEIkXRFuQhP3p95EESiPT9Nwq3l2/U5ztvJmQsQlyThExypCqKLZt/ouJZJeLR4rMwnodt3Q7PeswlktFmNxvuLiXp6x3rtelTjTM2nZfUVZ6Ggzdwi1QmguU4lBK3qRix+6nM89WokThXtqrdDMorWBD/e4GLLrgEpeFtM0iccz5Opef1JJle8P3baEKvPP6/DgdXjKVilYRcNFQyCTKbC13/psYWUFRZLLv2eu3vgAACAASURBVMlG0NYdLrroIh544AFe/OIX8yd/8ie88pWvRK4qTvvUpz7Fi170og0P5tcJOZxoKxWTNBFNMRRqX+o769KXBZuSNnTGmZiFDJknNYTQMI7JPU2vN/Ip1H13Ip/0GgRXZ4ScqiBhZhuFZ8A2IAqeEB7mSCzH6J+o1WoDZ52N8uSj+E89pea4ZltChaq06KLtUnxejZN1ixye+B2cS0+AkWUutj6iU0GSENfoVeTs7yd/YD+pDktr7rSDp4pWwO2sXcy3Td1DTsvxph1/1Na99KJKO3mBI0IOdXSM4ryV2qxLDiSbUzDQUytoTNOkKEmA2VB3Uo/57CIFvcBCdpEfHbkTSRT5k+PfTMi1uvDaOh6mNLtHeho34tVIWbVkAkyzZffapkLIsfqm6a7aVEvuvHosJhQkIJ1II3qDOJNR+iRbKfL4kXMp5p49jFHIozg9uNQ8424dFQj1VNbQ+GvPJTPYyxHzIXo7EUJ1llB1HU/JUqkmQZWcTnRA7OvHiK6U4ymyCNjFqkuJAg7A0HUSiSyCqdf0WUoWLSFU6tW0eZaQp4Gw1R9wk8hpFCMZThgdIo7VaVX1dCebsy1LaM+ePdxxxx1ce+21vPa1r60RQGDFYR5++OEWV//PRLRYG/9xC+tzWfTLtRvpUvWOKUpoLzqPr032Ez/hd2s+Z9rCS599muLjN5O76YuYbdLG12MhqbLSpJrfsGNCoTHLfeos1m50gsPBlpOOZ9c3/53RnVvLx5XHbqCoWEHTjKMydQpqDtM0mBas+07rGYpuayJnU0sUNKVpL5JmGBsOEXSvPi1X7P3xuK39q35uLcwWophV/Ga6oXPzkdu4e+b+Va6qhfM9HwaooeQvobC0RO6AxUihLi8jD1UEfTXrtFC3njRTw7Qt8EyysXA3XkgQK8T54s/+jv0xqyfMN5/+L56LHWDfyvPcV0XR3wqlIkmARKKRrNdhVlTxyMwCD33806RjVnxl7oDlfko5mitHit7oQnSvoblXC6mEkuInsw82dGZV7e3KVBTSdiuDkiUUstOsY0em6HNBYNASkIJizW3BUcUaIYoETn8JiqF2tJnXu+O0Kp62ksVSjbzNFbmED0QRzbae83mFvN1wKGX3fDB0g/FeF+Mj4RpqoNJ9s2oOAaGBVNXIRCk+fQdGrrEecq1asGaWUDUEh5O+sI/xPjfRmLX+BdPE5+9O48i2hNB73/veNds2eDyb28nyl41tx9XRo7fJFVWCns0gVflLNbPyqgXZw/MjE0znl/nx0bswTQPvmy/H/YoLwHZXOHedgfvVH8aIz6M8fF1H32FoqIfeJn2R9h+yXBRm0AoWO5S6TahFw73i3htr3HAlKGoOM5dkxmUtzqPRg+RtTTApGvzV/Z/mhkM/amvMgtQ8JqR7K6mfKbs3jNhhI62Sr/7qx7/ODXd+vnz8QOLwuu+146V78P3BeYiYGHXjfuzPP8zcFX+DruvkF5eIOSrfQQhVJSLUuTTy+Uq2Vd5sfBeXPPxFPv3w33Ass1B2BcWVBCcNvAC/7Ctnma2GdKGycWrFxrktVB1bvOkmBuKzRO57EADF9hBI4UZLyDTNppbMWu6jaiH1ZGQf3z94E9fvr2VE2DpuvTMPGhMT/eiCyJFpayxOu9XBGBmMfA7R5g/MJ9OYggBNuAgVXenIrdWMnbrEoLGYa0zkSORKxKRhii4v0wctWqp4IstCwtKodk1a300SAU1Dkp01/ZhiNq1RVs3idXiQ6ury1EOPoDzy/8qx5hIKD19H4a5rVv0+tYkJ3gZL1pQknLIDpwiLyxUhu1HOuBJauuPOOuustrLB7r333q4M5NcN7t7abKV8KstaYtYwDAxdx+F0ko3EKfYO4rfzdCarmAdMtUA2ay0ex4FHMCdfhdQ7htRbSWM9mpzmPxfu5v07T8d/5OdIIycghoaQBre3/R0CIR+5+UYLzu+ABODq70MFsrEk1TqtsQqnmCY3voXMk7ewPPMsSY9EGCcxPQf2Y/OiNYfunr2fN+1c28U1G83jzjZafinBTRgrPrVr2wCxfbCc0dfNFG6aJo4qzfB+R54zchG+/fx/11CgFPVi29QnHq+bLFit26sESinWUkimkEydnNuPUxARTINlw01pRoh1Qj9vZ6SFNJ20JGKaJjce/jEH4of58Cm1qdzVmPCPsphdakrLX49EXiu7EQW9UdBl0hXFpCfgIQ/4ZGucA2KBKDC8rZEiKVaIY5gGQTlQZqMGK/ttNTRz1+l1TNAluitT0xAkB4bkKFtsSwsxPED+6FH0VIrUxPH4sGK5EmLTvay4BhFoK1RbQj6nl6yawy/7UHWNpSZCaGQwQDG9RKg3yNy0q5w40etzIg7bc64UKzNMMuk8uEO4qizK5ZwVR8qoWXxyY/8ebcpibDCLtQql4Ami7rsTfWUaqb95DM/tcNn5piZep4fThk7m1qN3kfauEMgZSJJEQTMxMwWOG+ylYFOyL6WKDaSsnaClEOokrfk3CWpdQHh2LkrvKS0+bOPR792O7+4b2PqFLyHrCrnwAEQs14Wzv+J+0WafJvL0j6DHiwSYhQx33HMFKV+AN730LzCVDPf9/Bssu3S+wAon9Mn82U+uRQj04/+T9tkkFFNEyzdu6H1eiQTgCFuJrlNTSwy+vHJeaOI6M8sJCY3Puanfz9b8MfB4OCG4hUdSlovIadZ+fjGzyLC/eUZVCZLTidSEhn4k7KaQhcF3vAvD7vWUWYdxqufTPL7wC04ee5EVZ7GF42BR4z8f+wZTWq0bJV3M0udpb4PKqJZQKxYKuF2Nm6m2bG1MO0+YYO4hEYdpEBgZrNAY1EGxY2w9hkTSAXuXn+LOmXsBOJZZaH4RMB4YZV/0efJagSPJaf79mf/HJ1/80aaZc+MjPZTu1ONt3AZisYoAMewMvWzOmktaLIrkDyA2+a6/WH4SgBcN7uEncw+Wj6+12Tdz1+W0fE1pxHK6oqFH0ip+r5v+kH2dzV+m2qnwwvAYPPNz3KaK2KTY1jRNinrFHafNPYMYHEAMrl33VW0J9bhCZNUcQTlAppgpd4utRomaSpOcDI70ItiubAkDdzkmlEcCVFUlnyuQz6n02pZQnztMJB/FMA1L4Dlr3aCmoZUTnEot4wH05SPoS9ZaNBILLYWQKIh2j6RCuYvsn73gT/jX5Nd5X5/VVmUlowIqwf6KMu2pSqgpaAXum3+I8/vWX6vX0h13+umnl//bsmVLzd+l/wKBzadH+ZUhWFuDMuhbO/zsTizhMYroz1oLcddLTiL9itcz8defrmk5bRZzrNj927OSiFnMc2NQ5CdSFvXQo5i5FGmtotE873MhbX8JNNFYV8NsXEFtUnNTigkFhy0X64hXWDtmY29Eql5Eqot/rMgOHgtZE3LL0O+Uj/dSa64fnX1szTFPjIRwCiaGorB8/XUV8lhdI/CSl9Jz1tks210yj9uydnsOU1XI3XY1jz/yTf5t6lZufvo7qKLAudEMp6XyRJ0SM2rF/VVyTWTUxi6SrbCQtFOSM81jd6lpa2N0BIM4bQ6z0e2t26MX7PTYsGhtkAdWni+fO5KYanndmH+kTEb546m7iBbiHEw0Twyp7u6rNGnpUD3fC3aSQixhvZOZA7PlmEw99i4/xdbABL252ve3HndcCYZp1GTKGUJlTFnNRJBlDLvwOiDqmFXEwMefZs9Dw2iawaUaKiYmsiRjmib5W68ke/0nVh1jCY6qJoFh23oOyoGa7yhXfabk+pyKFZE8nrISVVRUsoqlwKQK1vrSNIOwR2TH1v6yW2zMP4pu6sQKccsSqkscyH7ro5hpy1KqtoT0yBH0GWsvMjKrk+x6HG48Dk85e9EhOsh6JfTjtwIwMhBgpMdFPF75XXureCf3xw/xyPzPV31GK7QdE6onAH3qqae44ILWroH/6QgO1LrjPMLaAmDMVgxyj/8CAEcoxIvOfyOe4+pcaDVCSMCsigEYmShmMce8y8Hxgclyw61HHAVm9AxGrn1G7/GxXpym3hCYfOpZm3zS50NwOHAbxaZxgWoIsgf3qz+MKsA2vXVS5ZYq4sS+uqrzRHTtTLlSnVD0nrtJ3HUnB75v1UlkMwXitm89Zxcp6dLaPmkzG0OfeYLigrWRP75itXwOjO8hPLCTgiSWG48BbNOsJfH0ynM17qTVsM2uxvfVDce0hXV21ooBZARXeUM0Aq0LbRU7nhb2WkJ2fuVA+dzhZOvWGWFXT5mM0mcnDUylZjiSnGr4bK5YmRN6sXFui1WuoJzNVzYatia4M5ei6G3MFFV1lWOZBY73DpM78GDNubWEUKvsubyW54nlp8mpOcaGK+7S7ZO9JPIGM3Mxiwsxl8NXohUTBJyjFdd2Xm8Sx6xKdTargvmmsfY6d1bFY0JVQqjafauZelmxS6Ss9zc21styHhJ2S4RCXmE+bgn4p/LW+3I7JUxNQ3TK5XKIcb9V2L6UWyGr5vA5feiRo2hzz2AklzCVimAwq5KMzHwaEMDlw1iZXrXtisfhrklIKLkcS0StsktGwiRexbIvVHEGRgvtlSo0Q1tC6K1vfSvvec97yNoFmHv37uVDH/oQl19+eccP/nVHvZ8+k1xbM9ZsBvDMs9ZGFzObuyC0QpZYSQiJYo0QymRXSOUTpBwSJ4Z3cNaYlT33A32BayZ60eefa/s7BEPWRmTWxXh6PSKmIFi9TjxeMtFEU7ddPa5evJdpj4zD0DlrvLHQ06sb9Lsr1klfoBKxkUxIpiu1MoVHvk3x6dsb7jEdyYFpkn/e+p7ZrF1Fn1dYsS2g8TFLQUi34Y4zsnFUAfI2/UlUthaOv2eMnsFK8XCJVmbrilW/9eOpu/jak/+69gOg7FJJ3Hwjuf0Vq0V3WL+/GbHu6ewJlfszJVcR5AVbCPUPWZvqop7DaVgb2uEmDeDesZDg8lMvQhAEPA4POS2Pz3bB3TH9E77yi681XJNVK5av0GTjjVW1EwjY09hhl+X6tRxbdjZacou5ZQzTYEQ1KYp12aXrSNEGGPRY7uuF7BL/vO9b/Mu+62osGsHhRHA6cWJQyOTAMIj3jGIKIgVPELEqUaq+JxbU0t8ITjeObRZRqr68tqLU2hKqrHfDNMpZc2Nh67uF+4IUHTKS7TLzOAS22HPZLA3RMFALCrGcVrGEApYXZTkXIaNm8Tt95G74HPlbr8RIVywcx5ZTangozUIawe1H/p1z0I78nNwNn2vp8fDYTAmV71gSQtZ3yBYNcjmFyd7KZ6ZWKgIvlo/j7DBtvC0h9M53vpNzzjmH97///dx3331ceOGFXHHFFZx11llrX/wbABOYmlm7Z8z0EcvLXqpz8ffVN/S1kC2my9p31uNF8FY+l8xFWS5YxXajgfGGfiEfnflBU822GQqG9fMW87UuuQGfhCi7EEWRuCoxNxvByeoaoJFLMJWzNlN3/3G8Zefruer3aotrQ5pek2lTomrx6gY9ootUMUPx+ftQ9z+A+vTtKI98u2FRlJqAFZ55GoAxhzX2oFtil+1+0223TN5Ye/oamRhfmezjrt5a95HPFaSnp9KG4HckyzLZlq9ItvlMexyJWduqSD3yEHNXfql83GO3UJBiyyAI9AyEMWwtOtzTOs1FtZkIeoPW5pNDZ0yxxlWfdOAwYVxw09NjCQVvqUvmGr2CBquapclNCpqXq7KgNFv5jESzGKqKkc3iCDWyYJTe17Dopj6qt6YlVC+EbCu6ZI0u5paJZStzdDGp0NcXYNDvoJixxmd4fMQCg6x4+hBFseye6+9tJNUsWUKyJFtW/u+9G8eul0OTdGYjE8WscoU7mlpC/oZElpKgK2V7qpKT7ccNI+tFa97rOv8/e28ebldZnv9/1rzHM89D5pCEQCAhYR7CoBFRWsEZ2jpSW8RqLWqdf+LYOlGrVq2CFWetIiiCVBCQUcIQMhBCSHJy5vnseY3fP9a71l57n32Sw0nCT23v68qVc/Y6e6+11/C+7/M893PfcVF3DCahQslCsm3G83bIjmuKNSAhMV6cwHbtippQNP1mnPE6kKRQhcUrzCDF0ugbLysf1Bz2KxcuOocXLdpc/o7iGdsx/jQPDT7KyHSJTKYAkQi5LmIRMlGcrOltNB/Mu9317W9/O9lslne961187WtfY9OmTQva4Z8SLEVHc0zQDXrqD5/6qZdMXM1AFp34DZ21+1hK3avhuZ00Gg1krCxy+woQjJOp0lRYyEzG6kjpsx+gbWM7wzTdodA/bVEPZKZzxBrKN4hTKoX05vrWBhRNOqypmpsrpyz0eF246o6iSY5VsJCaFX97StZJJZrJ2g7WE7fhTg/58j7FDN70EFJD2eywt7OeqKSqKYr6rm2jiPDfFLyulubD1yTzuVGmtNn1vFRjb0UX/cm7H8cxYOnqLZDzc9tNyvzaDsayNtEhNL9zB/FVq8u22pN+IV9SFNItDVgz4+iK5K/kW2cXwk1xDlsiabJGy2FMcyv6s5blTd48MIXeWfaTiqsxbNeukF2pBSVqv2DP1kZc2hoLm1ll4TA8OZlhvN+/HsOWSnVFrj87iCarNNsS507lKTV384Dn3zeHJSZURUrtyVaeGt/JjOhLs107bPgGKNo+Rdi1LGKePzAuXdqGu/laFHG9FV3DLdSW24qm45yRveC5xDfPVn3xXIfc996NVN9B8tWfRJJktEgk1CIM8RpiDeGEubRuEc/NHPAjGS1JZiaPAQxM2/TGE+C6eKaJaztkSi6t4NPIAatkIeOxelkb+8SAr8s6MdVgTDi3JueYhMzt/4Mlsgvpq27Es4pI8TTutL841te/HLTai4GTWk+o+D2IhO4ffJj7Bx/mPV2LsN0ZMjOFsNIbWEk8NPgouyaf4ZSO2o33h8OcS8nzzjuPzZs3V/z71a9+hed5XHvtteFrf85o/9B1KFe9GzUeJ3aYSAHAMPPUn+xfCDkeR9ZqP3hFsdLtSLZhuzalSA9D4aSXYLYvA/zu5Xpjdu7dmKctc68I9RNK5eruqV2DTIlem1RjHZpdYnSsdq2ptPUXZL75Fiy7vIKKPoRRtCyqVM1oSvnpuLSepi7RzHOqy11LV+ABsRe/AwC778nKD4mkXDxNJz84hOu6OKbFeE6oMotlY0k6PFlkOpJqikX+PhlrqFAVaEm0skVpJX7aq8LXpHmKy/Z2VtZ3Dn7uXxj77W8r0oUZoUre87arabrk5cR6elnxpa+y+KPXUY2CGDRaEi3UCV23Oqc8Aa3L+Nci6boogDP4NJaowQSRaNQYDpjlBFqqWvDbVfeUFNGsC9LMy1uM0Nm2loL2YG6YjmQ7spkj4XpcLrXTk/KjuaDg7eanMZ+8LWzKDlAdCbWKdNyU6d+XjudWLDqWL2picNpkeGQat+BHh0o8QUN7M+km/9hcMZBOFWazLaPpuNLWX1C850Y8z6uIeIBywX96iOy3r8adGqxgx/Wmu7n6pDdzUsvakBm3vGGp2IdQExf11s6uJoby/nM3OTKBhMfgVBHbtcNIKKmKHjhNC5tVdUUjpsRC+/CUliB5xRdIvPqTICYh/eSXYe+tJAYkXvpPxC+5Fnvf4wBoK89CmkM2qRrVvVCKJiN7LrlsORKXNQ3HdfivnT+k5JhHPxL6307RBt9moKWnnWd+qpGbOfSA5JgmbqGA3t3D1BO7cGxYMcffzkz6YU9Hso2dE7uZeOzmcFs2niDuBDnjeEVPwumdG3lw8A/MDDwFqy897PGn6pLMQCgPE36vhIIljMwsLYY5k0GJEBMKqXJ60PyDr8llRlbWtbrHXrrkolmrqfpkK4rnkTJL1BtpXM/ltuxuVugqK6wi6pJTkGKV0cyBsULYj2U1t6MP9ZEbnUByHUZFTWj5huMZfGQtHScf3t8qv/QkeMJ/OOvVJEXLH1CTWjx80M7vORue3YPT9ySeVaJLTjDg5slGpEm3jz/N3ul9vGzpi2f1nOjx2avLwb5RzKIVipbaMX/1qjU10fKKy/0XRd3RKWW5764vcOopV6DOjJF9+m7U+gRqooEW02FGVWhsWgqeH4WcOlPgyXSMhFM+PvvAk3iugyH5g1LQ3BigZJfQ9PK9FG2eBp+coEWaf8dGy+k4VUwYbrFInVMkAyxaMduaYdqcoSnWiDfh3yvGKZfyzngqjGYArKfvwXzkp5Qe+RnJ13waOeVHEtU1oaDWMiWUAhzXDvuEwI+C1JiBmpvmoEiVT5pSRb9bxnRJA/kaYidBvUVHxhl+BnXRSeR/fh1SPE3iJe/yvXRkOay5qMtPR4qnQVbDVBX4LLjjm/1INK7GsEyLJXWLKvZRb8jYOUg3pBgTtHZ72v9eS3saKTqlMHlazPrXbzznhJOQJmsYqsF4sRwJyclGoBFn/xOgx9E3XYYz+hxObgL1uLPK50lW0ddtQe1ajfXsQ6hLN6A0Hd59uHoSGivkMUomLSmdYD26ezDHyZHFqVRzZDg85pyETj31yOXj/1wwUXAxh6boGehH7+issJMO/2bIt+3dO+0inX0RUn62FEqAqW2/hhS0J/xUzFjfo9DmD70To3tIjx2EmO+zEsVfrXk1O/sfJe/Oz1a7KNJWuUye6Cc1xmWKDX6ar2/GoWEmQ09MIg80vPFv6TnxxFmfVSqWB5KsNfu7XbJstjFfQk/SU7Tozg2jLC9PNruTOt23fY7YBX+LtqJStsiIlQdCqaUNhvpQs/6AumaZvzpWUil63n3tYb69j6jXSzLRxD8uv5KHhx7FUAwkSeJz516HrmgUdnwc8Psp3rF7H3c2JrizOYXjOiiyws/23Mpgbph6LcW5vWdV7KNabBKguasVd79BQZy2rsVz90cdGNzGj/QMjz94PUtMl981Jkk4HlIsTYMYQNXutVy9z2Uq3UCz9SAA6aYlyPYEUqIBe+/DOEO7iZ/5ivB7L61bzNL6Rfy2716KTpFUZIhOpWJE2yq1Ki3w4ZFpqhOF46PTJA8RCeWsPL2pboz156KtPhc53UocUJ6+H0szUHpORFt1DpKqU3rg+zj925FXnQNAY6yBpJbguIblPDa6jd50NxJSeP1szyFnlY9xaKpEZ3s9xcwoVlF4d1U5xKZScZjMsahz9rEGUYo68hyUcmgrTsd88na8ok9AKtzxb2DmSVz6flJv/BooCpKsYu19GOv+m5AN0esTSem+c8PbGMoNh9FosI+g+dtRdRYvaacfSFFiGt9mvWSXwkhoYsLf/1TRCe3RNVkjphjh58WmR8j85DrUZZswTn8t+kkX+28Wx+IVMlh7H8F+9iG0tReidq1BiqcxH/0ZUrIBuaG75hgWhVKVZRjJ5WgtmOgRwklzc5p8pJXklPajnI6LwjRNvvCFL3DhhReGQqX33XcfN91004J2+qeGxsYUHarJ/g9/gKe+8KWaf6OKB6G1u5VNr7+U098yt8VuTsiatMb9rPpMROZkz8Ru8oUpVK9Mk3zj8a/jjWtfD0BcUig4JUqP/5LMjX93yP6eCbEEHB6uTLU5xWKoV9a7uA3DtUIPn7qudhJ15TqUdsKLQTUqdKwy5qGZgo2G/9Dris47e7ew5Zx3Uozo3z2d8Pct6clZx9/VXg7p46KOFaRbFqLYO/rUbeHPSS3O8oYlvG715WE0E1MNZEkmfv5VaOtegtzsr2JTIsqYEWmttDBPe3D3bVQja84uZqdSsQr5ofqzz571NwGCFfPupMEdggadVyQkSeIMx/99RdMKjn/xezgl1kXadkm50NOzgeSrPhm62ErJRpIN5QilIVbPclE7LFbpD8pVdZLqNNTK9jiSblT03hQyOZ7ecQAXCblGj2DeypPUEsj1HWCXsJ7z+8LsA49TeuwWzEd+Su67/4i29iKkWBo7wvRMagn+5ZyP8uYTruQL532CeqOOmBpjqujfu67nokR6m0xPQhZ9Qu2ip6mlvZIIZIgIVdI0inaxgtQRpOPkg9uRYmmU7rVIsVQ4CTkHHscZ2o2bHUfSDCRZxSvlKN75FZwDT6BKakUvEPhGeCe1nhCmFoN9BH1YOVcOWXulKf97ZUqOHwmJsT3QqFy1tLUqHVeOFGPFPLgO9p4HcafK5BlPpI+dvicp3vll3OkhFHE/BxmH0j03UPjlZ2Zdu2pU6+Ol6mRShowZ6Slra62jICKht617A52H8GA6FOY1CX3yk59k9+7dfPaznw0f3pUrV/L979d2ZPxzQzxhoIjmO2PnYzUFAXWRm23vPnzHdQ4XHSms90yLguvqhuWM6Cpb0zHikUuzsWM9G9tPBiAh6+Q9m6knbmUYEw7R19AuTN/0W75Hflf5gT9wYIz940LEtMV/cPc/6/cOTVbZIxhnvI7UG/8Dr6fchGpH9rmsfnFIpw3wTxuv5u9PehOyJKOvuxi1cxVndG1icV0vJ7ccz5BYsZa2/pzcD99b8d5o8VlO+Cv3/oN+SmT8+Ugk4HfFT0U62JNzCG4CyPUdxE5/LZIsY5z9N9TV+2yzmRmfERi4BmVr6KJFmWYBioUSmUweR1ZwtlxO8oR1c+7btOeObJcvOYNP7xmhbf92cZxtqMAH946w5ve+tpq+8TKSr/40ib/4AMrOsvhqTDHC/puiU0XBr9JSy8xUSf1YFrKho0TUBtqTCjEzj2UkkKvebzkWpmuR1BJYex+heNfXKd33X350YRbwpoexnr4HPBdJVlC6VoNVxO7fQUmkfMG3NNBF/1dCjVf0akUtL5b2NrFvtEA+W8AT9auoSCmAJeofIxmL7+z8Md98qqzBGEQV2tQwcusSJFkJyTJRFH/7Ncydd/s/33sjAPpJL0WT1TlrowFLbqo0zU07fxw6Bdc31ZH1/Pc8t8ev+w1PlShFJqGUGPslTcNyLFRJQZbkCuJGPGJxX3rg+5Qe+hEAStuyiuNQe9eVFfhVA0R04ww+jTeHe3EAWZIr0mtFSkiuixtJ20uqFqq8J9TZUkLzxbwmoTvvvJPPrgXssgAAIABJREFUfe5zrF+/PuyfaW9vZ3h4eME7/lNCyZOxsuULXxDKyFHkR0XuuPHwbp95ySUhaWHYPi0Kzqd3biTuSeRUuaKIHkVCjZGXPL7V3cQXFjVDDTHFAPGk//luNsPBz36Gvu2+hEeDnQtVh03BlrGHfCFMvUri5IdPfY+33/VeSmKgXJTu4W/WlqO8d59yNR85o7LTvMGoZ23z6orX2hOtvGfjNXSmOil5Di4gJxrwsuMV0dDB8ciAHPdv7KKwV5+sUWCeC+7UEPbu+5hWyg/SfI3f9OPPp/nUVwOQFZNiXvGvUb6WP1MN+Zp9/ZM4ls3k8pNY86qXH3J/ToQdGKBXdNBrx58PgGQkyf7wfTjDz2Kc5h8bYrCWFBW5oQNJVokN7gk/I6Ya4Qq6VDUJSbJcQeK2qtiRY2MzlFBwIw3BTj5P/UQ/9d2zU4s5kZZJaAlKv78JrzCDV5ih9OD3ccf2I1eZNWorz0Q74cU4I89ibv1FGIFEkVBjFVTz6AJFUlViyTia5/Bcv98oWR2QBp5JBRsOZvoZqrBc8L9vw8v/mdh5b/Y/M5YGM1+hWu8M7cYdP1DeDqAnUCUZbY5maV0oXTw89BgPDD5CSfe/g5FMoKWEWaR4npb2NPkq82LAn57yJ8GJvI3pWmHvTRBdabKGXCjX69zx/aE0j7HplcQvKT+LUrzSsI+IHFbgZzYXJEmqoKJn7BK2ZaNJ5ZP8zFAuTMc9X1PFKOY1CWmahuNUDgATExM0NCzMXvlPDYPTJpJVfkgLeypFvzzbZve2vf7jUndohojnueRkSEpa2KE8Y/gDf0JP0ij7P8el2pNLKt1JIZHmoOw/YNnCbOn2AI5S+Rl9d9+Hk80iFfP0rPYHBXXFaoqKTvzxBwCob6ikhN876st+ZHf9DoDLl76E9iolhOeDmBrDwzfFkxu6wHUqOr6Dxk8AKeE/sL31/vdYNQ+ZngC5n36Y4u++SUaRqRfntFru5FCoE9TbjFiJ54QydUGWKnxeACxvdkG2s8Egpcus6G2ata0adpVW3ilKE9eeL3qwRIpF0mJgl3AnDiLF5/a1SsfqEGMeMcUI64rFqmhLkqSK9GZ9vHLRMzGeIWtJTEXmJmd6CnNwgMYtF8/ab+Cfk1TjYVqo/EYLubEHpXcdsfOvAvzGSrVrNUq73zDsjOyhGvGq6xU9SyMzJt2dDciugyIyE7JWeb+3Cjbd0t5GJkpTTJszwpbeT4FqsoqixZET/jimdB6Hvv7luNnxis+RxSLB2HQ5xumvwXzkJyiOPWckZIgm5aCf78cX1hN/9WVIqkpdo3/tmjU/myDpcCBzMIyExsfE/WZ7WI6FLhaZQSSUCM5vVEhY/CxpBlIiMvHUULUASFx+HUrjbPHZakTJCQXX9BmTkSxQa0uavEhxxtXZ+nzzxbwmoZe85CW8973vpa/P18AaGRnhYx/7GJdccsmCd/ynhGidAmDvw0+EP7umyTNvewutT96Lk6yrYBjVhAfFxk5SiSY0WUORFDINfjpLl3WaBCsoPscNnkw1k/dsggX5yCM/mHNXZsRuTepdQvfEPrL9fsSjtfn52+buNupeWmbayRGfGS9iLjcjfG109fD9UodCXBGDoiwhC9XwqGxKeyS1lWj0z4WzgJqQnPYnrIwqszjeii5rIe13PkgLSvXB4e38aPfNlByTtBgFc1VWCVaNxyily7i2Pa9jLk5XipLWd61FERONudOf/N1CBi83idO/PSLdNDsqk2N11Inj1Mb60ASpY1Y6jiottrEJXDHAPPCVb9M+tJuWxjgNTZWpxum6NlIbZhtYBpNQHMlPEVcxCCU9TuLif5xlqa60LQUkCr/+Is5Q5eKu2temhBX6NjmSEta1utL+9zCMymcvyASUJBfX8/8F9cySY6JLKsUHfxB68KhdazA2XY6kJ9BOeFH4OcEkJBlJ9HUXgx5H9bxwgqiGIZePQ5ZkpupUpDN8RYagZylwav7lvt9yy97bw0moUSwGlnQ3UXCKYTo1Jp6bhBZHaer1CT0i3ShFVLXDn1UDuYoFl3rDV0m95VsozYdnx0Glg6yt2LO4by0t6RcuHfeud72Lnp4eLr30UmZmZtiyZQttbW1cffXVC97xnxISqfIsX6hrIT7aH6aQxg6UB5BUx+HrQZIsk1dkUokm0fBpMC3qDIaq0yS6+JPNS2ofi6xjuRaKuAEnMnN39SfT5RpI04b1lPbvY+8jTwEwFek/6jipTK32oimGiA5VRqx49OcRTdRCsKKzlm1ASvpRghfRw4vScJWkf/wHBAU36BOaFyQJko3kFIW2ZBsfP+sDrG+bzfqbC4ZqoLked01sD03i2jR/QM5VqRak0uXBsv59fgSTz/m26YPTh5dDMmcq5f+jzYj68ecjpVvQVpwWvqb2rPW/Yg3HXSleR0r0Fil7/4B7i6/gUKphjOhEekbGvvR5nvrV3QA07XgIAHtwgHi6ch+pTafWtEXIi0koIWwK5JZy+i32omv8bv4akFQjZHcVH/ohma+/AUekvxJVq+uCVQzJCT2dDTwn3A1LQaq8qk5VEnI9B2fKdZ6AbVdyShhIWE/+Olzde56LV8wi6QliZ14RvkeuSpfKqRZUx5kzHReNIDa0+bXAQP1AkmVcSaZfWJBP2P7xhDUhzf9BUhQKViEc3IO0akKNo6/bQuzsvybxqo+DJCEZkUkoliZ24d+TfOV1KE2V0kqSHkeSZUqP/5LSwz+peeyVb/D/q9fT2LXY14pK3i6gympYx1sI5jUJ6brO+9//fh577DHuv/9+tm7dyvvf//5ZDqtz4TOf+QwXXHABq1atYvfushjjc889x2te8xq2bNnCa17zGvbt23dMty0UUQHE1pPWoltF7An/Jjq4py/cpjQePvXi2SZ5M0tcrEJjts20UGw2ZJ2mpJ/qmotznxDRjStWwVPO3N4xSsxAa2ml7cq/JisGtuTkIJ4k0ba0vBrSu8uMqmgnfTStknHLHeZHgphY3RamB5Hr2tDWbK5ILw3PlAdLNemnBm1Bd89Ud1jOAc/zcKcGyZs5HAnq67t81tY8G/UAZM0g6VZGGq2C2FCdAo2mgVq623CR2Nc/iey5FOchfB6YwAWTR3y6rBkh17WRet1nkVPNJF75CeKXvAelZQmxF11D7Nw3zT7uVBN14rFWPNDFd6gVCVlVp9Ob9NNQicU+o6rlVa+hVGVevvLii2p+hzASEsoasbMig3hj5yG9yYzTXk3qr/89tBpwDvokjHhVnaFgF0LygaSqobPnQP8EjqTM2sfAVMBKK+cUg74j0zH9cyOrSEnR3Do1RPa/3o659WY828Q443VIqeZwsRR+n3QLuuPM+SxIksQVq1/Fm0+4krO6/FaXqEGdKyskZf/kO4LyHCgmTAql8umCQ94uhNFgEBFFay+SrCLXd6IuK7fTSIqK2ntiRT2oGu7oc9j7Hp1ze4Bgod0Sb6GWQtaBcZ9xWB2xPl/M+6l89tln+fKXv8y///u/I0kSe/fuZdeuXYd/I3DhhRfy3e9+l+7uyga3j3zkI7z+9a/n9ttv5/Wvfz0f/vCHj+m2haJ/spxPN0VxMjCm6tbLo8y+TG26tJsdp3jvjb7vR3Yc08qj5f2HIR4ZCAzVoDHmPxC1Bg3we12gPAlNH0LJQZIkln76X2nYfAETRZE3Hxkk1tqKHunHqabrBqiYhMR+5lr9zRdB7jifHUVONhI75w0hjRR8g7gARr1/rnvq/IFw2TzqKwC4NkrX8eREFSGtzZY+mg/SVcKXrYIZNDNeqUYcjd5kw1fK7hYyT8sXHf6YAypug+1fo6Rce3GnNHWjdvssRW3pKbPYUOAzt5pX+L03OUVGATTXC6m0UVTbMwdpramxKcxlq2nacjGDM/51T208lZVf/xbqHHXgYBKqX3E2ics/FqaCtOMvxNx6S1g8nwtSLBXS4xHnszrFk7cLZAT7YCJn0dXhH0sMq6YbcLfYHq8vbytHQia65+83UBGQGzqRUs2Yj/+Swq+/gH7iFlKv/9zsCdRI8RdTFpetmNuk8cyuTWxoW4cmrqUZ0VzTDZ068RgFg3t1n5Dp+t83mHTKkVCC7A/eS/HBHyDXtZF45XWoEdkm8Hucsjf87Zy23lKyETd3eNXrYBJqjTdXKM0HGJb7+P3Awy/MJHTbbbdx5ZVXMjw8zM9//nMAcrkcn/70pw/zTh8bN26ks7MypB0fH2fHjh287GX+hXzZy17Gjh07mJiYOCbbjgSLussDiSmKgIND/kW0Ip/dlqi92ive+22snXfjDOzCtUpYkhSyXuJ2udyqy3o4YFYXkgMkq7TkpmZJRdbGskV+PcTLTCMlZw/KetfsDngiwqq5eDI8xiNB8DC5ay/wj8d1KnpUGurLA48mqNxBD9N8a0KSopG45FqygtGWrqG/Nx+kqqKA9qSfbn1k8ukK6nC08U+SZRRNJS76PeZzzJZjoXgedWLMSMWPjPBzXs9ZNHgyJ2b982a4LiVrdsRcrLp19jzrM6asbI5Jy//uPeLezzscssExZ+fRZBVdUlCaF+EM+gxSd6IPe88Dhx30rKfvxQvSkmLwrB7cpkszeEFDpqIiidRcg+aFPUFRJEUavYBFo+GLgA7mhvE8j5JTQnc9JCNiuS5JIVFCESnPWtBPuIhlZ72JrohBozOyl8KdX5k18AdpqqhskqSp2KIm5AaRkNjWnPTvl/bWOpGOE5NQlJiQGyfIlUnybBZtoLQ/1/WSEo1gFStsH2rBFW0JLfHmikjIE7W3ByaETNA8HLgPhXk91f/2b//GDTfcwOrVq7ntNr9Zb/Xq1fOOhGphcHCQ9vZ2FJHHVRSFtrY2BgcH8TzvqG9raprnKlqgubl8c+bb6jkofm7sbmMSSKgera1pfr/bz18ryQRrr7icdOvsnpFBTaEA1Kd0HEPCkyTqkilaW9M0tC+BiWcB6O5oxkgDj8PS5p5QIDCKglbZEJZvbqOlJYkkybhmEVmvzVLROhoZBpxcln6tjlOqPrvpi/+KWyyi1ZdfLzbq4JcHKDW1wXQ/Xe2N87J9nwty0n8YjeVraGlJ8dynXk3DmZfRtNmvGRTsegKzgvaOBnZLCmMjUyQAR1VrnhPPdUCqtHDeO3EgVM5e1N5Ga8PzN2CsVw2g/KCuXLEentjJtnw/P9v2X/zTS94XbguSzK2taZ5RVErCCG6y6LKqxjFXQPFQPWjpXg2Tz9LZ1lnze84H1sQA9v3f4X17y7VCw/XwZGvWZ3pVA1hK9QedetVlxbpFtLamyXQ0Mojfa3PGIY6puCdP0vXIf//dtL/yPRSzByngU5wBGtqaSRzi/cP37cIefJaO130YHBupcID2Jn8R1J3uYCA7TF7OsLwpRXEoy+rjOtix1c8mWLk8kqLM+n4HxCIi41g0JBpRFJl7+x9gUXMHjuSQkCT0urqK91kvvpLx31i0nvUylMQcxyvkqSbv/RF6xzKSKzcyfM8d2HsfpumSt6DWlVmcdsy/f2LJ8vE9YXp4xax/T1dFQi1pjUGgsTVNfneBlvp6WlvTtLv+uWhOp8CxSTU10TjH+QyWR3PdQ5mODkaBhpiF3jx3HTugxy9r72Z/ZBLKyjZpwBa3z1BueMH3K8xzEpqYmGDVKj/kCx50SZKOaDD6Y8f4eBZX5NNHI8XlRF2aSSDumIyOZhjbP4iSaOK06z9PESiOzjZCswNlBFMlN+NHTq4tMzqaQYu1AM+iSgqT43kU4vzjhr+nN93NaK3PMitXN1OqwejgOM7Yfgq3fIr4Je8JUzZRjIz7D4PsebS2NdT8bJAh8vrYxL7w58n8FLqsMTY2f8fRWigIFYEn+59mkb4YVdXJzWRwxH7HBso9EKOjGRxFwRPsuJHJInU1jjt70zuREg0kL/soAOaOu/jIwK8oCWUGKyszas3PoC6K+iWnw4G7wt+1ZNmc8A9T+9h1YD/N8crFzehohkzJodA3Riswk7fmONdllBoXodsZDOGF7trxw75nLrjTOQp7fcFKdeWZxM68gvgT32CmVAo/03RM+rODFByvQs6pQXXxXBcnn8eUNEZHM6F9Qk97/ZzHZLs2WweeYnXJxS3lmS6pyMs3o89kMJ/4FQAzecgd4juZUgx7cojR334fKd2CM7Qbe4tP59YlgyajgX1jAywVq/vJmRKSIADMTMwgOc6s43tmIEMvkHctDGJcuuql/NtjX+euZx/AdC1aO1ajrnlt1ftSKBdcw0QOyNU+XndmBHein8I9PwR8xWqnez3sepCxoTGUUjlbkBEKAxNTmfJ+FAVDpGCDNFcwCQ0MTCIBewd9sz43ZzN8oJ+iJcJWoYKSt1XsOc6nfuorocb5CGB7SaR0CxPDEyju3HR/R0R1dgGUSAakZEikC+CIHrwNbesYHc0gy1LF4n2+mFc6bu3atdx8880Vr/3yl79k3bq5u8APh87OToaHh8P+I8dxGBkZobOz85hsOxIEBU4ABGMrSBEtTrh0Lq2RyoogdtaVpK+6EaVtGabInesRtgv4UvABljcsmZNtUt3rUrDyZG94G4VbPgUwZ+49HyFXNDbPfeNFMb33ofDnjJULjdWOBIaiIyHx4OAf+OD9n0RS9QqPk6h2HEAsEaNe8x+Gno7ZxVbPc/HyU7hj+8qvZUYrkpSpBTL60kJl+7TpAm/tn0SPpG5cSeLpke0135dMxmhPiTpWT21PqShMx0JXNFZq9azMl0in5k8lr4aUaglrKnKiAclIktAS5CLpuHv6H+Bzj36FhvrKqFkyS+Sns+B5TJj+/dIvakK6NvdQsWviGfJ2gXVZE23VOShNPUh6vNxUSyWNuOZxi1qrM/wM9p4HkJKNxIvBs+LT60cL4/SJZuac6dHa4t/Hhmsh12gdOG6JSEHrLgktznGNy7l85csZyA0xVhj378XDaKjVgv3coxTuuD783Z0ZhaB3LGKtAOUaalT2qr4ugWILsoQi85HTr6U55kckU9P++z+/zZcHUx+/jdx33kFKkGLqJEHMiM2t/mGc/DKMU/5izu1q5ypSr/ssSusSir/7FsUHaivfBC0auqzhRs5TUfd/thWJt617QygptlDM6wp84AMf4Itf/CJXXnkl+XyeN7/5zVx//fX88z//84J33NzczJo1a7j11lsBuPXWW1mzZg1NTU3HZNuRYElvObx2Y/5A9Nw+nzZcGhvDaD50E+VkcYqf7P4FjutgB41vqSA68lcrZ3bOz58pyvCKSyqFUtVqZw4Zn4728iQ3H1tsgFyVRpx2GKmP+aCaoeZosYoO9USyamDUtLJ2nDI7cPdE57fS5Stqu5lR3OwE9ZHUvFIjbz4fJGf8a9zuKRzXuhbw+FjbhXy02TdzzE7MdjkF0GM6mrgO86kJlaYHUM0Cx6+7jHec835Ufe4B5nCQFBW52WeZqctPxZ0ZITk5zEzEfvnAzEE8PCaLpbDvBuDgwXEyE37hfkY4vy7u9QfyfH5uv6ldE8+gyxorZrJQgzYOgHG4SahyBe0O70ESg6Ou6LQkmhnLj6OI8ynrWthzozomDfXl+pHrudy4/fuYmn/MeUwSYiFyQnNZeV0ZeBp732OHPK6aiHjyyI3d4LkU7/o6AF6pchIK9OWi7DhJVSFo/tc02hKtNOj+eNCcEOxXUSuKFX1yUMPMONdufDsnNa9BW3Uucv2RLawBPNfFevoerG23Yx98atb2gPykKzpqRLevKMRbHRk6kx3Pi3VaC/NKxy1fvpzbbruNu+66i82bN9PZ2cnmzZtJJuf3sHz84x/njjvuYGxsjDe+8Y00NDTwy1/+ko9+9KO8733v4ytf+Qp1dXV85jNlYb1jsW2hiCdjZPAHRF3Ibsh2ybfFnpkhlzx0IfkHj/wHT1kTHDczQ9MqvyBviFX1GZ2bGMmPcm7PGYf6iApISHh4NGlp+r1JbITbo6rjZmuTMJSItMye4fwsheRayNlVD9T8yZSHRFSKpT+msdQqT0LVg/Z00SMpos6s6aJbJQr/8xWMjZehtCzGERFQZsMlOKN74WcfA6CwvJ1azZzPBynBgGw+8RISK/3mxeYTtuAUZpDvv5vcHMZxlifjzuSQ8R1ADxd3moVpVLuIpGhI9QsTgYxC6VjpS+U0duNODZKcGibTWM7ZH8z6vW2O4uKoOrJYBCQlm7QsBDSP8we5eMIgB4xN5ZjNxfOxP9NHb6oL1emfNZmoK07HGdmLfAiVB2CWpQdALJeBprRoNG4mZ+fp6qzD3DNCKhVnSEyYnmlW3DeTxWkeGX6MjskWlgF5z6RLMO2a443IkozruagTA7jN83PPrTjWgCTwlx9CbujCGXm2vFFRKT38E6S6VvTV54U9Q5Zj8fv+h1BkBSVjEsT0npAiSgulkLjikaNcK2q66Bq4+XPYzzzAknP+BgD1vNnU/OcLa/d9FO/+z/B3t6pXDQjVJTRZq9AKLOoihaiqNMWOXDXnkJPQr371KzZt2kRrayvxeJyXvvSlC9rJBz/4QT74wQ/Oen358uX8+Mc/rvmeY7FtociLRYyrqD61WVHoSquM7fVJCbnEoVMunlkECUqlHKWMf7E1UTRd2biMf9r49ud1PJqiYTomjUY9/eYkRUWi9aJrcGNJ1EQjnpmflf5wIjdRb++hI7cA+SqGnjYPE7nni32di1nZWGYiOdV1xsjgYiPhFWdwDjyBGUsT3/wWlK41aGdcwRf2/ITVjSu4HLAkX+PtpJa1bK6yXXg+WJrq4vx9v+f4DZU1NjmWJqGnKDbUli8az1rErDxJwJnHxG15DtoCvVhqQe1agzve5zdeanHStovpOfzg6Z9xasd6RvJ+H5Ip2b57cDAJyQ521o9+FSGZVLQFTbeudk+M4zr0Zfo5p/sMUm9666zt2qpzURedfPhjXry+4ncp2Ug8NwmkUUb20Zb0Kd+mSLTeduAumsw4QeJyeLpE0Jo5bfp1xfGSP3Hacrm/RpZk0lqSaTPjs+NiC2BOClkeFB13ahBrh183TF75ReREA6UHvgeKjr76PGRJRpX9ps5f7bsTgLdEJHcUXSh9Cybn9HQOlXL/UDLRjNy6FDcw16tBwlkIpLrKxY5XJVUUha7ouJH7eLhJY9GQiZ5IHXEUBIeZhK6//noOHDjAokWL2LhxI5s2bWLTpk2z+n3+3DGcMUkCOcsnZMhGDLdYoNGcYRhYcfLKQ75fdV1QwLJLFAb8OsKRdNtosorpmP4qJAPu6a9hf10dn3/sP7haXUrvrodIvfkbSNG0WySF0NI6PwfEglMCBZKOR06R0A+T13++aIo1MpRMokVMuJSqSKi5OU1x2p+4mxpTSKlGkJRQ70tONNA3+SwZO8+2id28onlRKDF0Yutajmucy1rw8FBllS0TObSJAYhYJEiSREKLU4jUWRZ/7BOhk25LUxJv1B/Me7sOv1K0cDGOwsMcHveik1AX+d4uXjEb2lLc2/8A9/b7GoGarJJtczmuaxG5x7YCvmVG337/XGc9jQQwkTXRAduqnYodyA1juTaL63r9+l71sdQgydSE56Gd8CJflmhyAO34C/Ae+SlxWUOfGKTjwZuhXWHv+BTLgF/3/454ySWY9rSIZM+0aEhVk/4E6igSyUjPUUpPMW1mMLxKivZ8EURCpQe/jzsz6ruvqnrYICrF6/DscvpSkzUeHy2nu1qaUxSEfqgsGv7zohE7lylQT7l/SHnyDrRlm1B6/etpPvlrzEd+SuqNXw2PYyFQO1aSeOUnACjc/kXczKEmIa1CXWPn0hhPrYzTrh9Zf1CAQ975t99+O/fccw/vfOc7icVi3HDDDbzoRS/i/PPP59prrz3qEccfE9yZssrsoi6/ppQU8iw5V2bv/jGs4SEkRSHWeujkliLC2rxdKDs6HsGAHggnNgpm1s78AN94yvd2enBiB8AsVWI9pod8fusQyttRmG1L0CSFVNC1HZsfoeFw6Ei2IyHRlWxnMDuEW5hhsjjFYyPbQpX2AFKkkVZSVZzBXaCoeMUs5o7fYj71G57x/LRZ0SmyJz/EtHAQbahhjf68EFhSTw3O2hQvFshMHgx/N7q60Vr9yCgWN0AI3taqY1XD8jy0o5TqnAU9Ttqp7F2JKQYnt67j7pPjdP1dOQp3CgWmx3zFA1ekb1sa/ZS7XGV653ouP9/zK27Y/l0kJBZ7BsXf3xQ6kT5fSJpB7MwrUIXJodzoT/pvajyFcybzJFyXjkQbxHwFdk+WsCMK6VE7jaAhNSvo9bYshTUhgJRQD9FcDxYQCSlty9A3vRKnfwdByleuayN/83XkfvwB//XI86fLaoW5ohVRog7u74AgUR/z1c0Dtpy643egaCiBzmJuArTYEU1A4fdo6kZp6kZONeNm/evmZidmeUvpskYsQhhyRELEUI6sZzDAYZ+Q1tZWLr74Yi6+2Nd3mp6e5kc/+hE33ngjt956K6961auOyoH8scE+uAN1tT+5BMrOhrA58HQD3bXo27EXo67xsMXnQOU36xRJ2YFO3MJVZ+v0NFOlaVJxPw34s0y5X+vZuI624S+E/W8ZsiwjaRqeabJ3OM+hEiT20G6U9pUUjTgxLY6ipSA3RGfDokO8a/74503/gOt5/PK5O9g5vovMz6/jVyefxv2DD3PdmZVkl8FpkyCWyP/PV5FG/UY8a88DsOtulN4TeTZRpNm0GddVtqd0HhINr40L9LwPoK44HcOx0FbOTunFSgVySu1ifdEhLDyPZS2qK6d5K894cZLetD+wWJKHPodq+pFCkhXSkSjglSsvZWP7ydzVd5/P2IqkdSSgJ+ZwEGht9xc4IhtHroqY0J8d5DcH7gZ8e/SGfIbi9jvR1px3RMerrToHdfEGJD2GcfrrOK5tKQXnFygtS1hW342n7wVRR3Eik5AUSTcHkVDWLYm/q2SVBpOQrMUOyTKbC1IshdK6xP+Mxm6czBja8RdgPvpzPGGcv3M2AAAgAElEQVSz4EVYctVq2wenswRtrqqInlNijNFxKSoSSBKbmo7H2HM3XimHuet3aCvOwMtNIiePjGhVDXXxybj5KTwzT+57/4i68kziQu08OP4KryZxzxytSeiwyy/P89ixYwff/va3ueaaa7jkkku47bbbuPjii/n85z9/VA7ijxHuRFkTLrCxCf5vaqmjLSFjTYyT0Q7fpGWLGy2frA8jIe0IlAfeeuJf8bKlL2ZxfXlSOLPzVF7bez5TmsK+nuU132eJgW7xormtGDzXoXDrv2A+cRv5zDBxSWMg5xdvqz2CFopA8LAj2Y4DTGCyc8JvaoymLQCUqDLykD8Bya1LQdQx4hddzbhXortkE5dUtkXEZptih6dHHwqSJKOvPq9mNJOQNA7KFt/Y9p0Kkz+A4ZnIgK3MrqN9+bGv8+lHrg8Lv3Y8Taxr7g79I0X7Kz4W/ry55yzSegpd0XA9F8dzGF5xCu4qX9zVGvdXxLKoCTWt8tOZXWedXvGZfRk/5fnSJRdx6fKLw8h7IemtKOREQ7g619dtQe04jvRVNxLf8g+0J1sxJScs2jtymXqyfzQfSuMENaHRRpXRRIKZlFI5CQn2oX3qZSgNh7c0qIZnFbGE0Z0s3q90rYZIdsMr5UPZm4CmvTgt9Br1cpowUE4Jaiu5bAFHklic7uWvus9DAtyJg5TuuQEvN4Gbm/RT0kcR+rqXEDv9tdj9fhbFfuZ+PNdlWb3PslRkpYJFGeAFmYSuuuoqzjnnHD71qU8xOTnJq1/9an7961/z3//933zwgx8Mo6M/R2QmDoQ/TwndtcEZ/yaXjThusUhbUmHFitkGXwHcmVE818Zu9S9mob6lwrJ3oWiKNXLx0osqZE1ObjuB05ZdRINRzy+2/4ji1l/Mel/R8y93U+vcaSrPzINrM7L1J2SGdxMzy+SEFQ1z8aMWhi5hB7xNd5kUNtqPj2xjKt7IyDpf/6wrQi1HVZCbe0m+4iNox1/g04GFCnmd7ZJCCc3nPnPOR0KHy2OBpFjdPj66rcIsDaCzrXx+21tmn+t9Wd9OY0oIoVqudUT3w+GQiqhyBwXtgDpsOhbnvO8aus71o72BPX3YmhGmhxJdXaz46tdpObsyGuzLDBBTDC5eehG6ooU6gwsq9M8Bd3q4Ir1nKDqOImFJHs2xRn9FLsRjLT3Hu373AYp2kenSDLIkM1mv8tRbTqOkyxU6dOd0n4EsyZzYsmbWPucDr5TDFtblsmAzepmxsHlWXXEG8Ze+O/z7IBJqTTST1lIo4rF11LIxXl5o4lmlEo4sEVON8JzKQg3bzU3iZSdmZTmOBjzPQ11yCvoGv7/IGdjJ35/0Zj50mv89ahFsjlTMOMAhJ6F9+/ah6zo9PT0sWrSIxYsXk0odvZvsjxm/idu4IrTuEINKb6c/IA5kbEaGp3BLJZRY7bSaZ+bJ/eBarG13UBSr9qyZxe30SQxHY4CMRyah5lgjuqJx4aJz2S+ZjI7snvX3DY3+tbNkFc9zsfY8gFtlZ0wpx90NCT69pIU9CZ24rHHNyW/lyjWvnuU7f6ToTHagI3O3YF6tb1vH/pk+Nlz/r5z9DuF2GakJKR0rMc7wG+Nc8TAW7AImLs2L1pMUjENZko9YVPFwSCjl6x7N9wMkosZ86uxIKGj6nZju4/t/+AY5K4889fypwvOFvdVvNO9KlhdMwQp8rDhO3ipwcNqP5grDo5RElL515En6MgMh4SKKvkw/3amucAXvFbOgGpVkmCNE/pZPkfvBtWS+/gZyP/v/0GWdp5bHeXB9PZ3Jdp9qLRYdRcVPfz04+CjTpRnahPHieNFvWYjaQnQm2/l850tJ//6HCzquaD1G7VmLuuIM5MZuvKIgRCxej9q1Jpzwg0kopSVpjNVTEmLAtlzeFtRC4wqgSMQUA080cQf1MS83ibb2AtRFlUzCI4W171Gy33or7tQg+rotALjjB4irMTrEQjGVmD3OHa1F3iEnoTvuuIMf/vCHnHvuuWzfvp1rrrmGc889l3e+853cdNNN7Ny586gcxB8jhgwNd7IfZ2w/Ss4nKSSE6rAaj2F4FoVsjqFM7ebQgG0ipVvIj+8DYHrkGSwtsOk98gE9Gg43xfw88epGf5LbUxieJaZoCYr10LRF6YHvU/zt17CeurPib+xill+3lBcacdlgddNKzujceMTHWw1d0Virt1BSZFbWL2VD2zpsz6E/WyYC7BdyQ0ggG0nUrjWYu36Hc+Bx1OWnhdL8zYtOISlKnGkteVSoo4dCIiKKOlk1CeWscn/SdLVKKGCIgWd8ZoD7ZnwjN7VwZHJIh4I73scHJjTefYrv/2X3PQmP+3I6//74f/Lfe26lXqhopK0sja3+YuubT93Epx/54uzP81z6swMsSkdYspJ0SMfXhUCK14NIabnjfWiKxnCLxrZlGobiW5cXgpSXoDrfffA+xouTdIrBM4iKpIl+rN2/Dz/bGd+PPbDA8UuwAPUNlyKlmolf8LfIqWbken+Sl4wE1p4HwxRl0Cyd0pLUG/VMi744S5bKE5QY5GXHxpF9B2Jt6UZSb/kWao+vVefmJjE2/AXqkqM7CUlaHByb4m++hDNxkPhL/wl1ZWXfYi1FihesJhQQEz70oQ9x8803c8stt7B27Vq++tWvctlllx2Vg/hjxIyq4DR0kv/Zxyje/Q0AJkRRqLunmbjkIFsWWac2X98TaYTi724I/exzMuT3PYomKUdlkIz2CgTpnM5kO0lZZ69UpPT771Qo5RYE77OzqzHMaQesmAD5fGWza/wosHAOhY0dGwA4bWSURbo/ke6fibDOBBkEiXJ/huhK19deFE4AdcUidcJILa0vXExxvtAEBRpgYqLS2mFgstx8W+vhjYm6yUCprGIwKc3DeGiBkJJNpHNToRKzufUW1Cl/YZWz8kyXZmjpFBI3pomSSIT1KvBtD2577n9CW/OR/Cima9GTLtdTYqe/luTl5drTUTnuiFU1rhOmEMFfhRuKAZo/wM+Y/jkfLYxjuRYb2/zrk7VyxCSVws8+SvHub4QLM88q+pbpC4GiEapYR57jxKXvJ33VjQAUf/sfOJN+3cwSz39SS9Jg1GMp/rX2NBld1Bud5x72/zctbMkLr5Uky0h6HLQY3sywTyDwals0LBRSXNjTTA3izYyg9pwQtkAEcLz/n9JxMJuYcPHFF3P99dfT29vLW986uzntzwUuHv3WFFKqCU+sRPYMCddII4aby6F4Diesrl3YdLNj3N6UZJ9iUxKNZ3lFIT89gGYfwwFHkljZfBy769JMP3035rbbw215UdFN1yWQe9ayO65TiuTc3alB8k4lCyqadjoWOGn5+fyDspi1fXtp1FKkZJ39U+VBvUekQBVdLqd6jAQuMDUzxLSYhPT/+Top78isG54fytHO4xNPs2uibE29uLv8ANdHrCl2Tuzme7t+GjYBHzDLk1CXsnCpnsNBSjVCKUfx/u/hTA3gzowQ6yh70JScEkq6fM7GSxL5iHvsHft+y63P3c6Dg34dpC/j17R605X9gtJR6hsJIEcnIbygng/4k1BcjSEZ/iRkyQ6ndZyCKimktCRrI/UeI6J56OXFOTeLfgSwAPiLPw+zRt0VIjp5YrEULEJTepJ6vQ5TqFLYMqjBxCoUC4JIyFAMrD0PUvz9dwBI/MWHkJsXk7vpnbiTs1sGjgRRAzwp1Ywzshdr9+8rJrtqxXU4eum4Q+aE3vrWt/L4449jWRbr1q3j1FNP5YorrmD9+vUYxrFdIf8xYOjAozwr53GSDsuAk1b74faBaZu0SAPIc9SEcjND3NWUJKfIlGSJdiXJsJNjezo2i7J5JFjfeiJ1Vf0wW5ZcwLaxndx2+kW84YS/DF/v6mzAHN+Pp8f5UU8bf9AG+MvlZ/Ci4Jh/9M9MGipEzOMSdUcuI3NIOBade7chty2HUpaWXI5RyiKswco11qhAEFWYBZ5KGnzvya+GA2Gd7RIf91eeL8QkdFrewx6Z4dF0nAPxPF96/Bt8+YJ/AXypmyAWCmpCI/kx/v3x/6z4jP05fzC5YnCa9avOPGbHGlB6rafuwHrqDgC0Yg7EGFxyTKREEg9/fV+QtdCkDsDy/EVT8Fpfph9VVv2+HaD44A/xchPELnjbUVXWr3YH1ZxyalOXNWKqgSWW0bbk0plsDwk7mqyiySqWa1dMXm52AjnVjGcVYA7bk/lAbl6MO36g5rbAdt3NTVB88AeUCv7El9ISlIw6RuWgX89DlzU/Kou835El4koMp+9pnwBx1l+hNHXjHHzS3/dRZsdFGY1yqgVz+51Y225HevRnJF/liwwnRLow6vP4gvQJbdq0ib/7u7/jxBNPRJvDffPPFTIw8Ox9PJvWKZn9LAOSaeH3XldO9wxlLGp1z4x1LIV92xjTFExZ5sREFzOFg+TsAm1HaFoWxVtO/KtZry1K97C59yzu6ruPvyxN0yD6ZSaLLkmggMTWEf+GHsyVm3KlVDN51ycqNBj1TJWmSabnozK3cNj7HgWr6PdeNPWgVykRPLP9OVoAvUkBRcdyLL5RfAYt5S+C+jL9pJU4KhAffAY66hfspPp8YHSs5HRT4w5t9goxa5ZHPdP1H7JdI7MFIoMVcpuaQFlAv8p8IaXLqtzq4vW4uUmUiX7o9hcvRaeEoig4Rhy1VGD5sg6y0UlIUJ8DG/K+7ADdyU4UWcHzPOxnH0JpWXzUrV3U5afiTg3g5qeQhGFeAEPRiSkxCq5LA77CQINRz6aO9ZG/MbBcG8N1kWJpvGIGLzsGrESK1VX0Fj1fyPVt4NTuEwsmIfvAEzh9T1Ja0gyqQlJL4rhuSDG3FL827GbGK3zhXNk3sfOKmZBtaPfvoPTwT0CLwQIjuLlQYcqYakQO7hfbFKlHUMT/TiR39oKk46666io2bNjwv24CAqiXDMZkhxlFZlJIl/eLXH/v4nKfTSkyj3uuG7LNRmP+BRoy/O3JWD0nCzMs9yjndGvh3O4z8DyXex/4eviaE4gpju0Kj2FgaDuO6InSjj+fglilNRoiDXYM9OKiCBSf9ZN8XUJDVjEj3flLX/9aRtdvZtXH/ovY6a9hMDfMjmwfexr91f2ZnZt4RffZACRF2uWFiITk+g5Sf/0lXuSIxkevPPEMROzgFfHs7BrYSp1d/l5qJEXUevF70E94EccKasdxaKvPRYrXEd/yDyQv+yixliXh9pKwkk80BlJICXJWxNpdqKmbjoXnefRl+ulJdVC4498o3f9dvNzELO23owGleRHxF7+D5F9+mMSl78eIROWa4kdCrhDTdGQpXGwFCAZJw3GRRXOpOzOKM9lP/MK3Ed+88HKCvfeRmkoaQNgvpC3bROz8qzADHTgtQb1RF+rCOYqE1LcNe+/DyJFoLSAmuPkpJEHHtvdtBddBTh6ZqeRc0E7cgpRuQZLVUExWO+7scF9BOi7aIPyCERP+t6JFr2NUU8moCqaikNNijEr+zRWIOwKsWlmmvVrbbif3X9fgZkYZGPYbv4K+lXhTL+d0+w1/Y8Ujsxuf1/HHm2lFpz9bpv6akooHZERPTlLWGXHzOGN+WmEiM8SA4Q+agTpu0SlxLKE0dpG+6kbUTr9GockqVmSS7ly5mLOufgNKkNYq+DUs305a44o1r2JTi99omRSDfN0LQEwIcLbRyUXjWVxJCif2pT3+BOnpGv/9xH/ieR7PFIZZWVbzZ2mxvIpOKseWTg5+z40cGcSNVGQhFVhpCNv34bxXkY4bFoKnBbvIRHGSgl2gN9mBZ5tY2+9ESregLtlw1I/Zs0vY+x8LrcGjxIQgEhKOE7gy1FelpYPifsxIo/auI/HKj+NODVD4xafCHpxjAUmWMc54Pdqqc5CSTbSZfhrRJybUhbI3tiIhD+3B3HozUkTb0ZUlDMXAy036VtyUSRq11MaPBmJnvI7ka/10srp0I9qJW7D7t2MLZ1zFDewbjv4kdGy0Qv4M0FLfw/2TT4e/N//9pZy09iUAjEas2ZVYLFy32/2+OKlnFhg4uBWS5RvLUAwW1/Wiymq5c/oYI6UYZKUsnuciSTLHb1zDVG6IGdEkuaJ+CU9M7mYyM0Sba/Nxazc0+hPs5t6zeXTkiZDy/ULBkDVMySfEPDu9jyV1vSiOw8jN38JZdCqjVplIETKIkg3ENr+Vzru/waVqF+taj536QDVi576J5MPfhOJzFMw8SSNFPK6TA6YMl/sKfVyQHSIveSxJL2KbeQBTllkmp3kGfyJS4sc+cnMGn/aVJgR0PQliUjRdC9dzeW7aoRuwtVjFJDSU94vmGSsTKiX0NiwmfvHZeNPDSHUtYaPm0YSXm6Jwu28ep/ScgBchKuiyTkw1MEUI4cgScdEL5Nklst/6W/Tj/YVNvH0F+vF+pKmfuIX8ngfJfvtqjLP/Gv34CxZ0bPFLP4B0CJ8q/cQXAz5Z4w0DU0yc5ffZKZIcDuS2AkZQW454armymHAlCTnlL2hkUR9Tl83Pd2whCJh+kqKirT4Xa9vteNPDeI3dGI119LdqPHRiMrSS+b9I6BijNV1ZkM+UpsKGsmRT+WGYjAYKjoXcvgIvM86QrtIYqU3ERGrgs+d+jH9YfxUvBFJKjJwsg6BpN5x/AUs+eh3TeX8SWtniP6RD2aEKMy7Dg2X1i/nyBf9CV2puRYhjgXjHKkxN57u7fsIXtn6Vb277Do5ZIPvUPbgzI4wWymq/waAjaTHUlWciSxKb473h6y8EJFUn2e2nWb+543v8YfhxMkIROR/z75fHDvoOtd1NyzAEg295Vzl9dSwG8GokXvkJ4i95V/h7tYCu6Zi0dfnR0fLl7eSsPFLQoyMivJlSlr7sALIk01408aaHkBs6jtnxV1C0ZRU54hqsKzoxNRZOQq5cZmu5M37kpglTwlikdiG3LA6dZ718ZX/X84HasRKl7fAKInJzLx1v+iZr1/jqMrIkh6ktW5FInXElUrIJOcK2dCUJQ9VJvvZfMTZdDpTPxXz2eTQQMPyKv/sm2e+8A1XV+cmLGunr0EmJbdGakDszgrvAhuv/m4TmQFey0rlwJlEOgxtbIsQCvbwa2FkY5gvpIgcf/h7TmsIpbSchCd5Lu+jg1mR1wU6fzxcpLUlekWcpak8LN9bA5mCoNBHSSQGOHYH88ND1JKZr8cDgIzRZDk+O76Q/4/cNSYrGSL4cCcVFGsvzXJyh3SRe8dGwtvRCIi5WqU9P7uGG7d9jSGjHmcKBcuvwEwB0ta0mJgq86Z51L+gxKk3dFcZyyaoIoOiUaO/x71E5niBrZkk6HsmIsOr+TB8PDT5Kd7ID76EfU/jdN4/pMQd9PHJDpz/4Tg+jihql9MyD6JODYWrLkaWwAVxu7EZKNoYiwdKOu0IHVUmSkUQPjHQE7Lh5fwdJnmUhLgmpIUeR0ON1JC55T0VfjqOAfedXsfc8UH6PICi4YgF5rBH1I1PalofmfAB1wvY+mPTtg0+Rv+3zFH7zpQXt6/8moTkQyH4EyCbLk5AcqQl1dor8fynHvQmPQUx+mPSH8TWtx/OJsz7AF8/7BO3JY8syq4WUkSavSDh2JYunIL5LR6KNhCczLNmYQnIEYI7+2xcEWqGcq19cEPbMQZFc0RgtRCahSMRTuOVT2Pv+X3tnGh1Vna7739675lSlMpCEDIxBQhQQBEFBxAbRRhBaWwRpezg9OCxRr0N7GBSEPjSi3l62yum2G5b0sr2wFESWXIVzaJprq42AzIQWIjMJIWSuJJUa9r4fdlWlEqYkVGpXOP/fp5A95Kmiar//4X2fd1fMa1XagrWpscW/zzWGCg+t+ht5Rq0n1eLC2a0P4yS9oWCaI51ntVx+3XB1Tt8dRbE6WzxYVv1rLadC+1TVAZn6plocqkqS1DIpyRv0MrPgfoIVJ1HS8uhsHA/8BvuUuZH27eHuvtJ321G+/aq5nYMiRwrAJUlCyboOS6idhjUQaNFPK5L6HeMss4uhqUG8//gLgRPNbcTDySoBRUI6dQA5pTtE7dcFZQml9jzev/8pMquTu/XCPPAulMyLmxPHHJMFwgHf4W6RoJQWCphWxYLmb6Lx09fRas5i6nfLRW91JUQQugSmqNmKWTZTXX+exs3/SbCsGDnazyyUBYfZTiCUgXPSrh/Pc+XgtiZHTArjTXJ6H1RJwnNqL8Hy45Hfe1MzSDI7UGSF7JSenE/rTm3DpZtaxRNT1KwtPbM/AN6QLX6DpOGJytqyhUe6oYePL+SRFm+sjS03uWsb9NfQaG/+DGW7cpBkhVuyh/FK8TmSZAv545+m9+R5cdUaRq09F/GwAzhQ8S++s3vxSSbOmGsprj2BI6jiqG+5ZDXtuqnk1NWCrxElb1Cn61TSeiDbXChZ+UiujEitkEXTsKpaJAhJsoxn9b/rnohHviJw5iDWkJeg3kG1eRBpuWG8fk08BiySjP9fWwmWNbcAD7d+CSogn9Gtg0wFd0SOqxKYw9mWoVmUJJuwjZp5gZNBp8mWJJRcPfAHju5AK/46cizNHg5CVjBZcExbjHXUj7AMurtDf0sEocvQJ1lPH04JBKk8+k/+UbGf0g2/jRibAmghc0dNghJvBQOj2h1EuxcbQfjvV+1eR8O6lwmUfoumBqj2VERqabonZVJWX0Z9HDbH24I1anSaEsnQ8yE7kqnQ9JFt2Jw0nns/l8NmbZmx5Ai5rntCiSl9G3yMs+qzBsuAsbgeWRlTt+mOoHoqMLeaIZsGdef2Nf+H3U1FqKrKHVUNOIL6w7Bfg49HXYMZmT0Mf/HXYLZj6tH5QSiMJMnYRv8IS2iJzqJqpEx4snkmpPp1W5vK0/iLtyE703EO0HsbWVUtYk0DIGf0Rs7oG1mW61zdEpjtaH4vgZP7CJwpIkjznlDYSNYe1bJEVaRIEGpdsBtP7Hc9FflZjmrgeHe/sUy7bioOs10PVqm5WAZOuGhn3baQENlx48aNw2KxRFwYnn/+ecaMGcOePXuYP38+TU1N5Obm8tprr5Geri9ndPRYe3hq6CM0BZtY9vkSSkw+9mW4WJ/hYsl32yLnmGxWtLomSveupynoY3DGDYzJvRW/auTOik5SyA35pM1MqtlF8OwR8DVSfmw3Sel6iW0mFjyBBoq3rQS3wsjuw7g5K/Y1H20lOgglV5wFBXw2B/smPsTag58B0Cu5B4cqD7cMQrKCqUd891nCtA5C3xQ6yCo3cyzfzQhfE/eXnMMxKn4Ze21BstixRM2EAGp9dSgmhcqmanq7ezE45RaKjm0EIDkQpMCkP7SDZw5g6jm4ww+djmLqOQTr2a3gaSB5wlNIVheB8GRTMYMGwTNFaLXnkNPymuuE1JZtvJWUHJLumx833ZLZRvDMQfwHdbNgU2iGH1AkLOGMvnPFEdeEoATW5BySJv97mzrzdhpBP6a+I1ArTyN7qsCpf857p/bArerPU/93X6M11l5VnVvCzITefPNN1q9fz/r16xkzZgyqqvLrX/+a+fPns2nTJoYPH87rr78O0OFj7cWimHFZnNhlE1VRlfHfRPmBybLMmU9+Q/G/dDuUHs5cBnYrZGhm/EaJl8IZasf9YVYyC/MclOYPxnd0O+UWM+kuPfGiMHc4CjIfu/XXN6nPBArT+xumOTprKy1Xfw8b68/z173raAx5roWtemxRQcj5i+XY7noyjkqbsUdt+I+saaDKbcLz9H14TAGSeg4laeb/jsv+SXuQzLbmJZ8QtT49YaXKW02qPRVT7vU4Qq3BrUiR2hrHfS9jHRH/jspawIc5JNme1Q95339HZkKyw4Xk7o7/2E7U2jIkezLyof8HQFLeIEMf5pLF1qKw1SyHmhkqEvbQzC5QHeXhKEtY7K4WiSRG0PT1h6CpmAffjSmq5Xd4q8K3fxPev/0Bf9GWq/o7CROEWnPgwAGsVivDh+stBGbMmMHGjRuv6lhHscsWglFVyl+WNK+P1nmqWOJq4IOsZJJQWjgLG020m7RJNrPiwPucrT+HR5EiDepyXTnMKLgvcl48Cz0vhjUqrd2d3B1Z02hs5dHltuhfzuiZkCRJLRyN44ktqkjyobsWIWka9af34fV7MVWWIDvbPwvvdMz6TEiKCkR1Pg++gA+Pv54Un5/A0R04Qt59St4grMP0hmeyw91s7RJHgmcPYwrtbSqVJZhOF0Uq+C02C7ZRMzH3HgaahqnXEMwhp3DXjZPjrjWa8H6UZcSDSPZkpJANUlABW2hp2RTVd0qT9cQRo9G8dajVpcgp2ZiiPic12zegaSpNO9cBoORe3Sw/YYLQ888/z7333svLL79MbW0tpaWl5OQ0P9DT0tJQVZXq6uoOH+so9qiirNsybqS0vgxPil7J/M1//WfkWL49q9P72LSH8J6Q2+LiB9m3Uumt4huvPiLLT2kuXLwlp7kAzqgkijDWKK86hyMdi6rR2FCFJao3kiO0ZGfrZIfvtiJbm/f+TI4ULBp4/A1okoS1k1thdBTJYsOsgTPY/L7W+eqoCBUyO08V4SvaQlKPIQA0lR1GMtvwH/uGpj3/N9K6Or6aHZjDgfPoTmy25MhMKFhzDlRVL8x2pKDk3oAztJ8V3drbCBz3zsH1yEqsQ+4h6eHf40/PIyhBnUMh+dYfAc0ZcwCYTNjGPWaQ2mYCx79BrTqDZE3CnNpcYF/x3+/i3/9f4PdiHfUjrLc+dFV/JyH2hN5//32ys7Px+XwsXryYRYsWMWFC53lptYX09OaRSFpGHpToqZI3ZPbmi/K9pPzyewwZ/kPeW/UMhJ5Btw26k4wMY2cSrZl7+5P0TevJoWM74BQcSrLilEwM7NW3hQfVb8f/mrOecsP1N5ibHYKze/bEtkPDq3nxKxI2xcKsW/4tUmeVlZZiuN7WZGa6sWng0fQq5uQkV8JpBNA0JwXdB+A+fZBvkvWgXuevp7xez5JMrixFQiFj0GjY/h0BfxPatpUETv0LSZLJnDAj7pr9SoyYGTwAABXeSURBVAZmTcOsabjS01EaUgnU6hZYMkFSMtOwDx+DNn4akqwwQDPz+OlK0v1/IePh2PY6ag9a0E+grgpTcjqSrJDSI4MV93Uj4LCQk6MPukqdSYR7HKuSQmb32Lfwbi8eix3N10hWfj98mc/Apv+IHEtyWrGP/iGuG0dhTr26BI+ECELZ2fr+hMViYebMmTz++OP85Cc/oaSkJHJOZWUlsiyTkpJCdnZ2h461h4oKD2po41axNY/O3RZd69macqpLznCcJnJM6Tx68xOk29IoL6+76P2MItfUg6ZaDS2ojwbPWUz0c2Zw/nzLAlY3GbiTMgzXX9/QvPZcWadis7upDqpoWgP39BhLH2s+JZ6zSEiY/XbD9bamvLwOiyZRE2jSv11BJeE0hpk46McEkvfwzWk9tV3VVI5X61lQKX4VLeCnoUrXHpDAs28rktWJbcIThrwmtVHDHlSxBzUaAiaCijPiPi0jURtw4InSJZkd9Kr1EMBi6P+B94v38Bf9DduEWUiKGd/hb2i0yTg1KN23E1N2AY2BKCdrApTu3Y4pp/Ayd+187FNfJFh6mPOVjdQ2tPSQ9Dp7ofTtS3UACL23siy1GLy3FcPXjhoaGqir01+Epml8+umnFBYWMnDgQLxeLzt36o20Vq9ezfe/r3u3dfRYR7GFssxkTSMrtOdT3VSL99Q+TtjM9EnpSzd7eqe428aKJIe+L6FJkNrZPYKuAkvUcqAkSdgdaVRK+pKRM7RflePszpLbXqKnK3E2+ydUeJga+jJakPAQqmcxxb94tq34Dv0d0Fh609NMP6vXA31XeQKAzBEzsN3xK/p/u5OBHi8TK/RBi+3upwx7OEpWB9+rauDHZ2uQrEnIzlQ8bhNlqSZ8SVKkhUKYSGGnxdjluMCJXQDIrgy0gA/Fo8/erE1e1Brd6sbad0TkfIkgaqjJnZEoqblYrv8eAIEv/growT77Ry8j2ZwtSlWuBsNnQhUVFTz55JMEg0FUVSU/P58FCxYgyzKvvvoqCxYsaJFqDXT4WEexenQXX7uqYTPZsKlQ46+nqGQXTYrMjTnDr+5NiAPOqPYGyXGoFO8orbs1WjWoUvWsOGdUAkB8uqe2nQmaGylkNmmzp1DmrwY07J3cj+lq8G1fA4Dzlytwhzztis8fxRkIYgLM/UdjrTjJw0e/wVz4Pay3TO94S+wYIMkm0vvegvvIV0jWJKzD70cLHGX1RBPDahv1XjtR2Mc9St2J3UhWY4MQYTshVzeQ5UiGn0XTIt1dTabowRcXBFSjUfw+MIFFsWLvPYiyPz6L5HDjmPjsVd/b8CDUo0cPPv7444seu+mmm/jkk09ieqwjOEIPPFtoE9ctmalRYL8riaTGOgakxddpuiM4ogKPw3fxZlyJgKVV11lzdRmh2j6c1sTbWwmT9OCSyM/25CwCFfrAxeaOrwFsR/As/wUpJhlwUd5YRV5ARXbq2W9yqJ+Nqc8wQwNQGNuYn6HeeE8k4zDspJ6UlnvBSoSmBvWGiQY/0B0TnyVw+oA+e1NMkfosRWv2x9POn4icL0ktvdsSAVPIZy9LcXB0sW6qau52e2zuHZO7XOPYQymW9tCHJy29D7WBRvzBJgqzCuJmSHo1yJKMXTbTqPpJcRi/6XkpWr+XNsUCoWbZRjtQtJXoQGqRusZXzB1QkTXdMsYdCCIl6zM4KdQavIWjtYFongpAQrLYCVadwVJdBjK48y/sZ+TbswEAJdSryijklGwsKfpesmSyYg57skGkxbjsa7Z+ClilhAtCTquLh84FyK+PCpYx+kwYvifUFXDY9DfbEWrv4LYmU+OtodZbTYrB6Z/tIWxGmeKMf41HR7FFLc8ldZEgZC5v/qJafI2XOdNYHPe9jH3yvwP6ZDM1oO9jpQRU5GTdwDe8lKVWnDJEY2vq17xEw5p5aGoAVBVLg74v0XoZF4CAHyQZJXvAhccMxBoK8ArNwUaOGrjUp5ji4vDdLixJ3FhZiTPKrDfc9fVqEUGoDThCHmaO0AgmuaGemqYa6gON2GurjJTWLmwhM8rU5IwrnGks9/WbxFND9J5L1lBSiEmSY9ZEq7OxRncATeAlRCWjdyTJwNRrKBlpeu1YimyNWPIoWddh6jMcpXuCLDlH7LBkJLsLW2h1ounA5xeea7KApoKv4cJjBuIcci8Ajh6FyKm6+4cS9ZmRrh+BnGDLuErIby8aMROKI2FvMHso0ynN5ECTJDRJIiVOrraxwBmeycVoBNNZ3NlzLAVpeq8jU5b+8BuSPTChsw+jiQ6W1k5qxxxLnL96F9tdT9EtWc/87NazOdFGMluxT5iF7EqsgYsky0g2F9ZQEDJLFy6Jq5V6unng1L64arsS4eVaRZYjn2k5KjHBHGdPvrZgzh8ZabAnh8yOlW59LndJm+kaC9YGYzNZMcsm3Bn6gzHdlQ2hzgdpXWhpy5XWC8oqcVtdeJviX/HeEW7OvZkmVH4+chq1VU1XviABsChW8INFA1sXWK6VJAlN00it1d0SMvJHG6zo0tjvnYMasnGSZAVb6IFuuYgzhbn/aAJHt6O0GsEbjRpqixCsbO5EqoQSFPZeZ0cuPQLGlghdFLVWt0FKHfMgtWdLI63HrxYRhNqALMk8NfQRMu36aLBbWm84rh9LTU7cFNzWOM1JyJJMksWBl/orX5AAdE/K4oH+U7CamhMUEp3wTKi3ZEsoG6fLIUkS+d/tp2+qmWxr4s7uTdkFEJVoYHekAh6s5guDkKnnjbgeWRk/cW1E9Yf2VRqaC2jNmfn8fqb+LBlTe/5ilxlK4EwRTV++h/W2n5A8fCK+87F7fnSNb0gC0NfdG6dF3xhPdWVHjB/TUrIvd1lCcXverfzs+oe6zIOxq1Jt10e1BdkJOJy9DDmSlUdOnEMJNVrrCrhuuAsAawKkj7cVNdy2PMrZO/o7aZYTb24gmSygaciubjE3ChZPow5gVswkh4r7UhK4GLE1mY4MhmXdaLSMa54Rfb6Hw2Rn4rAHjJbSLiJp2V1on9MW6hmUFOpq3BXIT+pOUlDlLqL2C0MuCtDSNSRhCGXxBY7tjPmtRRDqIN1Se2FTrNgusgwg+J9ND1cur92+kG5JsVkzjxe22/8N98gpKFn9jJbSZkwl3wKQ3PN6g5W0HacjjZeOnaeX1Dx7k9Vg5OfWBduJQLgVuv/ojpjfO/HmfV2EHq5cVAPs7AWCzkJOSiX9zp8mrOHqxeilmhlc56WXMwtvYmViX5JwAbDZnUn4CSJFzX5SrIlRGByNZHdj6nfrVXVQvRQiCHWQ+/tNRtXUK58oEAg6DUdTAzPLalEPfgl9xhotp02YsgtwPbKSbhmu5oAftT80dOwsg5RdGkmWsY97tFPuLYJQB1FkBYXEt+sRCK5lpFALe7qAddblkELJCEmS+eLuD9cwIggJBIIui+XGiQAkD7mT81Veg9VcBYqZ/1Vjxl1Rgj/3S8z9E7dWK9aIxASBQNBlkUwWrMOmIpkSbzO/PUhmK/3uXYBd1VDru44VWCwQQUggEAgSALWuHEi8XkKdjQhCAoFAkAA0fDgPAFPvC9tSXMuIICQQCAQJgpJTiJwgvZvihUhMEAgEggTA+bM/wEWMWK91RBASCASCBCDsSvA/DbEcJxAIBALDuGaD0LFjx5g+fTp3330306dP5/jx40ZLEggEAkErrtkgtGDBAmbOnMmmTZuYOXMm8+fPN1qSQCAQCFpxTQahiooKioqKmDx5MgCTJ0+mqKiIysrKK1wpEAgEgnhyTQah0tJSsrKyUBTdT0pRFDIzMyktLTVYmUAgEAiiEdlxlyA93dnmczMyXFc+KcEQmuOD0Bw/uqLurqgZYqv7mgxC2dnZlJWVEQwGURSFYDDIuXPnyM5ueyvuqqp6VPXK/YLS051UVHiuRm7cEZrjg9AcP7qi7q6oGS6tW5YlUlPbbzl0TQah9PR0CgsL2bBhA1OnTmXDhg0UFhaSltb2TpfteTPbM2tKFITm+CA0x4+uqLsraobY6pY07dpsD/rdd98xe/ZsamtrSU5OZunSpfTt29doWQKBQCCI4poNQgKBQCBIfK7J7DiBQCAQdA1EEBIIBAKBYYggJBAIBALDEEFIIBAIBIYhgpBAIBAIDEMEIYFAIBAYhghCAoFAIDCMa9IxoaNUVVXxwgsvcPLkSSwWC7169WLRokWkpaWxZ88e5s+fT1NTE7m5ubz22mukp6cD8Nxzz/H1119TXl7Orl27SErS3RZUVeWhhx6isbERgIyMDBYuXEheXl7Cao5mzpw5fPTRR5c8nkiaCwoK6N+/P7Ksj6teffVVCgoKElpzdXU1ixYt4uDBg5hMJiZOnMisWbMSVvOuXbtYuHBh5P4VFRVkZGSwbt26mGnuDN0Aa9as4S9/+QuyLKMoCnPnzmX48OEJrXnt2rWsXLkSVVXp0aMHr7zyCikpKYZqPnbsGPPnz6e8vByTycSgQYNYsGABNpsNgC1btvDqq68SDAa54YYbWLJkCXb7FTrGaoIIVVVV2rZt2yL/fuWVV7Q5c+ZowWBQu/POO7UdO3ZomqZpy5Yt02bPnh0576uvvtLOnz+v9e/fX/N4PC3uWVtbG/l55cqV2hNPPJHwmjVN0/72t79pc+bMueTxRNPcGTo7W/Ojjz6qvfvuu5F/nzt3LuE1R/P4449ry5cvj6nmztBdWVmpDR06VCsvL9c0TdM2b96sTZw4MaE1FxcXa7fddptWUVERue6ll14yXPOpU6e0gwcPapqmacFgUHv66ae1t99+W9M0TfN4PNqoUaO0Y8eOaZqmaXPnztXeeuutK+oQy3FRpKSkMHLkyMi/hwwZQklJCQcOHMBqtUZGTjNmzGDjxo2R82699dbIyKY1Llez26zH44mM1BNZc1VVFW+//TZz5syJqdbO1NzZxFrz8ePHOXz4MD/96U8jv8vIyEhozdFUVFTw5ZdfMnXq1Jhq7gzdmqahaRr19fUA1NXV0b1794TWfPjw4RZ+l2PHjuWTTz4xXHNeXh7XX389ALIsM3jwYEpKSgD4/PPPGThwIL17945c99lnn11Rh1iOuwSqqrJq1SrGjRtHaWkpOTk5kWNpaWmoqkp1dXWbpse/+tWvKCoqIjU1lRUrViS85kWLFvHUU0+1CKCdRSzf5x//+McEg0Fuv/12nnzySSwWS8JqLi4uJisri3nz5nHo0CG6devGCy+8wHXXXZewmqP5+OOPGT16NN26desUvWFioTstLY1FixZx3333kZycjKqqvPfeewmtecCAAezfv59Tp06Rl5fHhg0baGhoaNf/UWdr9nq9rF27lmeffRbggutycnLa1MNNzIQuwW9+8xscDgcPP/zwVd/rz3/+M//4xz+YNGkSf/jDH2Kg7uLEQvOnn36K2WzmjjvuiJ2wyxCr93nr1q189NFHvP/++xQXF7Ns2bIYKbyQWGhWVZW9e/dy//33s27dOqZNm8bjjz8eQ5UtieXnGeCjjz7ihz/8YUzudTliodvj8fD++++zZs0atm7dyuzZs5k1axZaJ9lmxkJznz59ePHFF3nmmWd48MEHcbvdAJhMnTNvaK/mQCDAM888wy233ML48eOv6m+LIHQRli5dyokTJ3jjjTeQZZns7OzIlBOgsrISWZbbNSKRZZkHHniA9evXd4bkmGnevn0727ZtY9y4cYwbNw7Q26MXFxcnrGYg0ivK6XQybdo0du3aFXO9sdScnZ1NdnZ2ZMnjrrvuory8vFNa0Mf687xnzx5qamoYO3ZszLVGEyvdX3zxBS6XK+Kif88993Dy5EmqqqoSVjPApEmTWLNmDR9++CGjRo0iKysLpzP2rR/aqzkYDPL888/jdrt58cUXI+e1vq6kpKRNPdxEEGrF7373Ow4cOMCyZcsiyzkDBw7E6/Wyc+dOAFavXs33v//9K96rsrKyxUNl48aNMc3Y6gzNL7/8Mp9//jlbtmxhy5YtAGzYsIF+/folrOaamhq8Xi+gj9A2bdpEYWFhTPXGWvPAgQNxOBwcOXIEgB07duB2u0lNTU1YzWHWrl3LlClTOm1UDrHVnZeXR1FRERUVFQBs27YNp9OZ8O91eXk5AE1NTbz55pv8/Oc/j6nejmhWVZXZs2ejKAqLFy9GkqTIvcaMGcP+/fs5fvx45LqJEydeUYNo5RDFkSNHmDx5Mr17946kHObl5bFs2TJ27drFggULWqQshtfDZ82axb59+ygrKyMzM5P+/fuzYsUKvv32W+bMmYPf7wcgNzeXefPm0aNHj4TV3JqCgoKYp2jHWvPu3buZP38+kiQRCAQYOnQoc+fOTWjNAPv372fhwoX4fD7sdjvz5s1j8ODBCa3Z6/UyevRoPvjgA/Lz82OmtbN1v/vuu3zwwQeYzWYsFguzZ8+OaYp2Z2j+5S9/SUlJCX6/n3vuuYenn346polNHdG8detWHn300RblEDfddBMLFiwAYPPmzbz22muoqkphYSGvvPIKDofjsjpEEBIIBAKBYYjlOIFAIBAYhghCAoFAIDAMEYQEAoFAYBgiCAkEAoHAMEQQEggEAoFhiCAkEAgEAsMQ3nECgUGMGzeO8+fPoygKiqLQr18/pk6dyvTp069YD3L69GnGjx8faQMhEHRVxKdXIDCQP/7xj4waNYq6ujq2b9/O4sWL2bdvH0uWLDFamkAQF8RynECQALhcLsaPH88bb7zBunXrOHz4MFu3buUHP/gBN910E2PHjuWtt96KnB82mrz55psZOnQou3fvBvTmbRMnTuTmm2/mF7/4BWfOnDHk9QgEbUUEIYEggRg8eDDdu3dn586d2O12li5dys6dO3nnnXdYtWoVmzdvBuCvf/0roHvO7d69m6FDh7J582beeecd3n77bf75z38ybNgwnnvuOSNfjkBwRUQQEggSjMzMTGpqahg5ciQFBQXIssyAAQOYNGkS27dvv+R1q1ev5pFHHiE/Px+TycRjjz3GoUOHxGxIkNCIPSGBIMEoKyvD7Xazd+9eXn/9dY4cOYLf78fn813WgbmkpITf/va3LF26NPI7TdMoKysjNzc3HtIFgnYjgpBAkECEHZWHDRvGE088wcMPP8zy5cuxWq0sXrw40gMn2kI/THZ2No899hhTpkyJt2yBoMOI5TiBIAHweDz8/e9/59lnn2XKlCkUFBRQX1+P2+3GarWyb98+NmzYEDk/LS0NWZY5depU5HczZszgT3/6U6RHUV1dHZ999lncX4tA0B5EKweBwCCi64RkWaZfv35MmTKFGTNmoCgKGzduZOnSpVRXVzNixAhyc3Opra3l9ddfB+D3v/89q1atIhAIsHz5coYMGcLHH3/MihUrOHPmDC6Xi1GjRol0b0FCI4KQQCAQCAxDLMcJBAKBwDBEEBIIBAKBYYggJBAIBALDEEFIIBAIBIYhgpBAIBAIDEMEIYFAIBAYhghCAoFAIDAMEYQEAoFAYBgiCAkEAoHAMP4/RsaJPM2vOnMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "weekly = data.resample('W').sum()\n", "weekly.plot(style=[':', '--', '-'])\n", "plt.ylabel('Weekly bicycle count');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows us some interesting seasonal trends: as you might expect, people bicycle more in the summer than in the winter, and even within a particular season the bicycle use varies from week to week (likely dependent on weather.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Another way that comes in handy for aggregating the data is to use a rolling mean, utilizing the ``pd.rolling_mean()`` function.\n", "Here we'll do a 30 day rolling mean of our data, making sure to center the window:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "daily = data.resample('D').sum()\n", "daily.rolling(30, center=True).sum().plot(style=[':', '--', '-'])\n", "plt.ylabel('mean hourly count');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The jaggedness of the result is due to the hard cutoff of the window.\n", "We can get a smoother version of a rolling mean using a window function–for example, a Gaussian window." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The following code specifies both the width of the window (we chose 50 days) and the width of the Gaussian within the window (we chose 10 days):" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "daily.rolling(50, center=True,\n", " win_type='gaussian').sum(std=10).plot(style=[':', '--', '-']);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Digging into the data\n", "\n", "While these smoothed data views are useful to get an idea of the general trend in the data, they hide much of the interesting structure.\n", "For example, we might want to look at the average traffic as a function of the time of day; we do this by grouping:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "by_time = data.groupby(data.index.time).mean()\n", "hourly_ticks = 4 * 60 * 60 * np.arange(6)\n", "by_time.plot(xticks=hourly_ticks, style=[':', '--', '-']);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The hourly traffic is a strongly bimodal distribution, with peaks around 8:00 in the morning and 5:00 in the evening.\n", "This is likely evidence of a strong component of commuter traffic crossing the bridge.\n", "This is further evidenced by the differences between the western sidewalk (generally used going toward downtown Seattle), which peaks more strongly in the morning, and the eastern sidewalk (generally used going away from downtown Seattle), which peaks more strongly in the evening.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We also might be curious about how things change based on the day of the week. Again, we can do this with a simple groupby:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "image/png": "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hAanDwpCUnR4i8TZfUshLtAK7Z4ocVy3Esen4x+ZE4RWXIiztBxzsI3hw1Po3r0HknT8HPPNN99DX4f72J5pW+zbt5eXXlpIWVkZXq8Hmy2Ip59+Drs9nGeeeZKLLppI//4DT1ruqaceo3fvxEDJicYyfHgKK1euwWKxcPnlk3j22RdOW3W1IYhkLwiIEseNQR8SjLO0BLmsBK2y/PFrr71dq4qYp3KmbfH44w9z++13MmzYCACOHDmMyeQfCjpnziP1fv3WSCR7QTgFUeL4zCWOPR4Pb7yxiC1bNuJ2e6qUOJZlGUNoKN6C/NP23Xu9Xh544B6Ki4txuVwkJfXh/vsfQq/Xs23bVl544dnKAmdebrjhJoKDQ864LXJzs4mMjAw8PrFsxOzZs7jmmusZNmwEubk5zJv3KPn5ecTExCLLxz91lJeX8corL3DgwD7cbjcDB6Zw551/JT39CA899AAffPAfvF4vF188hhtuuJlp06bz/fffsnbtah577Ck+/vgDvv9+JT6fF4PByH33zaFnz16nfc99/PEHrFv3M/PmPRf4lnJDEcleaHaOpfNPek7X7SwMfcageV1UfP33k6brE4aj7zUC1VmK89tXT56edD767meuN3PMww8/GOjGuf32Oxk69BzA3x3w6qtvBEocL1z4NC+88AqhoeHk5eVxyy3TWbz43wAUFxfTr98AbrttNh99tJh77rmdV155nQcffJiFC5/hs8/+w6xZf+Grr75g3769vP32hwDcd99dfPXVF1x6qb+M78GDB3jxxUXIssyNN15Lauo6hg49h+HDR56xi+FYuYSCgnysViuvvfZ2YFpa2kHuv/8hkpP7AbB69feBae+88yYWi5WPPvqMoqIibrrpWs4//8LAtKCgYD766DNKSoq5+ebrGTXqfAA+/PA9rFYrb77pvznRokUv8/777wRqzB+7m5WroKBy294U6MaJjo5mwYIXUBSFRx+dR0hIKJqmMW/eoyxfvoQpUy7nww/f45prrufCC8ejaRplZWUEBQWdcVtMn34Td9xxC8nJ/UhO7scFF4yjc+cuJ8334ovP0b//QG66aRbp6UeZMWNaYN+/8soLDBgwiDlzHkFVVR5//GGWL/+KSy65FIejnLy8PLKyMujatTupqRuYNm06GzeuJyXFX8Jh/PiLueaa6wDYsGEdzz03nzfeeLfa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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "by_weekday = data.groupby(data.index.dayofweek).mean()\n", "by_weekday.index = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']\n", "by_weekday.plot(style=[':', '--', '-']);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows a strong distinction between weekday and weekend totals, with around twice as many average riders crossing the bridge on Monday through Friday than on Saturday and Sunday." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With this in mind, let's do a compound GroupBy and look at the hourly trend on weekdays versus weekends.\n", "We'll start by grouping by both a flag marking the weekend, and the time of day:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "weekend = np.where(data.index.weekday < 5, 'Weekday', 'Weekend')\n", "by_time = data.groupby([weekend, data.index.time]).mean()" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots(1, 2, figsize=(14, 5))\n", "by_time.loc['Weekday'].plot(ax=ax[0], title='Weekdays',\n", " xticks=hourly_ticks, style=[':', '--', '-'])\n", "by_time.loc['Weekend'].plot(ax=ax[1], title='Weekends',\n", " xticks=hourly_ticks, style=[':', '--', '-']);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result is very interesting: we see a bimodal commute pattern during the work week, and a unimodal recreational pattern during the weekends." ] } ], "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.9.0" } }, "nbformat": 4, "nbformat_minor": 4 }