{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "`DataFrame`s and `Series` support all the usual math operations, addition, multiplaction, etc.\n", "numpy `ufuncs` e.g. `np.log` can also be used as expected." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.random.seed(42)\n", "df = pd.DataFrame(np.random.uniform(0, 10, size=(3, 3)))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "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", "
012
04.74540110.5071438.319939
16.9865852.5601862.559945
21.5808369.6617617.011150
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 4.745401 10.507143 8.319939\n", "1 6.986585 2.560186 2.559945\n", "2 1.580836 9.661761 7.011150" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df + 1" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "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", "
012
014.02803090.38576953.581513
135.8391982.4341822.433429
20.33737175.02611236.133926
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 14.028030 90.385769 53.581513\n", "1 35.839198 2.434182 2.433429\n", "2 0.337371 75.026112 36.133926" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df ** 2" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "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", "
012
01.3205292.2520431.990602
11.7895210.4448050.444651
2-0.5432872.1589181.793616
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 1.320529 2.252043 1.990602\n", "1 1.789521 0.444805 0.444651\n", "2 -0.543287 2.158918 1.793616" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.log(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But we don't just have NumPy arrays. We have `DataFrames` and `Series`, which have *labels*.\n", "Pandas automatically aligns by label when doing operations between `DataFrames` and `Series`." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "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", "
AB
035
169
2915
\n", "
" ], "text/plain": [ " A B\n", "0 3 5\n", "1 6 9\n", "2 9 15" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})\n", "df2 = pd.DataFrame({'A': [2, 4, 6], 'B': [1, 4, 9]})\n", "\n", "df1 + df2" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "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", "
AB
221
044
169
\n", "
" ], "text/plain": [ " A B\n", "2 2 1\n", "0 4 4\n", "1 6 9" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Note the index order\n", "df2 = pd.DataFrame({'A': [2, 4, 6], 'B': [1, 4, 9]}, index=[2, 0, 1])\n", "df2" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "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", "
AB
058
1814
257
\n", "
" ], "text/plain": [ " A B\n", "0 5 8\n", "1 8 14\n", "2 5 7" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 + df2" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "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", "
AB
0-0.580878-0.525170
1-0.571380-0.924083
2-2.6125490.950370
30.816445-1.523876
4-0.428046-0.742407
\n", "
" ], "text/plain": [ " A B\n", "0 -0.580878 -0.525170\n", "1 -0.571380 -0.924083\n", "2 -2.612549 0.950370\n", "3 0.816445 -1.523876\n", "4 -0.428046 -0.742407" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Different index entirely\n", "df3 = pd.DataFrame(np.random.randn(5, 2), columns=['A', 'B'])\n", "df3" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "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", "
AB
00.4191223.474830
11.4286204.075917
20.3874516.950370
3NaNNaN
4NaNNaN
\n", "
" ], "text/plain": [ " A B\n", "0 0.419122 3.474830\n", "1 1.428620 4.075917\n", "2 0.387451 6.950370\n", "3 NaN NaN\n", "4 NaN NaN" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 + df3" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from itertools import chain\n", "\n", "import pandas as pd\n", "from pandas.io import data\n", "\n", "# import seaborn as sns\n", "# import statsmodels.api as sm\n", "# from pandas_datareader import data\n", "# from cytoolz import partitionby\n", "\n", "%matplotlib inline\n", "# %config InlineBackend.figure_format = 'png'\n", "pd.options.display.max_rows = 10\n", "# sns.set_style('ticks')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas recently split off some web-based data reading functionality into its own package `pandas-datareader`. We'll use it to grab data from [FRED](http://research.stlouisfed.org)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# gdp = data.DataReader(\"GDPA\", data_source='fred', start='1929', end='2014').squeeze()\n", "# cpi = data.DataReader(\"CPIAUCSL\", data_source='fred', start='1947-01', end='2015-05').squeeze()\n", "# rec = data.DataReader('USREC', data_source='fred', start='1854-12-01', end='2014-08-01').squeeze()\n", "# gdp.to_csv('data/gdp.csv', header=True)\n", "# cpi.to_csv('data/cpi.csv', header=True)\n", "# rec.to_csv('data/rec.csv', header=True)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "gdp = pd.read_csv('data/gdp.csv', index_col='DATE', parse_dates=True).squeeze()\n", "cpi = pd.read_csv('data/cpi.csv', index_col='DATE', parse_dates=True).squeeze()\n", "rec = pd.read_csv('data/rec.csv', index_col='DATE', parse_dates=True).squeeze()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I almost always start my analysis by viewing the data, in table form..." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1929-01-01 104.6\n", "1930-01-01 92.2\n", "1931-01-01 77.4\n", "1932-01-01 59.5\n", "1933-01-01 57.2\n", "Name: GDPA, dtype: float64" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gdp.head()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 21.48\n", "1947-02-01 21.62\n", "1947-03-01 22.00\n", "1947-04-01 22.00\n", "1947-05-01 21.95\n", "Name: CPIAUCSL, dtype: float64" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cpi.head()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1854-12-01 1\n", "1855-01-01 0\n", "1855-02-01 0\n", "1855-03-01 0\n", "1855-04-01 0\n", "Name: USREC, dtype: int64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rec.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... with summary stats" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "count 86.000000\n", "mean 4146.161628\n", "std 5163.439075\n", "min 57.200000\n", "25% 311.975000\n", "50% 1225.100000\n", "75% 6793.850000\n", "max 17418.900000\n", "Name: GDPA, dtype: float64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gdp.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Describe` actually combines and few different *aggregation* methods that summarise a DataFrame or Series. These include `mean`, `max`, `std`, `quantile`..." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mean: 4146.161627906978\n", "std: 5163.439075089133\n", "quantile: 4371.05\n" ] } ], "source": [ "print('mean:', gdp.mean())\n", "print('std:', gdp.std())\n", "print('quantile:', gdp.quantile(.66))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And finally, visually. We'll do just a bit of work to get `rec` the recession indicator, in a form suitable for matplotlib.\n", "\n", "The only pandas-relavent bit is `Series.iteritems`, which you *almost* never want to use since it's relatively slow." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Timestamp('1854-12-01 00:00:00'), 1)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "next(rec.iteritems()) " ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "groups = partitionby(lambda x: x[1] == 1, rec.iteritems())\n", "recessions = filter(lambda x: x[0][1] == 1, groups)\n", "spans = [(months[0][0], months[-1][0]) for months in recessions]" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def add_rec_bars(ax=None):\n", " ax = ax or plt.gca()\n", " for span in spans:\n", " ax.fill_between(span, *ax.get_ylim(), color='k', alpha=.25)\n", " return ax" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = gdp.plot(title='GDP')\n", "# add_rec_bars(ax)\n", "# sns.despine()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = cpi.plot(title='CPI')\n", "add_rec_bars(ax)\n", "sns.despine()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's put some of those operations to use.\n", "\n", "First off, we'll convert the CPI base-2009 by dividing the Series by the average CPI in 2009." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "214.56466666666668" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# You *could* do this...\n", "cpi.loc[pd.Timestamp('2009-01-01'):pd.Timestamp('2009-12-31')].mean()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "214.56466666666668" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# but timeseries (Series or DataFrames with a DatetimeIndex) are special \n", "base_09 = cpi.loc['2009'].mean()\n", "base_09" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cpi09 = cpi / base_09 * 100\n", "ax = cpi09.plot(title='CPI-2009')\n", "# add_rec_bars(ax=ax)\n", "# sns.despine();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Alignment\n", "\n", "We've been adding numbers and doing `ufuncs` on DataFrames and Series. Big deal, right?\n", "\n", "Let's say we want real GDP (adjusted for inflation).\n", "\n", "\\begin{equation}\n", " rGDP_t = \\frac{GDP_t}{CPI_t}\n", "\\end{equation}\n", "\n", "Problem: our CPI is monthly but GDP is annual. Also the GDP series starts and stops before CPI. Pandas makes it somewhat easy to select the right months..." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 10.010968\n", "1948-01-01 11.036300\n", "1949-01-01 11.190100\n", "1950-01-01 10.957070\n", "1951-01-01 11.828602\n", " ... \n", "2010-01-01 101.362449\n", "2011-01-01 103.068228\n", "2012-01-01 106.149350\n", "2013-01-01 107.866781\n", "2014-01-01 109.583746\n", "Name: CPIAUCSL, dtype: float64" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this is boolean indexing, we'll see more later\n", "cpi09[(cpi09.index.month == 1) & (cpi09.index.year <= 2014)]" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 24.962621\n", "1948-01-01 24.899650\n", "1949-01-01 24.378693\n", "1950-01-01 27.397836\n", "1951-01-01 29.361036\n", " ... \n", "2010-01-01 147.632582\n", "2011-01-01 150.559491\n", "2012-01-01 152.268478\n", "2013-01-01 155.451936\n", "2014-01-01 158.955142\n", "dtype: float64" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gdp[gdp.index.year >= 1947] / cpi09[(cpi09.index.month == 1) & (cpi09.index.year <= 2014)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... but that's unneccesary. The operations will automatically align for you." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 24.962621\n", "1947-02-01 NaN\n", "1947-03-01 NaN\n", "1947-04-01 NaN\n", "1947-05-01 NaN\n", " ... \n", "1947-08-01 NaN\n", "1947-09-01 NaN\n", "1947-10-01 NaN\n", "1947-11-01 NaN\n", "1947-12-01 NaN\n", "dtype: float64" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rgdp = (gdp / cpi09)\n", "rgdp.loc['1947']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `NaN`s are missing value indicators. `NaN`s can crop up for many reasons, but in this case it's because the labels didn't overlap perfectly.\n", "\n", "Many pandas methods, e.g. aggregations like `sum` or `mean`, will ignore missing values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or you can explicitly drop them, which is what I'll do here." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 24.962621\n", "1948-01-01 24.899650\n", "1949-01-01 24.378693\n", "1950-01-01 27.397836\n", "1951-01-01 29.361036\n", " ... \n", "2010-01-01 147.632582\n", "2011-01-01 150.559491\n", "2012-01-01 152.268478\n", "2013-01-01 155.451936\n", "2014-01-01 158.955142\n", "dtype: float64" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rgdp.dropna()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas methods are non-mutating by default. This means that even though I called `.dropna()` above, `rgdp` still has missing values." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1929-01-01 NaN\n", "1930-01-01 NaN\n", "1931-01-01 NaN\n", "1932-01-01 NaN\n", "1933-01-01 NaN\n", " ..\n", "2015-01-01 NaN\n", "2015-02-01 NaN\n", "2015-03-01 NaN\n", "2015-04-01 NaN\n", "2015-05-01 NaN\n", "dtype: float64" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rgdp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To capture the change, assign a name to the result. In this case, I just the same name `rgdp`." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DATE\n", "1947-01-01 24.962621\n", "1948-01-01 24.899650\n", "1949-01-01 24.378693\n", "1950-01-01 27.397836\n", "1951-01-01 29.361036\n", "dtype: float64" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rgdp = rgdp.dropna()\n", "rgdp.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nHgp+ERGRK1Drw9/bXOsvXoiIiFQrhyZnSkoKkydPJikpiR07djBx4kTc3Nzw8vLizTffpHHjxkyc\nOJFNmzZhsVgwmUy88847+Pr6OrIMERERuQiHhf+MGTNYtGgRFosFgNdee43x48fToUMH5s2bx4wZ\nMxgzZgxpaWnMnDmTBg0aOOrQIiIicgUcFv4hISEkJiby/PPPA/DWW2/RpMmZaXfl5eWYzWYMw+DA\ngQOMHz+e3Nxc7r33XgYPHnxVx7PZbAAcOXLEMQ2owYqLiwHw9vZ2ciUitU9xcTGHDx/Gy8urWo9b\nWlrKoUOH9HsrDtesWTM8PH5ffDss/GNiYsjKyqp4fDb4N23axKeffsqnn35KUVERcXFxjBgxgvLy\ncuLj4wkLCyM0NPSi+542bRqJiYm/+dwDDzzgqCaIiIjUeMnJyQQHB/+ufVTpaLklS5Ywffp03n//\nfRo2bIjdbicuLg6z2YzZbKZXr17s3LnzkuGfkJBAQkJCpW3FxcVMmDCBkSNH4u7uXpXNqCQ6Oprk\n5ORqO95Zs2bN4qGHHqr247pSe12preBa7XWltoJrtdeV2gpn2tusWbPfvZ8qC/+vvvqK+fPnk5SU\nRP369QHYt28fo0eP5osvvsBms7Fx40YGDRp0Vfv39vYmKCiIkJAQR5Z9WX7vN66r4e/v75Tjgmu1\n15XaCq7VXldqK7hWe12prcDvvuQPVRD+JpMJu93Oa6+9RlBQEE8++SQAPXv25MknnyQ2NpYhQ4bg\n4eHBoEGDaNOmzVUf64YbbnBU2TWeK7UVXKu9rtRWcK32ulJbwbXaW9vbajIMw3B2EbVJaGgo6enp\nzi6j2rhSe12preBa7XWltoJrtdeV2gqOa2+tX+RHREREroz73/72t785u4japmfPns4uoVq5Untd\nqa3gWu11pbaCa7XXldoKjmmvLvuLiIi4GF32FxERcTEKfxERERej8BcREXExCn8REREXo/AXERFx\nMQp/ERERF6PwFxERcTEKfxERERej8BcREXExCn8REREXo/AXERFxMQp/ERERF6PwFxERcTEKfxER\nERej8BcREXExCn8REREXo/AXERFxMQp/ERERF6PwFxERcTEKfxERERej8BcREXExHs4uQEQuLSsr\ni379+vHqq69y3333VWz/8MMP2bNnD6+//rpDjhMbG8t//vMffH19r6rGgQMHsnnz5t98/vvvv2fW\n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\nzYbRaGyy3WazNflU1hndbK/X+yopKeGxxx4jOzubpKSkDq+/tdryd/vuu++yceNGfvCDH3DhwgV+\n+MMfeqOFFmtLrz169PCMcxg5ciTHjx/v4Opbry39/vrXv+axxx7j/fff57XXXiMrK8sbLbTYjXpt\n7rhjMBiwWq0t2rezaEu/0LWOU23p9WaOURL+11y4cIH/+q//Yt68edx///0AJCQksHPnTgAsFgtJ\nSUmYzWY+//xzHA4HtbW1lJWVERcXR2JiIhaLpcm+nVVbeh00aBClpaX87Gc/Iycnh7Fjx3qzlRZp\n69/tBx98QF5eHnl5eYSGhvLaa695s50bamuvd9xxB9u3bwfg8OHDhIWFea2Xlmhrv1evXvWcDYeE\nhHjCsTNqaa/fpCsdo6Dt/Xal41Rbe72ZY5Qs7HPNkiVL2LJlC9HR0Z5tCxcu5Fe/+hVOp5OYmBiW\nLFmCSqViw4YNrFu3DrfbzZw5c5g8eTL19fXMnz+fqqoqdDodOTk59OrVy4sdfbO29vrjH/+YkpIS\nTzCYTCZefvllb7XTrLb2+1UTJ07k73//e6cd7d/WXh0OBy+88AJlZWUAvPDCCyQkJHirnWa1td9T\np07x3HPPYbfbcblc/OxnP2PMmDFe7OibtabX677677UrHaOg7f12peNUW3v9qpYeoyT8hRBCCB8j\nl/2FEEIIHyPhL4QQQvgYCX8hhBDCx0j4CyGEED5Gwl8IIYTwMRL+QgghhI+RVf2E8GGVlZVMnTqV\n2NhYAOrr64mPj+f555/33AN+5MgR7r33Xn77298yZcoUSkpKmD9/PtA4K1lQUBDBwcH4+/uzbt06\nJkyYQGBgYJN58ocMGcLSpUs7vkEhxNeS+/yF8GGVlZXMmjWLrVu3erb95je/YdeuXbz55psALFu2\njDNnzlBbW8vrr7/e5OeffvppRo8ezcyZMz3bJkyYwF/+8pdOPzugEL5MLvsLIZrIysri6NGjHDly\nhIaGBt59911+8YtfcPDgQSoqKv5j/687f5BzCiE6N7nsL4RoQqvVEhkZSVlZGSdPnqR///5ERUUx\nadIk1q5dy7x585r9HbNnz25y2f+RRx7hvvvua8+yhRCtIOEvhPgPKpWKgIAANmzYwD333APA3Xff\nzbx58/j5z3/e7Lr3q1evlsv+QnRiEv5CiCYcDgfl5eX06tULi8XCgQMH+POf/wxATU0NH3zwAdOm\nTfNylUKItpDwF0J4uN1uVq5cyYgRI9i1axfJycm8+uqrnudzc3NZu3Zts+Ev3/kL0blJ+Avh486f\nP+8Zre9yubj99ttZvnw53//+9/nlL3/ZZN+MjAz+8Ic/UF5e7ll+9KvLjF7379/5BwYGsmbNmnbs\nQgjRGnKrnxBCCOFj5FY/IYQQwsdI+AshhBA+RsJfCCGE8DES/kIIIYSPkfAXQgghfIyEvxBCCOFj\nJPyFEEIIH/P/A7cmsVvTHTC7AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(figsize=(8, 8), nrows=2, sharex=True)\n", "\n", "rgdp.loc['1999':].plot(ax=axes[0], title=\"GDP (2009 Dollars)\")\n", "add_rec_bars(axes[0])\n", "axes[0].set_xlabel('')\n", "\n", "gdp.loc['1999':].plot(ax=axes[1], title=\"Nominal GDP\")\n", "add_rec_bars(axes[1])\n", "\n", "sns.despine()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }