Skip to content

Instantly share code, notes, and snippets.

@mattharrison
Created October 27, 2022 15:55
Show Gist options
  • Save mattharrison/044af5e1564cab076af986c9a020875c to your computer and use it in GitHub Desktop.
Save mattharrison/044af5e1564cab076af986c9a020875c to your computer and use it in GitHub Desktop.
Corise Pandas Webinar
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"# From Pandas to Production: Best Practices\n",
"## 5 Tips for Better Pandas Code"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## About Matt Harrison @\\_\\_mharrison\\_\\_\n",
"\n",
"* Author of Effective Pandas, Machine Learning Pocket Reference, and Illustrated Guide to Python 3.\n",
"* Advisor at Ponder (creators of Modin)\n",
"* Corporate trainer at MetaSnake. Taught Pandas to 1000's of students.\n",
"* Upcoming Live Course <a href='corise.com/go/python-production'>corise.com/go/python-production</a>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"source": [
"## Pandas Background\n",
"\n",
"* 1999 NLP\n",
"* 2006 Created Python OLAP Engine\n",
"* 2009 Heard about Pandas\n",
"* Used Pandas for failure modeling, analytics, and ml\n",
"* 2016 Learning the Pandas Library\n",
"* 2019 Spark\n",
"* 2020 Pandas Cookbook\n",
"* 2021 Effective Pandas\n",
"* 2022 CuDf, Modin, Polars"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Why Python?\n",
"\n",
"* Used everywhere\n",
"* #1 language at Universities\n",
"* Language of Data Science\n",
"* 400k+ Packages"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Outline of Opinions\n",
"\n",
"* Load Data\n",
"* Types\n",
"* Chaining\n",
"* Mutation\n",
"* Apply\n",
"* Aggregation"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!pip install -U pandas"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"from IPython.display import display\n",
"import numpy as np\n",
"import pandas as pd\n",
"#import modin.pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'1.5.1'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.__version__"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"pd.options.display.min_rows = 20"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-5-93feed31639c>:1: DtypeWarning: Columns (68,70,71,72,73,74,76,79) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" autos = pd.read_csv('https://github.com/mattharrison/datasets/raw/master/data/vehicles.csv.zip')\n"
]
}
],
"source": [
"autos = pd.read_csv('https://github.com/mattharrison/datasets/raw/master/data/vehicles.csv.zip')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>barrels08</th>\n",
" <th>barrelsA08</th>\n",
" <th>charge120</th>\n",
" <th>charge240</th>\n",
" <th>city08</th>\n",
" <th>city08U</th>\n",
" <th>cityA08</th>\n",
" <th>cityA08U</th>\n",
" <th>cityCD</th>\n",
" <th>cityE</th>\n",
" <th>...</th>\n",
" <th>mfrCode</th>\n",
" <th>c240Dscr</th>\n",
" <th>charge240b</th>\n",
" <th>c240bDscr</th>\n",
" <th>createdOn</th>\n",
" <th>modifiedOn</th>\n",
" <th>startStop</th>\n",
" <th>phevCity</th>\n",
" <th>phevHwy</th>\n",
" <th>phevComb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>15.695714</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>19</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>29.964545</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>9</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12.207778</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>23</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>29.964545</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>10</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17.347895</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>17</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>14.982273</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>21</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>13.184400</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>22</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>13.733750</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>23</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>12.677308</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>23</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>13.184400</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>23</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41134</th>\n",
" <td>16.480500</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>18</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41135</th>\n",
" <td>12.677308</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>23</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41136</th>\n",
" <td>13.733750</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>21</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41137</th>\n",
" <td>11.771786</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>24</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41138</th>\n",
" <td>13.184400</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>21</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41139</th>\n",
" <td>14.982273</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>19</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41140</th>\n",
" <td>14.330870</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>20</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41141</th>\n",
" <td>15.695714</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>18</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41142</th>\n",
" <td>15.695714</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>18</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41143</th>\n",
" <td>18.311667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>16</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41144 rows × 83 columns</p>\n",
"</div>"
],
"text/plain": [
" barrels08 barrelsA08 charge120 charge240 city08 city08U cityA08 \\\n",
"0 15.695714 0.0 0.0 0.0 19 0.0 0 \n",
"1 29.964545 0.0 0.0 0.0 9 0.0 0 \n",
"2 12.207778 0.0 0.0 0.0 23 0.0 0 \n",
"3 29.964545 0.0 0.0 0.0 10 0.0 0 \n",
"4 17.347895 0.0 0.0 0.0 17 0.0 0 \n",
"5 14.982273 0.0 0.0 0.0 21 0.0 0 \n",
"6 13.184400 0.0 0.0 0.0 22 0.0 0 \n",
"7 13.733750 0.0 0.0 0.0 23 0.0 0 \n",
"8 12.677308 0.0 0.0 0.0 23 0.0 0 \n",
"9 13.184400 0.0 0.0 0.0 23 0.0 0 \n",
"... ... ... ... ... ... ... ... \n",
"41134 16.480500 0.0 0.0 0.0 18 0.0 0 \n",
"41135 12.677308 0.0 0.0 0.0 23 0.0 0 \n",
"41136 13.733750 0.0 0.0 0.0 21 0.0 0 \n",
"41137 11.771786 0.0 0.0 0.0 24 0.0 0 \n",
"41138 13.184400 0.0 0.0 0.0 21 0.0 0 \n",
"41139 14.982273 0.0 0.0 0.0 19 0.0 0 \n",
"41140 14.330870 0.0 0.0 0.0 20 0.0 0 \n",
"41141 15.695714 0.0 0.0 0.0 18 0.0 0 \n",
"41142 15.695714 0.0 0.0 0.0 18 0.0 0 \n",
"41143 18.311667 0.0 0.0 0.0 16 0.0 0 \n",
"\n",
" cityA08U cityCD cityE ... mfrCode c240Dscr charge240b c240bDscr \\\n",
"0 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"1 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"2 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"3 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"4 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"5 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"6 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"7 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"8 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"9 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"... ... ... ... ... ... ... ... ... \n",
"41134 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41135 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41136 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41137 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41138 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41139 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41140 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41141 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41142 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"41143 0.0 0.0 0.0 ... NaN NaN 0.0 NaN \n",
"\n",
" createdOn modifiedOn startStop \\\n",
"0 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"1 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"2 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"3 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"4 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"5 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"6 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"7 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"8 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"9 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"... ... ... ... \n",
"41134 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41135 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41136 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41137 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41138 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41139 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41140 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41141 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41142 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"41143 Tue Jan 01 00:00:00 EST 2013 Tue Jan 01 00:00:00 EST 2013 NaN \n",
"\n",
" phevCity phevHwy phevComb \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"5 0 0 0 \n",
"6 0 0 0 \n",
"7 0 0 0 \n",
"8 0 0 0 \n",
"9 0 0 0 \n",
"... ... ... ... \n",
"41134 0 0 0 \n",
"41135 0 0 0 \n",
"41136 0 0 0 \n",
"41137 0 0 0 \n",
"41138 0 0 0 \n",
"41139 0 0 0 \n",
"41140 0 0 0 \n",
"41141 0 0 0 \n",
"41142 0 0 0 \n",
"41143 0 0 0 \n",
"\n",
"[41144 rows x 83 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"autos"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['barrels08', 'barrelsA08', 'charge120', 'charge240', 'city08',\n",
" 'city08U', 'cityA08', 'cityA08U', 'cityCD', 'cityE', 'cityUF', 'co2',\n",
" 'co2A', 'co2TailpipeAGpm', 'co2TailpipeGpm', 'comb08', 'comb08U',\n",
" 'combA08', 'combA08U', 'combE', 'combinedCD', 'combinedUF', 'cylinders',\n",
" 'displ', 'drive', 'engId', 'eng_dscr', 'feScore', 'fuelCost08',\n",
" 'fuelCostA08', 'fuelType', 'fuelType1', 'ghgScore', 'ghgScoreA',\n",
" 'highway08', 'highway08U', 'highwayA08', 'highwayA08U', 'highwayCD',\n",
" 'highwayE', 'highwayUF', 'hlv', 'hpv', 'id', 'lv2', 'lv4', 'make',\n",
" 'model', 'mpgData', 'phevBlended', 'pv2', 'pv4', 'range', 'rangeCity',\n",
" 'rangeCityA', 'rangeHwy', 'rangeHwyA', 'trany', 'UCity', 'UCityA',\n",
" 'UHighway', 'UHighwayA', 'VClass', 'year', 'youSaveSpend', 'guzzler',\n",
" 'trans_dscr', 'tCharger', 'sCharger', 'atvType', 'fuelType2', 'rangeA',\n",
" 'evMotor', 'mfrCode', 'c240Dscr', 'charge240b', 'c240bDscr',\n",
" 'createdOn', 'modifiedOn', 'startStop', 'phevCity', 'phevHwy',\n",
" 'phevComb'],\n",
" dtype='object')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"autos.columns"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"68383393"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 68 Megs\n",
"autos.memory_usage(deep=True).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Types\n",
"Getting the right types will enable analysis and correctness."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"cols = ['city08', 'comb08', 'highway08', 'cylinders', 'displ', 'drive', 'eng_dscr', \n",
" 'fuelCost08', 'make', 'model', 'trany', 'range', 'createdOn', 'year']"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"city08 int64\n",
"comb08 int64\n",
"highway08 int64\n",
"cylinders float64\n",
"displ float64\n",
"drive object\n",
"eng_dscr object\n",
"fuelCost08 int64\n",
"make object\n",
"model object\n",
"trany object\n",
"range int64\n",
"createdOn object\n",
"year int64\n",
"dtype: object"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"autos[cols].dtypes"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Index 128\n",
"city08 329152\n",
"comb08 329152\n",
"highway08 329152\n",
"cylinders 329152\n",
"displ 329152\n",
"drive 3028369\n",
"eng_dscr 2135693\n",
"fuelCost08 329152\n",
"make 2606267\n",
"model 2813134\n",
"trany 2933276\n",
"range 329152\n",
"createdOn 3497240\n",
"year 329152\n",
"dtype: int64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"autos[cols].memory_usage(deep=True)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"19647323"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 19 Megs\n",
"autos[cols].memory_usage(deep=True).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### Ints"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>fuelCost08</th>\n",
" <th>range</th>\n",
" <th>year</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>18.369045</td>\n",
" <td>20.616396</td>\n",
" <td>24.504667</td>\n",
" <td>2362.335942</td>\n",
" <td>0.793506</td>\n",
" <td>2001.535266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>7.905886</td>\n",
" <td>7.674535</td>\n",
" <td>7.730364</td>\n",
" <td>654.981925</td>\n",
" <td>13.041592</td>\n",
" <td>11.142414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>6.000000</td>\n",
" <td>7.000000</td>\n",
" <td>9.000000</td>\n",
" <td>500.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1984.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>15.000000</td>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>1900.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1991.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>24.000000</td>\n",
" <td>2350.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2002.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>20.000000</td>\n",
" <td>23.000000</td>\n",
" <td>28.000000</td>\n",
" <td>2700.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2011.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>150.000000</td>\n",
" <td>136.000000</td>\n",
" <td>124.000000</td>\n",
" <td>7400.000000</td>\n",
" <td>370.000000</td>\n",
" <td>2020.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 fuelCost08 range \\\n",
"count 41144.000000 41144.000000 41144.000000 41144.000000 41144.000000 \n",
"mean 18.369045 20.616396 24.504667 2362.335942 0.793506 \n",
"std 7.905886 7.674535 7.730364 654.981925 13.041592 \n",
"min 6.000000 7.000000 9.000000 500.000000 0.000000 \n",
"25% 15.000000 17.000000 20.000000 1900.000000 0.000000 \n",
"50% 17.000000 20.000000 24.000000 2350.000000 0.000000 \n",
"75% 20.000000 23.000000 28.000000 2700.000000 0.000000 \n",
"max 150.000000 136.000000 124.000000 7400.000000 370.000000 \n",
"\n",
" year \n",
"count 41144.000000 \n",
"mean 2001.535266 \n",
"std 11.142414 \n",
"min 1984.000000 \n",
"25% 1991.000000 \n",
"50% 2002.000000 \n",
"75% 2011.000000 \n",
"max 2020.000000 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"autos[cols].select_dtypes(int).describe()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>fuelCost08</th>\n",
" <th>range</th>\n",
" <th>year</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>18.369045</td>\n",
" <td>20.616396</td>\n",
" <td>24.504667</td>\n",
" <td>2362.335942</td>\n",
" <td>0.793506</td>\n",
" <td>2001.535266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>7.905886</td>\n",
" <td>7.674535</td>\n",
" <td>7.730364</td>\n",
" <td>654.981925</td>\n",
" <td>13.041592</td>\n",
" <td>11.142414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>6.000000</td>\n",
" <td>7.000000</td>\n",
" <td>9.000000</td>\n",
" <td>500.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1984.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>15.000000</td>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>1900.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1991.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>24.000000</td>\n",
" <td>2350.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2002.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>20.000000</td>\n",
" <td>23.000000</td>\n",
" <td>28.000000</td>\n",
" <td>2700.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2011.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>150.000000</td>\n",
" <td>136.000000</td>\n",
" <td>124.000000</td>\n",
" <td>7400.000000</td>\n",
" <td>370.000000</td>\n",
" <td>2020.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 fuelCost08 range \\\n",
"count 41144.000000 41144.000000 41144.000000 41144.000000 41144.000000 \n",
"mean 18.369045 20.616396 24.504667 2362.335942 0.793506 \n",
"std 7.905886 7.674535 7.730364 654.981925 13.041592 \n",
"min 6.000000 7.000000 9.000000 500.000000 0.000000 \n",
"25% 15.000000 17.000000 20.000000 1900.000000 0.000000 \n",
"50% 17.000000 20.000000 24.000000 2350.000000 0.000000 \n",
"75% 20.000000 23.000000 28.000000 2700.000000 0.000000 \n",
"max 150.000000 136.000000 124.000000 7400.000000 370.000000 \n",
"\n",
" year \n",
"count 41144.000000 \n",
"mean 2001.535266 \n",
"std 11.142414 \n",
"min 1984.000000 \n",
"25% 1991.000000 \n",
"50% 2002.000000 \n",
"75% 2011.000000 \n",
"max 2020.000000 "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# chaining\n",
"(autos\n",
" [cols]\n",
" .select_dtypes(int)\n",
" .describe()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"iinfo(min=-128, max=127, dtype=int8)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# can comb08 be an int8?\n",
"np.iinfo(np.int8)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"iinfo(min=0, max=255, dtype=uint8)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# no but maybe a uint8\n",
"np.iinfo(np.uint8)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>fuelCost08</th>\n",
" <th>range</th>\n",
" <th>year</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>40938.000000</td>\n",
" <td>40940.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" <td>41144.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>18.369045</td>\n",
" <td>20.616396</td>\n",
" <td>24.504667</td>\n",
" <td>5.717084</td>\n",
" <td>3.294238</td>\n",
" <td>2362.335942</td>\n",
" <td>0.793506</td>\n",
" <td>2001.535266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>7.905886</td>\n",
" <td>7.674535</td>\n",
" <td>7.730364</td>\n",
" <td>1.755517</td>\n",
" <td>1.357151</td>\n",
" <td>654.981925</td>\n",
" <td>13.041592</td>\n",
" <td>11.142414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>6.000000</td>\n",
" <td>7.000000</td>\n",
" <td>9.000000</td>\n",
" <td>2.000000</td>\n",
" <td>0.000000</td>\n",
" <td>500.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1984.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>15.000000</td>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>4.000000</td>\n",
" <td>2.200000</td>\n",
" <td>1900.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1991.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>17.000000</td>\n",
" <td>20.000000</td>\n",
" <td>24.000000</td>\n",
" <td>6.000000</td>\n",
" <td>3.000000</td>\n",
" <td>2350.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2002.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>20.000000</td>\n",
" <td>23.000000</td>\n",
" <td>28.000000</td>\n",
" <td>6.000000</td>\n",
" <td>4.300000</td>\n",
" <td>2700.000000</td>\n",
" <td>0.000000</td>\n",
" <td>2011.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>150.000000</td>\n",
" <td>136.000000</td>\n",
" <td>124.000000</td>\n",
" <td>16.000000</td>\n",
" <td>8.400000</td>\n",
" <td>7400.000000</td>\n",
" <td>370.000000</td>\n",
" <td>2020.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ \\\n",
"count 41144.000000 41144.000000 41144.000000 40938.000000 40940.000000 \n",
"mean 18.369045 20.616396 24.504667 5.717084 3.294238 \n",
"std 7.905886 7.674535 7.730364 1.755517 1.357151 \n",
"min 6.000000 7.000000 9.000000 2.000000 0.000000 \n",
"25% 15.000000 17.000000 20.000000 4.000000 2.200000 \n",
"50% 17.000000 20.000000 24.000000 6.000000 3.000000 \n",
"75% 20.000000 23.000000 28.000000 6.000000 4.300000 \n",
"max 150.000000 136.000000 124.000000 16.000000 8.400000 \n",
"\n",
" fuelCost08 range year \n",
"count 41144.000000 41144.000000 41144.000000 \n",
"mean 2362.335942 0.793506 2001.535266 \n",
"std 654.981925 13.041592 11.142414 \n",
"min 500.000000 0.000000 1984.000000 \n",
"25% 1900.000000 0.000000 1991.000000 \n",
"50% 2350.000000 0.000000 2002.000000 \n",
"75% 2700.000000 0.000000 2011.000000 \n",
"max 7400.000000 370.000000 2020.000000 "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# chaining\n",
"(autos\n",
" [cols]\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'uint8' })\n",
" #.select_dtypes([int, 'int8'])\n",
" .describe()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Skip floats, objects, and dates"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# chaining\n",
"# use 'integer' so see all int-like columns\n",
"(autos\n",
" [cols]\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16'})\n",
" .select_dtypes(['integer']) # see https://numpy.org/doc/stable/reference/arrays.scalars.html\n",
" .describe()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# chaining\n",
"(autos\n",
" [cols]\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16'})\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### Floats"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"(autos\n",
"[cols]\n",
".select_dtypes('float'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# surprise! cylinders looks int-like\n",
"autos.cylinders.describe()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# opps! missing values\n",
"autos.cylinders.value_counts(dropna=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# where are they missing?\n",
"(autos\n",
" [cols]\n",
" .query('cylinders.isna()')\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# chaining - add cylinders and displ columns\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0))\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', \n",
" 'fuelCost08': 'int16', 'range': 'int16', 'year': 'int16', })\n",
" .describe()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"autos[cols].describe()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# use this to inspect float sizes\n",
"np.finfo(np.float16)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# chaining - convert displ to float16\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'))\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16'})\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# new memory usage\n",
"(autos\n",
" .loc[:, cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'))\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16'})\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### Objects"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"(autos\n",
" [cols]\n",
" .select_dtypes(object)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# looks categorical\n",
"(autos.drive.value_counts(dropna=False))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# where are the values missing for drive?\n",
"(autos\n",
" [cols]\n",
" .query('drive.isna()'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# drive and make (in .astype) to category\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# let's inspect trany\n",
"# looks like it has two pieces of information embedded in column\n",
"(autos.trany.value_counts(dropna=False))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# add automatic, speeds from trany, then drop trany\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany'])\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### Dates"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# add createdOn\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn).dt.tz_localize('America/New_York')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany'])\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# Python doesn't like EST/EDT\n",
"autos[cols].createdOn"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# Fix date warnings - move on to eng_dscr\n",
"# http://www.fueleconomy.gov/feg/findacarhelp.shtml#trany\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany'])\n",
" .eng_dscr\n",
" .value_counts(dropna=False)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [],
"source": [
"# add ffs (Feedback fuel system), drop eng_descr\n",
"(autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York'),\n",
" ffs=autos.eng_dscr.str.contains('FFS')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany', 'eng_dscr'])\n",
" .memory_usage(deep=True)\n",
" .sum() # was 19,647,323\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 0,
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"# a glorious function\n",
"def tweak_autos(autos):\n",
" cols = ['city08', 'comb08', 'highway08', 'cylinders', 'displ', 'drive', 'eng_dscr', \n",
" 'fuelCost08', 'make', 'model', 'trany', 'range', 'createdOn', 'year']\n",
" return (autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York'),\n",
" ffs=autos.eng_dscr.str.contains('FFS')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16',\n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany', 'eng_dscr'])\n",
" )\n",
"\n",
"tweak_autos(autos)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Chain\n",
"\n",
"Chaining is also called \"flow\" programming. Rather than making intermediate variables, just leverage the fact that most operations return a new object and work on that.\n",
"\n",
"The chain should read like a recipe of ordered steps.\n",
"\n",
"(BTW, this is actually what we did above.)\n",
"\n",
"<div class='alert alert-warning'>\n",
" Hint: Leverage <tt>.pipe</tt> if you can't find a way to chain 😉🐼💪\n",
"</div>\n",
" \n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>drive</th>\n",
" <th>fuelCost08</th>\n",
" <th>make</th>\n",
" <th>model</th>\n",
" <th>range</th>\n",
" <th>createdOn</th>\n",
" <th>year</th>\n",
" <th>automatic</th>\n",
" <th>speeds</th>\n",
" <th>ffs</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>4</td>\n",
" <td>2.000000</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Alfa Romeo</td>\n",
" <td>Spider Veloce 2000</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9</td>\n",
" <td>11</td>\n",
" <td>14</td>\n",
" <td>12</td>\n",
" <td>4.898438</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>3850</td>\n",
" <td>Ferrari</td>\n",
" <td>Testarossa</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>23</td>\n",
" <td>27</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1550</td>\n",
" <td>Dodge</td>\n",
" <td>Charger</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>10</td>\n",
" <td>11</td>\n",
" <td>12</td>\n",
" <td>8</td>\n",
" <td>5.199219</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>3850</td>\n",
" <td>Dodge</td>\n",
" <td>B150/B250 Wagon 2WD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2700</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>21</td>\n",
" <td>22</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>22</td>\n",
" <td>25</td>\n",
" <td>29</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1750</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>31</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1600</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>23</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41134</th>\n",
" <td>18</td>\n",
" <td>20</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.099609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>2100</td>\n",
" <td>Saab</td>\n",
" <td>900</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41135</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1600</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41136</th>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1750</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41137</th>\n",
" <td>24</td>\n",
" <td>28</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1500</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41138</th>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>32</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41139</th>\n",
" <td>19</td>\n",
" <td>22</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41140</th>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>28</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1850</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41141</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41142</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41143</th>\n",
" <td>16</td>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41144 rows × 15 columns</p>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ \\\n",
"0 19 21 25 4 2.000000 \n",
"1 9 11 14 12 4.898438 \n",
"2 23 27 33 4 2.199219 \n",
"3 10 11 12 8 5.199219 \n",
"4 17 19 23 4 2.199219 \n",
"5 21 22 24 4 1.799805 \n",
"6 22 25 29 4 1.799805 \n",
"7 23 24 26 4 1.599609 \n",
"8 23 26 31 4 1.599609 \n",
"9 23 25 30 4 1.799805 \n",
"... ... ... ... ... ... \n",
"41134 18 20 24 4 2.099609 \n",
"41135 23 26 33 4 1.900391 \n",
"41136 21 24 30 4 1.900391 \n",
"41137 24 28 33 4 1.900391 \n",
"41138 21 25 32 4 1.900391 \n",
"41139 19 22 26 4 2.199219 \n",
"41140 20 23 28 4 2.199219 \n",
"41141 18 21 24 4 2.199219 \n",
"41142 18 21 24 4 2.199219 \n",
"41143 16 18 21 4 2.199219 \n",
"\n",
" drive fuelCost08 make \\\n",
"0 Rear-Wheel Drive 2000 Alfa Romeo \n",
"1 Rear-Wheel Drive 3850 Ferrari \n",
"2 Front-Wheel Drive 1550 Dodge \n",
"3 Rear-Wheel Drive 3850 Dodge \n",
"4 4-Wheel or All-Wheel Drive 2700 Subaru \n",
"5 Front-Wheel Drive 1900 Subaru \n",
"6 Front-Wheel Drive 1700 Subaru \n",
"7 Front-Wheel Drive 1750 Toyota \n",
"8 Front-Wheel Drive 1600 Toyota \n",
"9 Front-Wheel Drive 1700 Toyota \n",
"... ... ... ... \n",
"41134 Front-Wheel Drive 2100 Saab \n",
"41135 Front-Wheel Drive 1600 Saturn \n",
"41136 Front-Wheel Drive 1750 Saturn \n",
"41137 Front-Wheel Drive 1500 Saturn \n",
"41138 Front-Wheel Drive 1700 Saturn \n",
"41139 Front-Wheel Drive 1900 Subaru \n",
"41140 Front-Wheel Drive 1850 Subaru \n",
"41141 4-Wheel or All-Wheel Drive 2000 Subaru \n",
"41142 4-Wheel or All-Wheel Drive 2000 Subaru \n",
"41143 4-Wheel or All-Wheel Drive 2900 Subaru \n",
"\n",
" model range createdOn year automatic \\\n",
"0 Spider Veloce 2000 0 2013-01-01 00:00:00-05:00 1985 False \n",
"1 Testarossa 0 2013-01-01 00:00:00-05:00 1985 False \n",
"2 Charger 0 2013-01-01 00:00:00-05:00 1985 False \n",
"3 B150/B250 Wagon 2WD 0 2013-01-01 00:00:00-05:00 1985 True \n",
"4 Legacy AWD Turbo 0 2013-01-01 00:00:00-05:00 1993 False \n",
"5 Loyale 0 2013-01-01 00:00:00-05:00 1993 True \n",
"6 Loyale 0 2013-01-01 00:00:00-05:00 1993 False \n",
"7 Corolla 0 2013-01-01 00:00:00-05:00 1993 True \n",
"8 Corolla 0 2013-01-01 00:00:00-05:00 1993 False \n",
"9 Corolla 0 2013-01-01 00:00:00-05:00 1993 True \n",
"... ... ... ... ... ... \n",
"41134 900 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41135 SL 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41136 SL 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41137 SL 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41138 SL 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41139 Legacy 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41140 Legacy 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41141 Legacy AWD 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41142 Legacy AWD 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41143 Legacy AWD Turbo 0 2013-01-01 00:00:00-05:00 1993 True \n",
"\n",
" speeds ffs \n",
"0 5 True \n",
"1 5 False \n",
"2 5 True \n",
"3 3 False \n",
"4 5 True \n",
"5 3 True \n",
"6 5 True \n",
"7 3 True \n",
"8 5 True \n",
"9 4 True \n",
"... ... ... \n",
"41134 5 True \n",
"41135 4 True \n",
"41136 4 True \n",
"41137 5 True \n",
"41138 5 True \n",
"41139 4 True \n",
"41140 5 True \n",
"41141 4 True \n",
"41142 5 True \n",
"41143 4 True \n",
"\n",
"[41144 rows x 15 columns]"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# show debugging this\n",
"\n",
"def tweak_autos(autos):\n",
" cols = ['city08', 'comb08', 'highway08', 'cylinders', 'displ', 'drive', 'eng_dscr', \n",
" 'fuelCost08', 'make', 'model', 'trany', 'range', 'createdOn', 'year']\n",
" return (autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York'),\n",
" ffs=autos.eng_dscr.str.contains('FFS').fillna(False)\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category', 'model': 'category',\n",
" 'automatic': 'category', })\n",
" .drop(columns=['trany', 'eng_dscr'])\n",
" )\n",
"\n",
"tweak_autos(autos)#.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1664736"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 1.6 Megs!\n",
"tweak_autos(autos).memory_usage(deep=True).sum()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-39-c7c24d2ec7ba>:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['cylinders'] = cyls2\n",
"<ipython-input-39-c7c24d2ec7ba>:9: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1.displ = displ3\n",
"<ipython-input-39-c7c24d2ec7ba>:10: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1.drive = autos.drive.fillna('Other').astype('category')\n",
"<ipython-input-39-c7c24d2ec7ba>:11: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['automatic'] = autos.trany.str.contains('Auto')\n",
"<ipython-input-39-c7c24d2ec7ba>:15: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['speeds'] = speedint\n",
"/home/matt/envs/menv/lib/python3.8/site-packages/dateutil/parser/_parser.py:1213: UnknownTimezoneWarning: tzname EST identified but not understood. Pass `tzinfos` argument in order to correctly return a timezone-aware datetime. In a future version, this will raise an exception.\n",
" warnings.warn(\"tzname {tzname} identified but not understood. \"\n",
"/home/matt/envs/menv/lib/python3.8/site-packages/dateutil/parser/_parser.py:1213: UnknownTimezoneWarning: tzname EDT identified but not understood. Pass `tzinfos` argument in order to correctly return a timezone-aware datetime. In a future version, this will raise an exception.\n",
" warnings.warn(\"tzname {tzname} identified but not understood. \"\n",
"<ipython-input-39-c7c24d2ec7ba>:16: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1.createdOn=pd.to_datetime(autos.createdOn).dt.tz_localize('America/New_York')\n",
"<ipython-input-39-c7c24d2ec7ba>:17: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n",
" a1.ffs=autos.eng_dscr.str.contains('FFS')\n",
"<ipython-input-39-c7c24d2ec7ba>:18: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['highway08'] = autos.highway08.astype('int8')\n",
"<ipython-input-39-c7c24d2ec7ba>:19: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['city08'] = autos.city08.astype('int8')\n",
"<ipython-input-39-c7c24d2ec7ba>:20: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['comb08'] = autos.comb08.astype('int16')\n",
"<ipython-input-39-c7c24d2ec7ba>:21: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['fuelCost08'] = autos.fuelCost08.astype('int16')\n",
"<ipython-input-39-c7c24d2ec7ba>:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['range'] = autos.range.astype('int16')\n",
"<ipython-input-39-c7c24d2ec7ba>:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" a1['make'] = autos.make.astype('category')\n"
]
}
],
"source": [
"# compare chain to this mess\n",
"a1 = autos[cols]\n",
"cyls = autos.cylinders.fillna(0)\n",
"cyls2 = cyls.astype('int8')\n",
"a1['cylinders'] = cyls2\n",
"displ = a1.displ\n",
"displ2 = displ.fillna(0)\n",
"displ3 = displ2.astype('float16')\n",
"a1.displ = displ3\n",
"a1.drive = autos.drive.fillna('Other').astype('category')\n",
"a1['automatic'] = autos.trany.str.contains('Auto') \n",
"speed = autos.trany.str.extract(r'(\\d)+')\n",
"speedfill = speed.fillna('20')\n",
"speedint = speedfill.astype('int8')\n",
"a1['speeds'] = speedint\n",
"a1.createdOn=pd.to_datetime(autos.createdOn).dt.tz_localize('America/New_York')\n",
"a1.ffs=autos.eng_dscr.str.contains('FFS')\n",
"a1['highway08'] = autos.highway08.astype('int8')\n",
"a1['city08'] = autos.city08.astype('int8')\n",
"a1['comb08'] = autos.comb08.astype('int16')\n",
"a1['fuelCost08'] = autos.fuelCost08.astype('int16')\n",
"a1['range'] = autos.range.astype('int16')\n",
"a1['make'] = autos.make.astype('category')\n",
"a3 = a1.drop(columns=['trany', 'eng_dscr'])"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(41144, 83)\n",
"(41144, 14)\n",
"(41144, 17)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>drive</th>\n",
" <th>eng_dscr</th>\n",
" <th>fuelCost08</th>\n",
" <th>make</th>\n",
" <th>model</th>\n",
" <th>trany</th>\n",
" <th>range</th>\n",
" <th>createdOn</th>\n",
" <th>year</th>\n",
" <th>automatic</th>\n",
" <th>speeds</th>\n",
" <th>ffs</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>4</td>\n",
" <td>2.000000</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Alfa Romeo</td>\n",
" <td>Spider Veloce 2000</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9</td>\n",
" <td>11</td>\n",
" <td>14</td>\n",
" <td>12</td>\n",
" <td>4.898438</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>(GUZZLER)</td>\n",
" <td>3850</td>\n",
" <td>Ferrari</td>\n",
" <td>Testarossa</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>23</td>\n",
" <td>27</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1550</td>\n",
" <td>Dodge</td>\n",
" <td>Charger</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>10</td>\n",
" <td>11</td>\n",
" <td>12</td>\n",
" <td>8</td>\n",
" <td>5.199219</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>NaN</td>\n",
" <td>3850</td>\n",
" <td>Dodge</td>\n",
" <td>B150/B250 Wagon 2WD</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS,TRBO)</td>\n",
" <td>2700</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>21</td>\n",
" <td>22</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>22</td>\n",
" <td>25</td>\n",
" <td>29</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1700</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1750</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>31</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1600</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>23</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1700</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41134</th>\n",
" <td>18</td>\n",
" <td>20</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.099609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2100</td>\n",
" <td>Saab</td>\n",
" <td>900</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41135</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(TBI) (FFS)</td>\n",
" <td>1600</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41136</th>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(MFI) (FFS)</td>\n",
" <td>1750</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41137</th>\n",
" <td>24</td>\n",
" <td>28</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(TBI) (FFS)</td>\n",
" <td>1500</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41138</th>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>32</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(MFI) (FFS)</td>\n",
" <td>1700</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41139</th>\n",
" <td>19</td>\n",
" <td>22</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41140</th>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>28</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1850</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41141</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41142</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41143</th>\n",
" <td>16</td>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS,TRBO)</td>\n",
" <td>2900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41144 rows × 17 columns</p>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ \\\n",
"0 19 21 25 4 2.000000 \n",
"1 9 11 14 12 4.898438 \n",
"2 23 27 33 4 2.199219 \n",
"3 10 11 12 8 5.199219 \n",
"4 17 19 23 4 2.199219 \n",
"5 21 22 24 4 1.799805 \n",
"6 22 25 29 4 1.799805 \n",
"7 23 24 26 4 1.599609 \n",
"8 23 26 31 4 1.599609 \n",
"9 23 25 30 4 1.799805 \n",
"... ... ... ... ... ... \n",
"41134 18 20 24 4 2.099609 \n",
"41135 23 26 33 4 1.900391 \n",
"41136 21 24 30 4 1.900391 \n",
"41137 24 28 33 4 1.900391 \n",
"41138 21 25 32 4 1.900391 \n",
"41139 19 22 26 4 2.199219 \n",
"41140 20 23 28 4 2.199219 \n",
"41141 18 21 24 4 2.199219 \n",
"41142 18 21 24 4 2.199219 \n",
"41143 16 18 21 4 2.199219 \n",
"\n",
" drive eng_dscr fuelCost08 make \\\n",
"0 Rear-Wheel Drive (FFS) 2000 Alfa Romeo \n",
"1 Rear-Wheel Drive (GUZZLER) 3850 Ferrari \n",
"2 Front-Wheel Drive (FFS) 1550 Dodge \n",
"3 Rear-Wheel Drive NaN 3850 Dodge \n",
"4 4-Wheel or All-Wheel Drive (FFS,TRBO) 2700 Subaru \n",
"5 Front-Wheel Drive (FFS) 1900 Subaru \n",
"6 Front-Wheel Drive (FFS) 1700 Subaru \n",
"7 Front-Wheel Drive (FFS) 1750 Toyota \n",
"8 Front-Wheel Drive (FFS) 1600 Toyota \n",
"9 Front-Wheel Drive (FFS) 1700 Toyota \n",
"... ... ... ... ... \n",
"41134 Front-Wheel Drive (FFS) 2100 Saab \n",
"41135 Front-Wheel Drive (TBI) (FFS) 1600 Saturn \n",
"41136 Front-Wheel Drive (MFI) (FFS) 1750 Saturn \n",
"41137 Front-Wheel Drive (TBI) (FFS) 1500 Saturn \n",
"41138 Front-Wheel Drive (MFI) (FFS) 1700 Saturn \n",
"41139 Front-Wheel Drive (FFS) 1900 Subaru \n",
"41140 Front-Wheel Drive (FFS) 1850 Subaru \n",
"41141 4-Wheel or All-Wheel Drive (FFS) 2000 Subaru \n",
"41142 4-Wheel or All-Wheel Drive (FFS) 2000 Subaru \n",
"41143 4-Wheel or All-Wheel Drive (FFS,TRBO) 2900 Subaru \n",
"\n",
" model trany range createdOn \\\n",
"0 Spider Veloce 2000 Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"1 Testarossa Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"2 Charger Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"3 B150/B250 Wagon 2WD Automatic 3-spd 0 2013-01-01 00:00:00-05:00 \n",
"4 Legacy AWD Turbo Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"5 Loyale Automatic 3-spd 0 2013-01-01 00:00:00-05:00 \n",
"6 Loyale Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"7 Corolla Automatic 3-spd 0 2013-01-01 00:00:00-05:00 \n",
"8 Corolla Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"9 Corolla Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"... ... ... ... ... \n",
"41134 900 Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"41135 SL Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"41136 SL Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"41137 SL Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"41138 SL Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"41139 Legacy Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"41140 Legacy Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"41141 Legacy AWD Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"41142 Legacy AWD Manual 5-spd 0 2013-01-01 00:00:00-05:00 \n",
"41143 Legacy AWD Turbo Automatic 4-spd 0 2013-01-01 00:00:00-05:00 \n",
"\n",
" year automatic speeds ffs \n",
"0 1985 False 5 True \n",
"1 1985 False 5 False \n",
"2 1985 False 5 True \n",
"3 1985 True 3 NaN \n",
"4 1993 False 5 True \n",
"5 1993 True 3 True \n",
"6 1993 False 5 True \n",
"7 1993 True 3 True \n",
"8 1993 False 5 True \n",
"9 1993 True 4 True \n",
"... ... ... ... ... \n",
"41134 1993 False 5 True \n",
"41135 1993 True 4 True \n",
"41136 1993 True 4 True \n",
"41137 1993 False 5 True \n",
"41138 1993 False 5 True \n",
"41139 1993 True 4 True \n",
"41140 1993 False 5 True \n",
"41141 1993 True 4 True \n",
"41142 1993 False 5 True \n",
"41143 1993 True 4 True \n",
"\n",
"[41144 rows x 17 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>drive</th>\n",
" <th>fuelCost08</th>\n",
" <th>make</th>\n",
" <th>model</th>\n",
" <th>range</th>\n",
" <th>createdOn</th>\n",
" <th>year</th>\n",
" <th>automatic</th>\n",
" <th>speeds</th>\n",
" <th>ffs</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>4</td>\n",
" <td>2.000000</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Alfa Romeo</td>\n",
" <td>Spider Veloce 2000</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9</td>\n",
" <td>11</td>\n",
" <td>14</td>\n",
" <td>12</td>\n",
" <td>4.898438</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>3850</td>\n",
" <td>Ferrari</td>\n",
" <td>Testarossa</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>23</td>\n",
" <td>27</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1550</td>\n",
" <td>Dodge</td>\n",
" <td>Charger</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>10</td>\n",
" <td>11</td>\n",
" <td>12</td>\n",
" <td>8</td>\n",
" <td>5.199219</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>3850</td>\n",
" <td>Dodge</td>\n",
" <td>B150/B250 Wagon 2WD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1985</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2700</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>21</td>\n",
" <td>22</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>22</td>\n",
" <td>25</td>\n",
" <td>29</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1750</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>3</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>31</td>\n",
" <td>4</td>\n",
" <td>1.599609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1600</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>23</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.799805</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41134</th>\n",
" <td>18</td>\n",
" <td>20</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.099609</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>2100</td>\n",
" <td>Saab</td>\n",
" <td>900</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41135</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1600</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41136</th>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1750</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41137</th>\n",
" <td>24</td>\n",
" <td>28</td>\n",
" <td>33</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1500</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41138</th>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>32</td>\n",
" <td>4</td>\n",
" <td>1.900391</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1700</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41139</th>\n",
" <td>19</td>\n",
" <td>22</td>\n",
" <td>26</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41140</th>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>28</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>1850</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41141</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41142</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>False</td>\n",
" <td>5</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41143</th>\n",
" <td>16</td>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>4</td>\n",
" <td>2.199219</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>2900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>0</td>\n",
" <td>2013-01-01 00:00:00-05:00</td>\n",
" <td>1993</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41144 rows × 15 columns</p>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ \\\n",
"0 19 21 25 4 2.000000 \n",
"1 9 11 14 12 4.898438 \n",
"2 23 27 33 4 2.199219 \n",
"3 10 11 12 8 5.199219 \n",
"4 17 19 23 4 2.199219 \n",
"5 21 22 24 4 1.799805 \n",
"6 22 25 29 4 1.799805 \n",
"7 23 24 26 4 1.599609 \n",
"8 23 26 31 4 1.599609 \n",
"9 23 25 30 4 1.799805 \n",
"... ... ... ... ... ... \n",
"41134 18 20 24 4 2.099609 \n",
"41135 23 26 33 4 1.900391 \n",
"41136 21 24 30 4 1.900391 \n",
"41137 24 28 33 4 1.900391 \n",
"41138 21 25 32 4 1.900391 \n",
"41139 19 22 26 4 2.199219 \n",
"41140 20 23 28 4 2.199219 \n",
"41141 18 21 24 4 2.199219 \n",
"41142 18 21 24 4 2.199219 \n",
"41143 16 18 21 4 2.199219 \n",
"\n",
" drive fuelCost08 make \\\n",
"0 Rear-Wheel Drive 2000 Alfa Romeo \n",
"1 Rear-Wheel Drive 3850 Ferrari \n",
"2 Front-Wheel Drive 1550 Dodge \n",
"3 Rear-Wheel Drive 3850 Dodge \n",
"4 4-Wheel or All-Wheel Drive 2700 Subaru \n",
"5 Front-Wheel Drive 1900 Subaru \n",
"6 Front-Wheel Drive 1700 Subaru \n",
"7 Front-Wheel Drive 1750 Toyota \n",
"8 Front-Wheel Drive 1600 Toyota \n",
"9 Front-Wheel Drive 1700 Toyota \n",
"... ... ... ... \n",
"41134 Front-Wheel Drive 2100 Saab \n",
"41135 Front-Wheel Drive 1600 Saturn \n",
"41136 Front-Wheel Drive 1750 Saturn \n",
"41137 Front-Wheel Drive 1500 Saturn \n",
"41138 Front-Wheel Drive 1700 Saturn \n",
"41139 Front-Wheel Drive 1900 Subaru \n",
"41140 Front-Wheel Drive 1850 Subaru \n",
"41141 4-Wheel or All-Wheel Drive 2000 Subaru \n",
"41142 4-Wheel or All-Wheel Drive 2000 Subaru \n",
"41143 4-Wheel or All-Wheel Drive 2900 Subaru \n",
"\n",
" model range createdOn year automatic \\\n",
"0 Spider Veloce 2000 0 2013-01-01 00:00:00-05:00 1985 False \n",
"1 Testarossa 0 2013-01-01 00:00:00-05:00 1985 False \n",
"2 Charger 0 2013-01-01 00:00:00-05:00 1985 False \n",
"3 B150/B250 Wagon 2WD 0 2013-01-01 00:00:00-05:00 1985 True \n",
"4 Legacy AWD Turbo 0 2013-01-01 00:00:00-05:00 1993 False \n",
"5 Loyale 0 2013-01-01 00:00:00-05:00 1993 True \n",
"6 Loyale 0 2013-01-01 00:00:00-05:00 1993 False \n",
"7 Corolla 0 2013-01-01 00:00:00-05:00 1993 True \n",
"8 Corolla 0 2013-01-01 00:00:00-05:00 1993 False \n",
"9 Corolla 0 2013-01-01 00:00:00-05:00 1993 True \n",
"... ... ... ... ... ... \n",
"41134 900 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41135 SL 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41136 SL 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41137 SL 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41138 SL 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41139 Legacy 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41140 Legacy 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41141 Legacy AWD 0 2013-01-01 00:00:00-05:00 1993 True \n",
"41142 Legacy AWD 0 2013-01-01 00:00:00-05:00 1993 False \n",
"41143 Legacy AWD Turbo 0 2013-01-01 00:00:00-05:00 1993 True \n",
"\n",
" speeds ffs \n",
"0 5 True \n",
"1 5 False \n",
"2 5 True \n",
"3 3 NaN \n",
"4 5 True \n",
"5 3 True \n",
"6 5 True \n",
"7 3 True \n",
"8 5 True \n",
"9 4 True \n",
"... ... ... \n",
"41134 5 True \n",
"41135 4 True \n",
"41136 4 True \n",
"41137 5 True \n",
"41138 5 True \n",
"41139 4 True \n",
"41140 5 True \n",
"41141 4 True \n",
"41142 5 True \n",
"41143 4 True \n",
"\n",
"[41144 rows x 15 columns]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# easy to debug\n",
"# - assign to var (df3)\n",
"# - comment out\n",
"# - pipe to display\n",
"\n",
"\n",
"from IPython.display import display\n",
"\n",
"def get_var(df, var_name):\n",
" globals()[var_name] = df\n",
" return df\n",
"\n",
"def tweak_autos(autos):\n",
" return (autos\n",
" .pipe(lambda df: print(df.shape) or df) \n",
" [cols]\n",
" .pipe(lambda df: print(df.shape) or df) \n",
" # create var \n",
" .pipe(get_var, 'df3')\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'), \n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York'),\n",
" ffs=autos.eng_dscr.str.contains('FFS')\n",
" )\n",
" # debug pipe \n",
" .pipe(lambda df: print(df.shape) or df) \n",
" .pipe(lambda df: display(df) or df)\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': 'int16', \n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany', 'eng_dscr'])\n",
" )\n",
"\n",
"tweak_autos(autos)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>drive</th>\n",
" <th>eng_dscr</th>\n",
" <th>fuelCost08</th>\n",
" <th>make</th>\n",
" <th>model</th>\n",
" <th>trany</th>\n",
" <th>range</th>\n",
" <th>createdOn</th>\n",
" <th>year</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Alfa Romeo</td>\n",
" <td>Spider Veloce 2000</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9</td>\n",
" <td>11</td>\n",
" <td>14</td>\n",
" <td>12.0</td>\n",
" <td>4.9</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>(GUZZLER)</td>\n",
" <td>3850</td>\n",
" <td>Ferrari</td>\n",
" <td>Testarossa</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>23</td>\n",
" <td>27</td>\n",
" <td>33</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1550</td>\n",
" <td>Dodge</td>\n",
" <td>Charger</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>10</td>\n",
" <td>11</td>\n",
" <td>12</td>\n",
" <td>8.0</td>\n",
" <td>5.2</td>\n",
" <td>Rear-Wheel Drive</td>\n",
" <td>NaN</td>\n",
" <td>3850</td>\n",
" <td>Dodge</td>\n",
" <td>B150/B250 Wagon 2WD</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS,TRBO)</td>\n",
" <td>2700</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>21</td>\n",
" <td>22</td>\n",
" <td>24</td>\n",
" <td>4.0</td>\n",
" <td>1.8</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>22</td>\n",
" <td>25</td>\n",
" <td>29</td>\n",
" <td>4.0</td>\n",
" <td>1.8</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1700</td>\n",
" <td>Subaru</td>\n",
" <td>Loyale</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>26</td>\n",
" <td>4.0</td>\n",
" <td>1.6</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1750</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Automatic 3-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>31</td>\n",
" <td>4.0</td>\n",
" <td>1.6</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1600</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>23</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>4.0</td>\n",
" <td>1.8</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1700</td>\n",
" <td>Toyota</td>\n",
" <td>Corolla</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41134</th>\n",
" <td>18</td>\n",
" <td>20</td>\n",
" <td>24</td>\n",
" <td>4.0</td>\n",
" <td>2.1</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2100</td>\n",
" <td>Saab</td>\n",
" <td>900</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41135</th>\n",
" <td>23</td>\n",
" <td>26</td>\n",
" <td>33</td>\n",
" <td>4.0</td>\n",
" <td>1.9</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(TBI) (FFS)</td>\n",
" <td>1600</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41136</th>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>30</td>\n",
" <td>4.0</td>\n",
" <td>1.9</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(MFI) (FFS)</td>\n",
" <td>1750</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41137</th>\n",
" <td>24</td>\n",
" <td>28</td>\n",
" <td>33</td>\n",
" <td>4.0</td>\n",
" <td>1.9</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(TBI) (FFS)</td>\n",
" <td>1500</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41138</th>\n",
" <td>21</td>\n",
" <td>25</td>\n",
" <td>32</td>\n",
" <td>4.0</td>\n",
" <td>1.9</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(MFI) (FFS)</td>\n",
" <td>1700</td>\n",
" <td>Saturn</td>\n",
" <td>SL</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41139</th>\n",
" <td>19</td>\n",
" <td>22</td>\n",
" <td>26</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41140</th>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>28</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>Front-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>1850</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41141</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41142</th>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>24</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS)</td>\n",
" <td>2000</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD</td>\n",
" <td>Manual 5-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41143</th>\n",
" <td>16</td>\n",
" <td>18</td>\n",
" <td>21</td>\n",
" <td>4.0</td>\n",
" <td>2.2</td>\n",
" <td>4-Wheel or All-Wheel Drive</td>\n",
" <td>(FFS,TRBO)</td>\n",
" <td>2900</td>\n",
" <td>Subaru</td>\n",
" <td>Legacy AWD Turbo</td>\n",
" <td>Automatic 4-spd</td>\n",
" <td>0</td>\n",
" <td>Tue Jan 01 00:00:00 EST 2013</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41144 rows × 14 columns</p>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ \\\n",
"0 19 21 25 4.0 2.0 \n",
"1 9 11 14 12.0 4.9 \n",
"2 23 27 33 4.0 2.2 \n",
"3 10 11 12 8.0 5.2 \n",
"4 17 19 23 4.0 2.2 \n",
"5 21 22 24 4.0 1.8 \n",
"6 22 25 29 4.0 1.8 \n",
"7 23 24 26 4.0 1.6 \n",
"8 23 26 31 4.0 1.6 \n",
"9 23 25 30 4.0 1.8 \n",
"... ... ... ... ... ... \n",
"41134 18 20 24 4.0 2.1 \n",
"41135 23 26 33 4.0 1.9 \n",
"41136 21 24 30 4.0 1.9 \n",
"41137 24 28 33 4.0 1.9 \n",
"41138 21 25 32 4.0 1.9 \n",
"41139 19 22 26 4.0 2.2 \n",
"41140 20 23 28 4.0 2.2 \n",
"41141 18 21 24 4.0 2.2 \n",
"41142 18 21 24 4.0 2.2 \n",
"41143 16 18 21 4.0 2.2 \n",
"\n",
" drive eng_dscr fuelCost08 make \\\n",
"0 Rear-Wheel Drive (FFS) 2000 Alfa Romeo \n",
"1 Rear-Wheel Drive (GUZZLER) 3850 Ferrari \n",
"2 Front-Wheel Drive (FFS) 1550 Dodge \n",
"3 Rear-Wheel Drive NaN 3850 Dodge \n",
"4 4-Wheel or All-Wheel Drive (FFS,TRBO) 2700 Subaru \n",
"5 Front-Wheel Drive (FFS) 1900 Subaru \n",
"6 Front-Wheel Drive (FFS) 1700 Subaru \n",
"7 Front-Wheel Drive (FFS) 1750 Toyota \n",
"8 Front-Wheel Drive (FFS) 1600 Toyota \n",
"9 Front-Wheel Drive (FFS) 1700 Toyota \n",
"... ... ... ... ... \n",
"41134 Front-Wheel Drive (FFS) 2100 Saab \n",
"41135 Front-Wheel Drive (TBI) (FFS) 1600 Saturn \n",
"41136 Front-Wheel Drive (MFI) (FFS) 1750 Saturn \n",
"41137 Front-Wheel Drive (TBI) (FFS) 1500 Saturn \n",
"41138 Front-Wheel Drive (MFI) (FFS) 1700 Saturn \n",
"41139 Front-Wheel Drive (FFS) 1900 Subaru \n",
"41140 Front-Wheel Drive (FFS) 1850 Subaru \n",
"41141 4-Wheel or All-Wheel Drive (FFS) 2000 Subaru \n",
"41142 4-Wheel or All-Wheel Drive (FFS) 2000 Subaru \n",
"41143 4-Wheel or All-Wheel Drive (FFS,TRBO) 2900 Subaru \n",
"\n",
" model trany range \\\n",
"0 Spider Veloce 2000 Manual 5-spd 0 \n",
"1 Testarossa Manual 5-spd 0 \n",
"2 Charger Manual 5-spd 0 \n",
"3 B150/B250 Wagon 2WD Automatic 3-spd 0 \n",
"4 Legacy AWD Turbo Manual 5-spd 0 \n",
"5 Loyale Automatic 3-spd 0 \n",
"6 Loyale Manual 5-spd 0 \n",
"7 Corolla Automatic 3-spd 0 \n",
"8 Corolla Manual 5-spd 0 \n",
"9 Corolla Automatic 4-spd 0 \n",
"... ... ... ... \n",
"41134 900 Manual 5-spd 0 \n",
"41135 SL Automatic 4-spd 0 \n",
"41136 SL Automatic 4-spd 0 \n",
"41137 SL Manual 5-spd 0 \n",
"41138 SL Manual 5-spd 0 \n",
"41139 Legacy Automatic 4-spd 0 \n",
"41140 Legacy Manual 5-spd 0 \n",
"41141 Legacy AWD Automatic 4-spd 0 \n",
"41142 Legacy AWD Manual 5-spd 0 \n",
"41143 Legacy AWD Turbo Automatic 4-spd 0 \n",
"\n",
" createdOn year \n",
"0 Tue Jan 01 00:00:00 EST 2013 1985 \n",
"1 Tue Jan 01 00:00:00 EST 2013 1985 \n",
"2 Tue Jan 01 00:00:00 EST 2013 1985 \n",
"3 Tue Jan 01 00:00:00 EST 2013 1985 \n",
"4 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"5 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"6 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"7 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"8 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"9 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"... ... ... \n",
"41134 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41135 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41136 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41137 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41138 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41139 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41140 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41141 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41142 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"41143 Tue Jan 01 00:00:00 EST 2013 1993 \n",
"\n",
"[41144 rows x 14 columns]"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# inspect intermediate data frame\n",
"df3"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"source": [
"## More Chain\n",
"\n",
"Chaining w/ Functions enables:\n",
"\n",
"* Testing\n",
"* Deployment\n",
"* Reuse"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Don't Mutate\n",
"\n",
"> \"you are missing the point, inplace rarely actually does something inplace, you are thinking that you are saving memory but you are not.\"\n",
">\n",
"> **jreback** - Pandas core dev\n",
"\n",
"\n",
"\n",
"https://github.com/pandas-dev/pandas/issues/16529#issuecomment-676518136\n",
"\n",
"* In general, no performance benefits\n",
"* Prohibits chaining\n",
"* ``SettingWithCopyWarning`` fun\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Don't Apply (if you can)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def tweak_autos(autos):\n",
" return (autos\n",
" [cols]\n",
" .assign(cylinders=autos.cylinders.fillna(0).astype('int8'),\n",
" displ=autos.displ.fillna(0).astype('float16'),\n",
" drive=autos.drive.fillna('Other').astype('category'),\n",
" automatic=autos.trany.str.contains('Auto'),\n",
" speeds=autos.trany.str.extract(r'(\\d)+').fillna('20').astype('int8'),\n",
" createdOn=pd.to_datetime(autos.createdOn.replace({' EDT': '-04:00',\n",
" ' EST': '-05:00'}, regex=True), utc=True).dt.tz_convert('America/New_York'),\n",
" ffs=autos.eng_dscr.str.contains('FFS')\n",
" )\n",
" .astype({'highway08': 'int8', 'city08': 'int16', 'comb08': 'int16', 'fuelCost08': \n",
" \n",
" 'int16',\n",
" 'range': 'int16', 'year': 'int16', 'make': 'category'})\n",
" .drop(columns=['trany', 'eng_dscr'])\n",
" )\n",
"\n",
"\n",
"autos2 = tweak_autos(autos)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 12.379737\n",
"1 26.135000\n",
"2 10.226739\n",
"3 23.521500\n",
"4 13.836176\n",
"5 11.200714\n",
"6 10.691591\n",
"7 10.226739\n",
"8 10.226739\n",
"9 10.226739\n",
" ... \n",
"41134 13.067500\n",
"41135 10.226739\n",
"41136 11.200714\n",
"41137 9.800625\n",
"41138 11.200714\n",
"41139 12.379737\n",
"41140 11.760750\n",
"41141 13.067500\n",
"41142 13.067500\n",
"41143 14.700938\n",
"Name: city08, Length: 41144, dtype: float64"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# try to me more Euro-centric\n",
"def to_lper100km(val):\n",
" return 235.215 / val\n",
"autos2.city08.apply(to_lper100km)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 12.379737\n",
"1 26.135000\n",
"2 10.226739\n",
"3 23.521500\n",
"4 13.836176\n",
"5 11.200714\n",
"6 10.691591\n",
"7 10.226739\n",
"8 10.226739\n",
"9 10.226739\n",
" ... \n",
"41134 13.067500\n",
"41135 10.226739\n",
"41136 11.200714\n",
"41137 9.800625\n",
"41138 11.200714\n",
"41139 12.379737\n",
"41140 11.760750\n",
"41141 13.067500\n",
"41142 13.067500\n",
"41143 14.700938\n",
"Name: city08, Length: 41144, dtype: float64"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# this gives the sames results\n",
"235.215 / autos2.city08 "
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9.98 ms ± 1.97 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"autos2.city08.apply(to_lper100km)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"313 µs ± 62.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"235.215 / autos2.city08 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# ~50x slower!\n",
"6_220 / 110"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def is_american(val):\n",
" return val in {'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'}"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.85 ms ± 410 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"autos2.make.apply(is_american)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.86 ms ± 214 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"autos2.make.isin({'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"autos3 = autos2.assign(make=autos2.make.astype(str))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%%timeit\n",
"# converted to string\n",
"autos3.make.isin({'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%%timeit\n",
"autos3.make.apply(is_american)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def country(val):\n",
" if val in {'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'}:\n",
" return 'US'\n",
" return 'Other'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [],
"source": [
"%%timeit\n",
"# Might be ok for strings, since they are not vectorized...\n",
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%%timeit\n",
"values = {'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'}\n",
"(autos2\n",
" .assign(country='US')\n",
" .assign(country=lambda df_:df_.country.where(df_.make.isin(values), 'Other'))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%%timeit\n",
"\n",
"(autos2\n",
" .assign(country=np.select([autos2.make.isin({'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'})], \n",
" ['US'], 'Other'))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 0,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%%timeit\n",
"\n",
"(autos2\n",
" .assign(country=np.where(autos2.make.isin({'Chevrolet', 'Ford', 'Dodge', 'GMC', 'Tesla'}), \n",
" 'US', 'Other'))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Master Aggregation\n",
"\n",
"Let's compare mileage by country by year...🤔"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-54-8e52017ce478>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.\n",
" (autos2\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city08</th>\n",
" <th>comb08</th>\n",
" <th>highway08</th>\n",
" <th>cylinders</th>\n",
" <th>displ</th>\n",
" <th>fuelCost08</th>\n",
" <th>range</th>\n",
" <th>speeds</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1984</th>\n",
" <td>17.982688</td>\n",
" <td>19.881874</td>\n",
" <td>23.075356</td>\n",
" <td>5.385438</td>\n",
" <td>3.165017</td>\n",
" <td>2313.543788</td>\n",
" <td>0.000000</td>\n",
" <td>3.928208</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1985</th>\n",
" <td>17.878307</td>\n",
" <td>19.808348</td>\n",
" <td>23.042328</td>\n",
" <td>5.375661</td>\n",
" <td>3.164080</td>\n",
" <td>2334.509112</td>\n",
" <td>0.000000</td>\n",
" <td>3.924750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1986</th>\n",
" <td>17.665289</td>\n",
" <td>19.550413</td>\n",
" <td>22.699174</td>\n",
" <td>5.425620</td>\n",
" <td>3.183762</td>\n",
" <td>2354.049587</td>\n",
" <td>0.000000</td>\n",
" <td>3.984298</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1987</th>\n",
" <td>17.310345</td>\n",
" <td>19.228549</td>\n",
" <td>22.445068</td>\n",
" <td>5.412189</td>\n",
" <td>3.173949</td>\n",
" <td>2403.648757</td>\n",
" <td>0.000000</td>\n",
" <td>4.037690</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1988</th>\n",
" <td>17.333628</td>\n",
" <td>19.328319</td>\n",
" <td>22.702655</td>\n",
" <td>5.461947</td>\n",
" <td>3.194899</td>\n",
" <td>2387.035398</td>\n",
" <td>0.000000</td>\n",
" <td>4.129204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1989</th>\n",
" <td>17.143972</td>\n",
" <td>19.125759</td>\n",
" <td>22.465742</td>\n",
" <td>5.488291</td>\n",
" <td>3.209926</td>\n",
" <td>2433.434519</td>\n",
" <td>0.000000</td>\n",
" <td>4.166522</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1990</th>\n",
" <td>17.033395</td>\n",
" <td>19.000928</td>\n",
" <td>22.337662</td>\n",
" <td>5.496289</td>\n",
" <td>3.217369</td>\n",
" <td>2436.178108</td>\n",
" <td>0.000000</td>\n",
" <td>4.238404</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1991</th>\n",
" <td>16.848940</td>\n",
" <td>18.825972</td>\n",
" <td>22.253534</td>\n",
" <td>5.598940</td>\n",
" <td>3.266809</td>\n",
" <td>2490.856890</td>\n",
" <td>0.000000</td>\n",
" <td>4.301237</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1992</th>\n",
" <td>16.805531</td>\n",
" <td>18.862623</td>\n",
" <td>22.439786</td>\n",
" <td>5.623550</td>\n",
" <td>3.276159</td>\n",
" <td>2494.736842</td>\n",
" <td>0.000000</td>\n",
" <td>4.318466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1993</th>\n",
" <td>16.998170</td>\n",
" <td>19.104300</td>\n",
" <td>22.780421</td>\n",
" <td>5.602928</td>\n",
" <td>3.248540</td>\n",
" <td>2454.620311</td>\n",
" <td>0.000000</td>\n",
" <td>4.339433</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1994</th>\n",
" <td>16.918534</td>\n",
" <td>19.012220</td>\n",
" <td>22.725051</td>\n",
" <td>5.704684</td>\n",
" <td>3.333190</td>\n",
" <td>2461.507128</td>\n",
" <td>0.000000</td>\n",
" <td>4.332994</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1995</th>\n",
" <td>16.569804</td>\n",
" <td>18.797311</td>\n",
" <td>22.671148</td>\n",
" <td>5.892451</td>\n",
" <td>3.471776</td>\n",
" <td>2497.828335</td>\n",
" <td>0.000000</td>\n",
" <td>4.356774</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1996</th>\n",
" <td>17.289780</td>\n",
" <td>19.584735</td>\n",
" <td>23.569211</td>\n",
" <td>5.627426</td>\n",
" <td>3.234789</td>\n",
" <td>2375.032342</td>\n",
" <td>0.000000</td>\n",
" <td>4.364812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1997</th>\n",
" <td>17.135171</td>\n",
" <td>19.429134</td>\n",
" <td>23.451444</td>\n",
" <td>5.666667</td>\n",
" <td>3.226933</td>\n",
" <td>2405.511811</td>\n",
" <td>0.000000</td>\n",
" <td>4.402887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1998</th>\n",
" <td>17.113300</td>\n",
" <td>19.518473</td>\n",
" <td>23.546798</td>\n",
" <td>5.633005</td>\n",
" <td>3.201979</td>\n",
" <td>2382.635468</td>\n",
" <td>0.229064</td>\n",
" <td>4.419951</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999</th>\n",
" <td>17.272300</td>\n",
" <td>19.611502</td>\n",
" <td>23.552817</td>\n",
" <td>5.667840</td>\n",
" <td>3.188794</td>\n",
" <td>2392.194836</td>\n",
" <td>0.570423</td>\n",
" <td>4.421362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2000</th>\n",
" <td>17.221429</td>\n",
" <td>19.526190</td>\n",
" <td>23.414286</td>\n",
" <td>5.713095</td>\n",
" <td>3.200517</td>\n",
" <td>2429.702381</td>\n",
" <td>0.348810</td>\n",
" <td>4.508333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2001</th>\n",
" <td>17.275521</td>\n",
" <td>19.479693</td>\n",
" <td>23.328211</td>\n",
" <td>5.720088</td>\n",
" <td>3.192452</td>\n",
" <td>2448.463227</td>\n",
" <td>0.261251</td>\n",
" <td>4.660812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2002</th>\n",
" <td>16.893333</td>\n",
" <td>19.168205</td>\n",
" <td>23.030769</td>\n",
" <td>5.827692</td>\n",
" <td>3.264525</td>\n",
" <td>2479.794872</td>\n",
" <td>0.136410</td>\n",
" <td>4.757949</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2003</th>\n",
" <td>16.780651</td>\n",
" <td>19.000958</td>\n",
" <td>22.836207</td>\n",
" <td>5.942529</td>\n",
" <td>3.358259</td>\n",
" <td>2525.574713</td>\n",
" <td>0.090996</td>\n",
" <td>4.911877</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2004</th>\n",
" <td>16.740642</td>\n",
" <td>19.067736</td>\n",
" <td>23.064171</td>\n",
" <td>5.957219</td>\n",
" <td>3.393626</td>\n",
" <td>2512.566845</td>\n",
" <td>0.000000</td>\n",
" <td>4.976827</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2005</th>\n",
" <td>16.851630</td>\n",
" <td>19.193825</td>\n",
" <td>23.297599</td>\n",
" <td>5.944254</td>\n",
" <td>3.399485</td>\n",
" <td>2518.610635</td>\n",
" <td>0.000000</td>\n",
" <td>5.192110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2006</th>\n",
" <td>16.626812</td>\n",
" <td>18.959239</td>\n",
" <td>23.048913</td>\n",
" <td>6.100543</td>\n",
" <td>3.549294</td>\n",
" <td>2539.175725</td>\n",
" <td>0.000000</td>\n",
" <td>5.315217</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2007</th>\n",
" <td>16.605684</td>\n",
" <td>18.978686</td>\n",
" <td>23.083481</td>\n",
" <td>6.166075</td>\n",
" <td>3.628539</td>\n",
" <td>2535.923623</td>\n",
" <td>0.000000</td>\n",
" <td>5.610124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008</th>\n",
" <td>16.900590</td>\n",
" <td>19.276327</td>\n",
" <td>23.455771</td>\n",
" <td>6.192923</td>\n",
" <td>3.637796</td>\n",
" <td>2536.436394</td>\n",
" <td>0.084246</td>\n",
" <td>5.773378</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2009</th>\n",
" <td>17.334459</td>\n",
" <td>19.735642</td>\n",
" <td>24.017736</td>\n",
" <td>6.122466</td>\n",
" <td>3.624839</td>\n",
" <td>2427.027027</td>\n",
" <td>0.000000</td>\n",
" <td>6.043074</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010</th>\n",
" <td>18.105500</td>\n",
" <td>20.588819</td>\n",
" <td>24.947701</td>\n",
" <td>5.965735</td>\n",
" <td>3.502548</td>\n",
" <td>2351.082056</td>\n",
" <td>0.000000</td>\n",
" <td>6.271416</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2011</th>\n",
" <td>18.669027</td>\n",
" <td>21.011504</td>\n",
" <td>25.169912</td>\n",
" <td>5.980531</td>\n",
" <td>3.521903</td>\n",
" <td>2333.982301</td>\n",
" <td>0.259292</td>\n",
" <td>6.560177</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012</th>\n",
" <td>19.362847</td>\n",
" <td>21.819444</td>\n",
" <td>26.105035</td>\n",
" <td>5.910590</td>\n",
" <td>3.460015</td>\n",
" <td>2289.973958</td>\n",
" <td>0.782118</td>\n",
" <td>6.706597</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013</th>\n",
" <td>20.661318</td>\n",
" <td>23.125000</td>\n",
" <td>27.504223</td>\n",
" <td>5.762669</td>\n",
" <td>3.327529</td>\n",
" <td>2210.768581</td>\n",
" <td>1.255068</td>\n",
" <td>6.896959</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014</th>\n",
" <td>21.033469</td>\n",
" <td>23.531429</td>\n",
" <td>27.978776</td>\n",
" <td>5.745306</td>\n",
" <td>3.289703</td>\n",
" <td>2198.040816</td>\n",
" <td>1.405714</td>\n",
" <td>6.985306</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2015</th>\n",
" <td>21.445830</td>\n",
" <td>24.038971</td>\n",
" <td>28.586906</td>\n",
" <td>5.635230</td>\n",
" <td>3.205085</td>\n",
" <td>2148.869836</td>\n",
" <td>2.208106</td>\n",
" <td>7.035853</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016</th>\n",
" <td>22.591918</td>\n",
" <td>25.150555</td>\n",
" <td>29.606973</td>\n",
" <td>5.463550</td>\n",
" <td>3.054415</td>\n",
" <td>2091.204437</td>\n",
" <td>4.546751</td>\n",
" <td>7.080032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017</th>\n",
" <td>22.761021</td>\n",
" <td>25.249033</td>\n",
" <td>29.554524</td>\n",
" <td>5.453210</td>\n",
" <td>3.026032</td>\n",
" <td>2096.558391</td>\n",
" <td>4.336427</td>\n",
" <td>7.225058</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2018</th>\n",
" <td>22.564732</td>\n",
" <td>25.019345</td>\n",
" <td>29.273065</td>\n",
" <td>5.438988</td>\n",
" <td>2.992239</td>\n",
" <td>2103.980655</td>\n",
" <td>3.519345</td>\n",
" <td>7.017113</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019</th>\n",
" <td>23.318147</td>\n",
" <td>25.627942</td>\n",
" <td>29.664389</td>\n",
" <td>5.368261</td>\n",
" <td>2.964679</td>\n",
" <td>2093.545938</td>\n",
" <td>5.565680</td>\n",
" <td>7.136674</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020</th>\n",
" <td>22.679426</td>\n",
" <td>25.267943</td>\n",
" <td>29.617225</td>\n",
" <td>5.071770</td>\n",
" <td>2.644994</td>\n",
" <td>2023.444976</td>\n",
" <td>2.282297</td>\n",
" <td>7.746411</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" city08 comb08 highway08 cylinders displ fuelCost08 \\\n",
"year \n",
"1984 17.982688 19.881874 23.075356 5.385438 3.165017 2313.543788 \n",
"1985 17.878307 19.808348 23.042328 5.375661 3.164080 2334.509112 \n",
"1986 17.665289 19.550413 22.699174 5.425620 3.183762 2354.049587 \n",
"1987 17.310345 19.228549 22.445068 5.412189 3.173949 2403.648757 \n",
"1988 17.333628 19.328319 22.702655 5.461947 3.194899 2387.035398 \n",
"1989 17.143972 19.125759 22.465742 5.488291 3.209926 2433.434519 \n",
"1990 17.033395 19.000928 22.337662 5.496289 3.217369 2436.178108 \n",
"1991 16.848940 18.825972 22.253534 5.598940 3.266809 2490.856890 \n",
"1992 16.805531 18.862623 22.439786 5.623550 3.276159 2494.736842 \n",
"1993 16.998170 19.104300 22.780421 5.602928 3.248540 2454.620311 \n",
"1994 16.918534 19.012220 22.725051 5.704684 3.333190 2461.507128 \n",
"1995 16.569804 18.797311 22.671148 5.892451 3.471776 2497.828335 \n",
"1996 17.289780 19.584735 23.569211 5.627426 3.234789 2375.032342 \n",
"1997 17.135171 19.429134 23.451444 5.666667 3.226933 2405.511811 \n",
"1998 17.113300 19.518473 23.546798 5.633005 3.201979 2382.635468 \n",
"1999 17.272300 19.611502 23.552817 5.667840 3.188794 2392.194836 \n",
"2000 17.221429 19.526190 23.414286 5.713095 3.200517 2429.702381 \n",
"2001 17.275521 19.479693 23.328211 5.720088 3.192452 2448.463227 \n",
"2002 16.893333 19.168205 23.030769 5.827692 3.264525 2479.794872 \n",
"2003 16.780651 19.000958 22.836207 5.942529 3.358259 2525.574713 \n",
"2004 16.740642 19.067736 23.064171 5.957219 3.393626 2512.566845 \n",
"2005 16.851630 19.193825 23.297599 5.944254 3.399485 2518.610635 \n",
"2006 16.626812 18.959239 23.048913 6.100543 3.549294 2539.175725 \n",
"2007 16.605684 18.978686 23.083481 6.166075 3.628539 2535.923623 \n",
"2008 16.900590 19.276327 23.455771 6.192923 3.637796 2536.436394 \n",
"2009 17.334459 19.735642 24.017736 6.122466 3.624839 2427.027027 \n",
"2010 18.105500 20.588819 24.947701 5.965735 3.502548 2351.082056 \n",
"2011 18.669027 21.011504 25.169912 5.980531 3.521903 2333.982301 \n",
"2012 19.362847 21.819444 26.105035 5.910590 3.460015 2289.973958 \n",
"2013 20.661318 23.125000 27.504223 5.762669 3.327529 2210.768581 \n",
"2014 21.033469 23.531429 27.978776 5.745306 3.289703 2198.040816 \n",
"2015 21.445830 24.038971 28.586906 5.635230 3.205085 2148.869836 \n",
"2016 22.591918 25.150555 29.606973 5.463550 3.054415 2091.204437 \n",
"2017 22.761021 25.249033 29.554524 5.453210 3.026032 2096.558391 \n",
"2018 22.564732 25.019345 29.273065 5.438988 2.992239 2103.980655 \n",
"2019 23.318147 25.627942 29.664389 5.368261 2.964679 2093.545938 \n",
"2020 22.679426 25.267943 29.617225 5.071770 2.644994 2023.444976 \n",
"\n",
" range speeds \n",
"year \n",
"1984 0.000000 3.928208 \n",
"1985 0.000000 3.924750 \n",
"1986 0.000000 3.984298 \n",
"1987 0.000000 4.037690 \n",
"1988 0.000000 4.129204 \n",
"1989 0.000000 4.166522 \n",
"1990 0.000000 4.238404 \n",
"1991 0.000000 4.301237 \n",
"1992 0.000000 4.318466 \n",
"1993 0.000000 4.339433 \n",
"1994 0.000000 4.332994 \n",
"1995 0.000000 4.356774 \n",
"1996 0.000000 4.364812 \n",
"1997 0.000000 4.402887 \n",
"1998 0.229064 4.419951 \n",
"1999 0.570423 4.421362 \n",
"2000 0.348810 4.508333 \n",
"2001 0.261251 4.660812 \n",
"2002 0.136410 4.757949 \n",
"2003 0.090996 4.911877 \n",
"2004 0.000000 4.976827 \n",
"2005 0.000000 5.192110 \n",
"2006 0.000000 5.315217 \n",
"2007 0.000000 5.610124 \n",
"2008 0.084246 5.773378 \n",
"2009 0.000000 6.043074 \n",
"2010 0.000000 6.271416 \n",
"2011 0.259292 6.560177 \n",
"2012 0.782118 6.706597 \n",
"2013 1.255068 6.896959 \n",
"2014 1.405714 6.985306 \n",
"2015 2.208106 7.035853 \n",
"2016 4.546751 7.080032 \n",
"2017 4.336427 7.225058 \n",
"2018 3.519345 7.017113 \n",
"2019 5.565680 7.136674 \n",
"2020 2.282297 7.746411 "
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(autos2\n",
" .groupby('year')\n",
" .mean()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comb08</th>\n",
" <th>speeds</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1984</th>\n",
" <td>19.881874</td>\n",
" <td>3.928208</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1985</th>\n",
" <td>19.808348</td>\n",
" <td>3.924750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1986</th>\n",
" <td>19.550413</td>\n",
" <td>3.984298</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1987</th>\n",
" <td>19.228549</td>\n",
" <td>4.037690</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1988</th>\n",
" <td>19.328319</td>\n",
" <td>4.129204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1989</th>\n",
" <td>19.125759</td>\n",
" <td>4.166522</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1990</th>\n",
" <td>19.000928</td>\n",
" <td>4.238404</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1991</th>\n",
" <td>18.825972</td>\n",
" <td>4.301237</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1992</th>\n",
" <td>18.862623</td>\n",
" <td>4.318466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1993</th>\n",
" <td>19.104300</td>\n",
" <td>4.339433</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1994</th>\n",
" <td>19.012220</td>\n",
" <td>4.332994</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1995</th>\n",
" <td>18.797311</td>\n",
" <td>4.356774</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1996</th>\n",
" <td>19.584735</td>\n",
" <td>4.364812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1997</th>\n",
" <td>19.429134</td>\n",
" <td>4.402887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1998</th>\n",
" <td>19.518473</td>\n",
" <td>4.419951</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999</th>\n",
" <td>19.611502</td>\n",
" <td>4.421362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2000</th>\n",
" <td>19.526190</td>\n",
" <td>4.508333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2001</th>\n",
" <td>19.479693</td>\n",
" <td>4.660812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2002</th>\n",
" <td>19.168205</td>\n",
" <td>4.757949</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2003</th>\n",
" <td>19.000958</td>\n",
" <td>4.911877</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2004</th>\n",
" <td>19.067736</td>\n",
" <td>4.976827</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2005</th>\n",
" <td>19.193825</td>\n",
" <td>5.192110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2006</th>\n",
" <td>18.959239</td>\n",
" <td>5.315217</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2007</th>\n",
" <td>18.978686</td>\n",
" <td>5.610124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008</th>\n",
" <td>19.276327</td>\n",
" <td>5.773378</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2009</th>\n",
" <td>19.735642</td>\n",
" <td>6.043074</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010</th>\n",
" <td>20.588819</td>\n",
" <td>6.271416</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2011</th>\n",
" <td>21.011504</td>\n",
" <td>6.560177</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012</th>\n",
" <td>21.819444</td>\n",
" <td>6.706597</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013</th>\n",
" <td>23.125000</td>\n",
" <td>6.896959</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014</th>\n",
" <td>23.531429</td>\n",
" <td>6.985306</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2015</th>\n",
" <td>24.038971</td>\n",
" <td>7.035853</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016</th>\n",
" <td>25.150555</td>\n",
" <td>7.080032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017</th>\n",
" <td>25.249033</td>\n",
" <td>7.225058</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2018</th>\n",
" <td>25.019345</td>\n",
" <td>7.017113</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019</th>\n",
" <td>25.627942</td>\n",
" <td>7.136674</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020</th>\n",
" <td>25.267943</td>\n",
" <td>7.746411</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comb08 speeds\n",
"year \n",
"1984 19.881874 3.928208\n",
"1985 19.808348 3.924750\n",
"1986 19.550413 3.984298\n",
"1987 19.228549 4.037690\n",
"1988 19.328319 4.129204\n",
"1989 19.125759 4.166522\n",
"1990 19.000928 4.238404\n",
"1991 18.825972 4.301237\n",
"1992 18.862623 4.318466\n",
"1993 19.104300 4.339433\n",
"1994 19.012220 4.332994\n",
"1995 18.797311 4.356774\n",
"1996 19.584735 4.364812\n",
"1997 19.429134 4.402887\n",
"1998 19.518473 4.419951\n",
"1999 19.611502 4.421362\n",
"2000 19.526190 4.508333\n",
"2001 19.479693 4.660812\n",
"2002 19.168205 4.757949\n",
"2003 19.000958 4.911877\n",
"2004 19.067736 4.976827\n",
"2005 19.193825 5.192110\n",
"2006 18.959239 5.315217\n",
"2007 18.978686 5.610124\n",
"2008 19.276327 5.773378\n",
"2009 19.735642 6.043074\n",
"2010 20.588819 6.271416\n",
"2011 21.011504 6.560177\n",
"2012 21.819444 6.706597\n",
"2013 23.125000 6.896959\n",
"2014 23.531429 6.985306\n",
"2015 24.038971 7.035853\n",
"2016 25.150555 7.080032\n",
"2017 25.249033 7.225058\n",
"2018 25.019345 7.017113\n",
"2019 25.627942 7.136674\n",
"2020 25.267943 7.746411"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# watch order of column filtering/aggregation\n",
"(autos2\n",
" .groupby('year')\n",
" [['comb08', 'speeds']]\n",
" .mean()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f22ce10b490>]"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"plt.style.use('pandas1book') \n",
"sns.set_context('talk')\n",
"plt.plot(range(10))"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='year'>"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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DBEiGotEIlRVVVFXV0e/fv1SHhQkIAjRjlVUVLBr1y5KSkro3r07Pp+0And0ZWVlbN26ldLSUnr06JHSvOWvR4h2rKqqiqysLEpKSiQYdBLdunUjOzub2tralOctf0FCtGOu6xIIBGSk0k7G7/e3yr0iCQhCCCEACQhCCCE8EhCEEEIAEhCEEGK/nn/+eZRSfP755+kuSquSbqdCCJFia9as4c4772T58uUEg0EmTJjAjTfeSLdu3fZIt23bNv7whz+wdOlSduzYQa9evTjttNP4/ve/T1FRUZuXWwKCEEKk0JYtW5g2bRpFRUVcc801hEIhHn30Ub788kueeeYZgkH71rxQKMSFF15IKBRi2rRp9O7dm88++4zHHnuM5cuXM3fu3DYvuwQEIYRIoQceeIC6ujqefPJJevXqBcDhhx/OjBkzmD9/Pt/5zncAeOONN/jmm2948MEHOfnkk+Pr5+Tk8Oijj/L1119z0EEHtWnZ5R6CECKjbd68mVmzZjF+/HgOO+wwTj31VH71q1/Fl69cuZKZM2cyevRoRo8ezcyZM/niiy/2yGPOnDkopVi/fj3XXHMNY8aM4bjjjuOhhx4CYO3atVx22WUceeSRnHzyycyfP7/JsoRCIW655RaOPvpoxo4dy80330xVVdUeaV599VUmTpwYDwYAxx13HIMGDWLhwoXxefXrde/efY/1S0pKABsY2poEBCFExtq6dSsXXHAB//znPzn77LO55ZZbOPPMM3nzzTcBWLVqFdOnT2f16tVcccUVXHHFFaxevZqpU6eyZs2aRvn95Cc/we/3c/3116OU4p577uHpp59m5syZDBs2jBtuuIHCwkJmzZrFxo0bG61/2223sX79eq6++mrOOussnnvuOa699to9yrtjxw5GjRrVaN3DDz98j5vSRx11FD6fjzvuuIMVK1awZcsWXn/9dR577DHOO++8lA9LkQxpMhKigzImArGt6S4G+HvhOMEWrXr33XdTVlbGc889x8iRI+Pzf/rTnwIwe/ZsYrEYc+fOpV+/fgCcffbZnHHGGcyePZs5c+bskd+YMWO49dZbATj//PM54YQTuO2227j99tu54IILADj22GM544wzmD9/Pj/84Q/3WD8nJ4fHHnuMQMCeOnv06MGcOXN47733GDduHNu2bYvPb6hHjx7s2LGDWCyG3+9n6NCh/PKX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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(autos2\n",
" .groupby('year')\n",
" [['comb08', 'speeds']]\n",
" .mean()\n",
" .plot()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='year'>"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEdCAYAAAAM1BBYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABYuElEQVR4nO3dd5hU1fnA8e+dur0Xll7ESxUpoig2sMSG2KIoGhV7otGoiUQTjcYkGv1JoomKNbHFLooFFRQVGyCIgFyk92V7nX7P7487M2wDdpfZnS3v53n2mZlbzj1zd3feOV1TSiGEEELY4p0BIYQQHYMEBCGEEIAEBCGEEGESEIQQQgASEIQQQoRJQBBCCAGAI94ZaIYgVuCqjHdGhBCik0gDTFr4Ga81ZxyCrusFwK+Bw4FxQApwvGEYnzY4bhPQr4kk7jMM47aWZKwOE9Baea4QQnRXihbWAjU3eujA74B1wArgyH0cuxSY1WDbypZkqoFKIP0AzhdCiO6oxbUqzQ0IS4EcwzBKdF2fCry5j2O3GYbxfEszIoQQIr6aFRAMw6hqSaK6rrsBu2EYta3KlRBCiHbXFr2MTgJqgBpd19frun5VG1xDCCFEjMU6IKwA7gTOAa4EioHHdV1vbYOyEEKIdhLTbqeGYUyp+1rX9WeAL4A/6Lr+qGEYFbG8nhBCiNhp03EIhmGEdF2fBfwPmAB80BbXUUpRXFyM1+vFNM22uIToBmw2Gw6Hg7S0NJKTk+OdHSHaXXuMVN4afsxqi8SVUmzfvp3i4mICgUBbXEJ0E4FAgMrKSrZs2cK2bdvky4VoM0oplG8hKlQS76zU0x4jlQeGH4vaIvHi4mKqqqrIz88nK6tNYo7oRkzTpKSkhOLiYioqKsjMzIx3lkRX5H0LVfE7cE1Ay/pPvHMTFbMSgq7rWbqu2xpsSwBuBaqAr2J1rbq8Xi9ut1uCgYgJm81GTk4OLpeL6urqeGdHdFHKM9d6Elwb34w00OwSgq7rd4SfDg0/Xqzr+kSg3DCMR4ApwO26rr8GbAKygV8ABwPXGobRJv9dpmlit9vbImnRTWmahsPhkCoj0SaUWQ3+r60XZglKBdA0Z3wzFdaSKqN7Gry+PPy4GXgE+AFYA1wM5AI+4DvgZsMw5h5gPoUQomvwfQbUae80i8DeM27ZqavZAcEwjH1OMGcYxlLgjAPOkRBCdGHK93H9DaHCDhMQZD0EIYRoJ0r5wbew/kZzd3wy0wQJCGK/3njjDXRd58cff4x3VoTo3PyLQVUBGtiyrW2hwrhmqS4JCCLm1q9fz4wZMxg9ejTjx4/nd7/7HaWlpY2O2717N3fccQeTJk1i1KhRnHTSSTzwwANUVspaSKJrUr6PrCfOUeDQrW1mxwkInWHFNNGJ7Nq1i4suuoi0tDRuuukmamtrefrpp1m7di2vvPIKTqfVm6K2tpYLLriA2tpaLrroInr06MHq1at55pln+O6773jxxRfj/E6EiC2lFHjnA6C5T0AF11k7OlAJQQKCiKnHHnsMn8/Hc889R35+PgCHHHIIl112GXPmzOHcc88F4NNPP2X79u08/vjjHHfccdHzExISePrpp9m6dSt9+vSJx1sQom0EV0KkNJBwAnjCqwpIG4Jorp07dzJz5kwmTpzIyJEjOfHEE/nzn/8c3b9q1apo9czo0aOZMWMGa9asqZfGww8/jK7rbN68mZtuuokxY8Zw5JFHMnv2bAA2btzI5ZdfzqGHHspxxx3HnDlzmsxLbW0td9xxB4cddhjjxo3j9ttvbzR468MPP2TSpEnRYABw5JFH0r9/f95///3otsh52dnZ9c7PyckBrMAgRFeivOHeRfaBaI6BaLbw/0gHKiFIQOjACgsLOe+88/jggw84/fTTueOOOzj11FNZuNDqpfDTTz8xffp01q1bx9VXX83VV1/NunXruPDCC1m/fn2j9G644Qbsdju33HILuq7z4IMP8r///Y8ZM2YwePBgbr31VlJTU5k5cybbtm1rdP5dd93F5s2b+fWvf81pp53G66+/zm9+85t6+S0pKWHEiBGNzj3kkEPqNUqPHTsWm83Gvffey/Lly9m1axcLFizgmWee4eyzzyY3NzcWt1CIjiPS3TRhsvVoz7MeO1AJoctWGSkV6BiR157f6lGIDzzwAKWlpbz++usMHTo0uv3GG28EYNasWYRCIV588UV69eoFwOmnn84pp5zCrFmzePjhh+ulN2bMGO68804AzjnnHI4++mjuuusu7rnnHs477zwAJkyYwCmnnMKcOXP45S9/We/8hIQEnnnmGRwO688mNzeXhx9+mG+//Zbx48eze/fu6PaGcnNzKSkpIRQKYbfbGTRoEHfffTf3338/559/fvS4888/n7vuuqtV90uIjkoF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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(autos2\n",
" .groupby('year')\n",
" [['comb08', 'speeds', 'highway08']]\n",
" #.mean()\n",
" #.median()\n",
" #.quantile(.3)\n",
" .std()\n",
" #.var()\n",
" .plot()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>comb08</th>\n",
" <th>speeds</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th>country</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1984</th>\n",
" <th>Other</th>\n",
" <td>21.417330</td>\n",
" <td>3.969054</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>17.797119</td>\n",
" <td>3.872749</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1985</th>\n",
" <th>Other</th>\n",
" <td>21.373068</td>\n",
" <td>3.958057</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>18.025157</td>\n",
" <td>3.886792</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1986</th>\n",
" <th>Other</th>\n",
" <td>21.213622</td>\n",
" <td>4.069659</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>17.645390</td>\n",
" <td>3.886525</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1987</th>\n",
" <th>Other</th>\n",
" <td>20.710414</td>\n",
" <td>4.142653</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>17.326007</td>\n",
" <td>3.902930</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1988</th>\n",
" <th>Other</th>\n",
" <td>20.814642</td>\n",
" <td>4.205607</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>17.372951</td>\n",
" <td>4.028689</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2016</th>\n",
" <th>Other</th>\n",
" <td>24.439716</td>\n",
" <td>7.296859</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>27.701818</td>\n",
" <td>6.301818</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2017</th>\n",
" <th>Other</th>\n",
" <td>24.910521</td>\n",
" <td>7.474926</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>26.496377</td>\n",
" <td>6.304348</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2018</th>\n",
" <th>Other</th>\n",
" <td>24.779868</td>\n",
" <td>7.391345</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>25.925267</td>\n",
" <td>5.601423</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2019</th>\n",
" <th>Other</th>\n",
" <td>25.456922</td>\n",
" <td>7.545983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>26.250000</td>\n",
" <td>5.647887</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2020</th>\n",
" <th>Other</th>\n",
" <td>25.174359</td>\n",
" <td>7.743590</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>26.571429</td>\n",
" <td>7.785714</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>74 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" comb08 speeds\n",
"year country \n",
"1984 Other 21.417330 3.969054\n",
" US 17.797119 3.872749\n",
"1985 Other 21.373068 3.958057\n",
" US 18.025157 3.886792\n",
"1986 Other 21.213622 4.069659\n",
" US 17.645390 3.886525\n",
"1987 Other 20.710414 4.142653\n",
" US 17.326007 3.902930\n",
"1988 Other 20.814642 4.205607\n",
" US 17.372951 4.028689\n",
"... ... ...\n",
"2016 Other 24.439716 7.296859\n",
" US 27.701818 6.301818\n",
"2017 Other 24.910521 7.474926\n",
" US 26.496377 6.304348\n",
"2018 Other 24.779868 7.391345\n",
" US 25.925267 5.601423\n",
"2019 Other 25.456922 7.545983\n",
" US 26.250000 5.647887\n",
"2020 Other 25.174359 7.743590\n",
" US 26.571429 7.785714\n",
"\n",
"[74 rows x 2 columns]"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# add country\n",
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['comb08', 'speeds']]\n",
" .mean()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th></th>\n",
" <th colspan=\"3\" halign=\"left\">comb08</th>\n",
" <th colspan=\"3\" halign=\"left\">speeds</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th></th>\n",
" <th>min</th>\n",
" <th>mean</th>\n",
" <th>second_to_last</th>\n",
" <th>min</th>\n",
" <th>mean</th>\n",
" <th>second_to_last</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th>country</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1984</th>\n",
" <th>Other</th>\n",
" <td>8</td>\n",
" <td>21.417330</td>\n",
" <td>14</td>\n",
" <td>3</td>\n",
" <td>3.969054</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>9</td>\n",
" <td>17.797119</td>\n",
" <td>17</td>\n",
" <td>3</td>\n",
" <td>3.872749</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1985</th>\n",
" <th>Other</th>\n",
" <td>8</td>\n",
" <td>21.373068</td>\n",
" <td>20</td>\n",
" <td>3</td>\n",
" <td>3.958057</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>10</td>\n",
" <td>18.025157</td>\n",
" <td>15</td>\n",
" <td>3</td>\n",
" <td>3.886792</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1986</th>\n",
" <th>Other</th>\n",
" <td>7</td>\n",
" <td>21.213622</td>\n",
" <td>11</td>\n",
" <td>3</td>\n",
" <td>4.069659</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>10</td>\n",
" <td>17.645390</td>\n",
" <td>17</td>\n",
" <td>3</td>\n",
" <td>3.886525</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1987</th>\n",
" <th>Other</th>\n",
" <td>7</td>\n",
" <td>20.710414</td>\n",
" <td>12</td>\n",
" <td>3</td>\n",
" <td>4.142653</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>9</td>\n",
" <td>17.326007</td>\n",
" <td>13</td>\n",
" <td>3</td>\n",
" <td>3.902930</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1988</th>\n",
" <th>Other</th>\n",
" <td>7</td>\n",
" <td>20.814642</td>\n",
" <td>12</td>\n",
" <td>3</td>\n",
" <td>4.205607</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>9</td>\n",
" <td>17.372951</td>\n",
" <td>14</td>\n",
" <td>3</td>\n",
" <td>4.028689</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2016</th>\n",
" <th>Other</th>\n",
" <td>12</td>\n",
" <td>24.439716</td>\n",
" <td>30</td>\n",
" <td>1</td>\n",
" <td>7.296859</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>12</td>\n",
" <td>27.701818</td>\n",
" <td>93</td>\n",
" <td>1</td>\n",
" <td>6.301818</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2017</th>\n",
" <th>Other</th>\n",
" <td>11</td>\n",
" <td>24.910521</td>\n",
" <td>24</td>\n",
" <td>1</td>\n",
" <td>7.474926</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>12</td>\n",
" <td>26.496377</td>\n",
" <td>126</td>\n",
" <td>0</td>\n",
" <td>6.304348</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2018</th>\n",
" <th>Other</th>\n",
" <td>11</td>\n",
" <td>24.779868</td>\n",
" <td>12</td>\n",
" <td>0</td>\n",
" <td>7.391345</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>14</td>\n",
" <td>25.925267</td>\n",
" <td>116</td>\n",
" <td>0</td>\n",
" <td>5.601423</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2019</th>\n",
" <th>Other</th>\n",
" <td>11</td>\n",
" <td>25.456922</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>7.545983</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>14</td>\n",
" <td>26.250000</td>\n",
" <td>104</td>\n",
" <td>0</td>\n",
" <td>5.647887</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">2020</th>\n",
" <th>Other</th>\n",
" <td>15</td>\n",
" <td>25.174359</td>\n",
" <td>20</td>\n",
" <td>0</td>\n",
" <td>7.743590</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>US</th>\n",
" <td>22</td>\n",
" <td>26.571429</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>7.785714</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>74 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" comb08 speeds \n",
" min mean second_to_last min mean second_to_last\n",
"year country \n",
"1984 Other 8 21.417330 14 3 3.969054 5\n",
" US 9 17.797119 17 3 3.872749 4\n",
"1985 Other 8 21.373068 20 3 3.958057 4\n",
" US 10 18.025157 15 3 3.886792 4\n",
"1986 Other 7 21.213622 11 3 4.069659 4\n",
" US 10 17.645390 17 3 3.886525 4\n",
"1987 Other 7 20.710414 12 3 4.142653 4\n",
" US 9 17.326007 13 3 3.902930 4\n",
"1988 Other 7 20.814642 12 3 4.205607 4\n",
" US 9 17.372951 14 3 4.028689 4\n",
"... ... ... ... ... ... ...\n",
"2016 Other 12 24.439716 30 1 7.296859 7\n",
" US 12 27.701818 93 1 6.301818 1\n",
"2017 Other 11 24.910521 24 1 7.474926 7\n",
" US 12 26.496377 126 0 6.304348 1\n",
"2018 Other 11 24.779868 12 0 7.391345 0\n",
" US 14 25.925267 116 0 5.601423 1\n",
"2019 Other 11 25.456922 22 0 7.545983 8\n",
" US 14 26.250000 104 0 5.647887 1\n",
"2020 Other 15 25.174359 20 0 7.743590 0\n",
" US 22 26.571429 24 0 7.785714 0\n",
"\n",
"[74 rows x 6 columns]"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# can go deeper and apply multiple aggregates\n",
"def second_to_last(ser):\n",
" return ser.iloc[-2]\n",
"\n",
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['comb08', 'speeds']]\n",
" .agg(['min', 'mean', second_to_last])\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='year,country'>"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEcCAYAAAAoSqjDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABvwElEQVR4nO2dd5gkRdnAfz1hc7qc8x1FOMLBAQJHTqKEA0QygmQQREWCoPCpgCIIeEhSMkiSDJIRkCOHI1Nc2stxb8NtmljfH9Xd093Te7d7my7U73n2mZmu6u7q2pl66w31lqWUwmAwGAwGgEhvN8BgMBgM6w9GKBgMBoPBxQgFg8FgMLgYoWAwGAwGFyMUDAaDweAS6+0GdJI0WrA19HZDDAaDYQOiAsgSIgOsDTwkNQtYvd0Ig8Fg2ABRhFiLNnTzkdEQDAaDYd0IHT83dKFgMBgMhi7ECAWDwWAwuBihYDAYDAYXIxQMBoPB4GKEgsFgMBhcNvR1CoYNgKamJhoaGkin02Sz2d5ujqGbiEQiFBUV0b9/fyzLRIpvqBihYOg2stksixcvZvXq1UQiEeLxONFotLebZegmUqkUjY2NJBIJhg0bttEKBpVZAulqrMJdersp3YIRCoZuo76+ntWrV9O/f3/69etHJGKslRs7q1atYtmyZaxcuZIBAwb0dnO6BVV7GqRnQp/7sQp37u3mdDnmV2roNhobGykoKKB///5GIGwi9O3bl8LCQlpbW3u7Kd2CyjZqgQCQ+qh3G9NNmF+qodvIZrPEYrGN1oxgCCcajW68vqPMXPetSslebEj3YYSCwWAwtJf0XM97IxQMBoNhk0al5+Q+ZKpRqqX3GtNNGKFgMBgM7cVjPgKV8y9sRBihYDBs4DzxxBMIIfjmm296uykbP15NAWAj9CsYoWAwbGLMnj2bU089lUmTJrHTTjtx8cUXs2rVqrx6y5cv5/LLL2efffZh22235YADDuC6666joWHTzFivVAbS1fanuD62EfoVzDoFg2ETYunSpRx//PFUVFTwi1/8gubmZu666y6+++47Hn30UeJxPdg1NzdzzDHH0NzczPHHH8/gwYP5+uuvufvuu/nkk0/417/+1ctP0gtkFgMJ/b5wD0i8tlE6m41QMBg2IW677TYSiQT3338/gwYNAmCbbbbhlFNO4emnn+ZHP/oRAG+88QaLFi3i9ttvZ6+99nLPLyoq4q677mLBggWMGDGiNx6h93D9CTGswv1QidcgJVFK+cKulUpD8h2IT8aKlHRLU1Tif6j6X2OVX4xVfHiXXtuYjwyGTrBkyRIuvfRSpkyZwtZbb83+++/PH//4R7f8q6++ck01kyZN4tRTT+Xbb7/1XWPatGkIIZg3bx6/+MUv2H777dl111254447AJg7dy4//elP2W677dhrr714+umnQ9vS3NzM5Zdfzo477sjkyZO57LLLaGxs9NV5+eWX2WeffVyBALDrrrsyevRoXnjhBfeYc16/fv185/fv3x/QwmGTwwlHjY6A+Fb6vaqD7DJfNdV4M6r2NNTqq7utKarxZsiuQqW+7PJrG6FgMKwjy5Yt46ijjuLFF1/k4IMP5vLLL+cHP/gBb775JgAzZ87khBNOYNasWZx55pmceeaZzJo1i+OOO47Zs2fnXe/8888nGo1y4YUXIoTg+uuv5+GHH+bUU09lwoQJ/PrXv6a8vJxLL72UhQsX5p1/5ZVXMm/ePH7+85/zwx/+kMcff5xf/vKXvvbW1NQwceLEvHO32WYbn6N6hx12IBKJcNVVVzFjxgyWLl3K66+/zt13380RRxyx0aawWBNuOGpsrP5zDC3pnJBXSkGLLbRbX9Jaw7rcK1ODSn7WRjvmQ+pTAKzC/dbp+mvCmI8MvYJSKcgsW3vF7iY6CMuKr9Op1113HatWreLxxx9niy22cI9fcMEFANx4441kMhn+9a9/MWzYMAAOPvhgDjroIG688UamTZvmu97222/PFVdcAcCRRx7J7rvvzpVXXskf/vAHjjrqKAB22WUXDjroIJ5++mnOPfdc3/lFRUXcfffdxGL6Zz1gwACmTZvGBx98wE477cTy5cvd40EGDBhATU0NmUyGaDTKuHHj+P3vf8+1117L0Ucf7dY7+uijufLKK9epvzZ4HPNRbCyWVYCKjdM+hZSEwr10WfobyC7S71U9pGZAweQO3UZlG1GrjoLMQqi6BasoMPC3PqNfI4OgYKd1fpy2MELB0OMolUKtPAgy83u7KRAdCf1f6LBgyGazvPbaa+y3334+gQBgWRaZTIbp06ez//77uwIBYPjw4ey///7897//dQdgB2fgBygsLEQIwSeffMLUqVPd42PHjqWioiJUUzj66KNdgQBw/PHHM23aNN566y122mknEgntJC0oKMg7t7CwEIDW1lZKS0sBGDx4MNtuuy177LEHQ4cO5aOPPuL++++nsrKSX/3qVx3pro0DW1OwomP055iAtESlJY5HQbW+4jtFJd7A6qhQaLxJCwRANd4Chfu6PgulFKrFFgrFh2BZXZ912AgFg2EdWLVqFU1NTUyYMKHN8paWFsaMGZNXNnbsWJ5//nlqa2tdGz3AkCFDfPXKy8vp37+/GxHkPR4WFjp69Gjf5z59+lBZWcmiRXrm6gz8yWQy71xHYDi+go8//pizzjqLf//7367Q22+//SgrK+Pmm2/m8MMPZ+zYsaHPvjGiso2Q1ZqWNh2BFd8c1fqMPwIp8bJ+tUpANUPiTSi/0H8tlYGm2yAyEIp/5HdSJz+D5vtyldNfaqd14W76c+pzyFTrWxQd2qXP6GCEgqHHsaw49H9hgzcfdTVhe020tf+EUqrD1x84cCAAK1asyCtbsWIF/fr1c+/3yCOPMHDgwDwtaJ999mHatGnMmDFjkxIKZDyL1mIeTQEgPQelkjpk1V7hbJWdh1r9Z61JZBZjRYfmzm99XmsDoOuXX4JlRbQG3fBbQOlrW2WQ+hjV9A8sWygox3QUE1jxzbvlUY1QMPQKlhWH2PDebsY607dvX0pLS5k5MzzNQd++fSkuLmbu3Ll5ZXPnzqWkpIQ+ffp0aZuqq6uZPDlnqqitraW+vp6hQ/WANGjQIPr27cuXX+ZHrHz++ec+AeD4F4Kk09pxGla2UeNEHllVWBH7/+YIBTKQngWJ6fpjZCCUnASNt2m/QuJNKDkWsM0/Tffkrtt8D0o1QMUfoeke22ltYVX8EVQdqvZ0SL6DSn0Bsc2h9XndjG7SEqALoo+EEDsKIf4uhPhaCNEkhJgvhHhYCDE+UO8NIYQK+Xu4s20wGHqaSCTCvvvuy6uvvsrXX3/tK1NKEY1G2W233XjllVdYvHixW7Z48WJeeeUVpkyZ0uW70D3yyCPuoA3w4IMPArDHHnu4xw444ABef/11li3LaWnvvvsu1dXVfP/733ePjR49mmXLlvHRR/49A5577jmAPA1iY8cXeeQQGQCWLSDSEpWw/QmF++lJT+EUfW7ijdw5qU+0SQigYHf92vIEqvZMVKMdeFByIlbBtlCwhyt4VOM/IDkdsqsAC4oP7vqHtOkKTeFiYDfgMeBzYDDwM+BTIcROUkpvQpb5wGWB86u7oA0GQ4/zy1/+kunTp3P88cdzzDHHMGbMGJYsWcJ//vMfXnrpJS644ALeeecdjjvuOI49Vs8UH3roIaLRqBuh1JW0trZyyimncOCBBzJz5kweeeQRpkyZws4753YHO+uss3jxxRc56aSTOOGEE2hububOO+9k880357DDDnPrHX/88TzxxBOceeaZnHDCCQwZMoQPP/yQ5557jt133z00rHWjJp2LPHKwLAsVF5B8D5X4n440Aqyi/fVr4V6o1uch8S5KtWJZRaime/XJ8a2x+vwT1fhXaLodkv/TxyODscoucK9P6Rmo+l9B4iWUsx6iYGesqN//1JV0hVD4K3CclNL1XgkhHgG+QAuMkz11a6WUD3TBPQ2GXmfIkCE8+uij3HjjjTz55JM0NTUxZMgQdwXwhAkTeOCBB7j++uu57bbbAB12euGFFzJu3Lgub88VV1zBk08+yU033UQ2m+Xwww/nssv8c7AhQ4bwwAMP8Kc//Ynrr7+eeDzOXnvtxaWXXuqLSho7diyPP/44N954I08//TQrV65k4MCBnHbaaZx33nld3vb1HtunYMUCfpTY5pB8D1r/oz9bFbkw0cLdAQtoheT7qOg41xFtlZyCZVlY5b9CRSpRq6+1T78CK1KWu37RQdB4g45GctYmdKPpCMBaF4dVexBCfAykpZQ725/fAKqAyUCRlLKx7bPbTR1Q2QXXMXQD8+bNA2DUqFG93BJDT7Kx/d+VyqCWbQsksapuxSraN1fW/Diq4dJc5aLDiFT9xf2YrTlaD+YlxwOF0HwXRAZiDfivL8BBJT8C1Yplm5x89296ALX69/anAqyB72JFyrvi0erRY7KPblnRLISwgEHAykDRFkATsFoIsVgI8RshhFlVbTAY1l8yiwDbEBLUFOLC99ExHbmfnUVtra9By2P6WMkJeRFvVsHkUIEAQMmREOmr3xft21UCoU26a0A+HhgGPOo5Nhu4CjgGbVL63P58Sze1wWAwGDqPJxEe0UDEXGw8uWG0yDYZeSjcU79ml4JareuUHE1HsKxirIqroOB7WGXnd7DxHafLQ1KFEJsDfwfeBu53jkspTw1UvVcI8ShwhhDiBinlxpeD1mAwbPi4ifBG5s/wrSJUdLT2ORROwbKK/efGttDpKBwncfHUXEhrB7CK9vWZrbqTLtUUhBCDgeeBWuAoKWV2Ladcj/bE7N2V7TAYDIauIheOmr86HcAqOQ4iA7BKT8svs6yctgBYpSd1Sxu7ki4TCkKISuAFtOP3QCnl0nactsB+7dtV7TAYDIYuJZMfjurFKj2JyMDpWAXbh5eXHA3EofhIrNj40DrrE11iPhJCFAHPApsB+3bAFOT0cv66e4PBYOgFVEp60lpYkPpOv4uuW1oPK741DPpcX2sDoNNCQQgRBR4BdgEOk1K+F1KnAkhIKROB834DZIFXO9sOg8Fg6Cyq6V7U6qvCC9swH7WH7shm2l10haZwPXAoWlPoK4Q4wVPWKKV8Ctge+JcQ4iFgFlAG/Bi9ZuHPUsr8BDEGg8HQg6im+3ICwSoFPE7l+ESIb90r7eppukIobGe/HmL/eZkHPGW/TgeORK9fyAJfAidLKe/tgjYYDAbDOqMXiNnbqBbshtXnVixrE9xylC4QClLKvdpRZy5w1NrqGQwGQ0+jmh/MrRgu2HWTFghg9mg2GAybMKr1v6iG/9MfCnbZ5AUCGKFgMGwyLFy4ECEETzzxRG83Zb1AqRRq9Z/0h/j2WH1uy198tglihILBYNhoUa0vk111qg4zDdLymL0GIYJV8XsjEGzMzmsGg2GDRWVWABms6ODw8tXXQmY+qm4u9HvcTTGhsk2oxpt1peIjsOKb9VCL13+MpmAwGDZIVLYJVXMYauUhtnAIlKfnQ2a+/pBZiKq7EKXsbUSb74LsSqCwR5LMbUgYoWAwrCONjY1cddVV7LPPPkycOJFddtmFU045ha+++grQm9yfc845vPnmmxx66KFsvfXWHHLIIbz55pt516qrq+MPf/gDe+yxBxMnTuTAAw/kvvvuy6vX2trKDTfcwL777svEiRPZe++9uemmm3zbcAI0NDRwySWXsMMOOzB58mQuvvhiVq9enXe9FStWcOmll7r3nTJlCmeffTYLFy7sol7qRtIz9cCu6iHxWn550t4z2VlvkPwfqvHvqMxKVNOd+ljpyW1qGZsqxnxkMKwjV1xxBW+88QYnnHACI0aMYNWqVXz88cfMmjWLrbbaCoA5c+bw61//mmOPPZbDDz+cxx57jHPOOYf777+f7bfXuXKam5s58cQTWblyJccccwyDBg3i/fff56qrrqKhoYGf/exnAGSzWc466yw+++wzjjnmGEaPHs1XX33FbbfdxtKlS7nmmmsAvUf0Oeecw8cff8yxxx7L2LFjeeWVV7j44ovznuG8885j4cKFHHvssQwcOJCVK1fyzjvvsGTJEoYPH55Xf70ik1vzqhKvY5Uc4ytWCXuLy6IDINIHmh+ApptRyXdANYNVhVV6Rk+2eIPACAVDr5BVKRLp5b3dDApjA4kE0iG3lzfffJOzzz6b007Lz47pMHfuXG699Vb22WcfAI444ggOOOAAbrjhBu6/X2eWv/vuu1m0aBFPP/00I0aMAOCYY46hoqKCO+64gxNPPJHKykqeeeYZPvjgAx566CG23XZb9x7Dhw/n+uuv57TTTmPcuHG89tprfPjhh1x66aWcfPLJABx77LGcdJI/Q2dDQwOffvopN954IwcddJB7/Oyzz16n/uhpVLo69yHxDirbjBUp0WUqpbfJBKyCKVB8CCr1ld4FLfWJPl52brdvWLMhYoSCocfJqhRvLzyYlvSCtVfuZopjI5gy/Ll1EgwVFRV88MEHHHnkkfTpE54jf+jQoa5AAKisrOTggw/mX//6F83NzZSUlPDSSy+x0047UVpayqpVq9y6U6ZM4eGHH+azzz5jjz324KWXXmLChAmuVuKwyy67APDBBx8wbtw43nrrLeLxOEcfndvMJRqNcsIJJ/DRRx+5x4qKiojH4/zvf/9jzz33pKSkpMN90Ktkqj0fkpB8W2sFAKnPQdk7/hbuhmUVQNVNqJrDIVujN8spObanW7xBYISCwbCOXHjhhVxyySVMmTKFrbfemj333JNDDz2UYcOGuXVGjhyZd96oUaPIZrMsWbKEcePGMW/ePKSU7uAexBEA8+bNY/bs2Wutt2jRIgYNGkRxsT/EcswYf0K3goICLrzwQv785z/z3HPPMWnSJPbee28OPfRQ+vbdALLZO/sc2KjE61i2UFCJt/XB2ATXZ2BFB0Of21GNt2KVnq4FhSEPIxQMPU7EijNl+HMbvPnoBz/4AZMnT+bVV19l+vTp3HHHHdx+++1MmzaN3Xfffe0XsMlms+y+++789Kc/DS0fP368W2/LLbfk17/+dWg9x/TUEU4++WT23XdfXn31Vd5++22uu+46br31Vu69914233zzDl+vp1AqC+l5+kPB97SpqPW/qIqMzkjqOJkLdvOdZ8W3wepzaw+3dsPCCAVDrxCx4hTHh6294nrOwIEDOe644zjuuONYtWoVRxxxBLfeeqsrFObPn593zrx584hEIgwZMgTQ2kQikWDXXXdd471GjhzJrFmz1lpv2LBhvP/++7S0tPi0hblzw5MRjxgxglNOOYVTTjmFBQsWcOihh3LnnXfyl7/8ZY336VWyy4BWAKzSU1HJ90DVQmoGKjZem48Aq3BKLzZyw8SEpBoM60Amk8kL8ezbty+DBw8mkXC3DWHx4sW8/vrr7uf6+nqee+45Jk+e7NrwDzzwQD788EPef//9vPusWrUKpZRbb9GiRTz55JN59Zqamtz77rHHHqRSKR555BFfex944AHfOS0tLbS2tvqODRs2jPLyct8zrJe4pqMIFOwCMQFoExLJd9GJmAugYMfeauEGi9EUDIZ1oKmpiT333JMDDjiAzTffnNLSUt577z0+/fRTLrnkErfemDFjuOSSSzj22GPp06cPjz76KI2Njfz85z9365x22mm89tprnHrqqRx55JFsscUWNDY28u233/Lyyy/zySefEIvFmDp1Kv/5z3+49NJLmT59OpMmTSKVSjFr1ixeeOEFnnjiCUaNGsU+++zD9ttvz5///Gfmz5/PuHHjePnll/OEWHV1NSeffDIHHngg48ePJx6P8+qrr7Js2TJ++MMf9lhftoVKV6PqfolVciRWyfH+QsfJHB2GZRWgCveFtITW11DZel1WMNmkrlgHjFAwGNaBoqIijj32WKZPn84rr7yCUoqRI0dyxRVXcNxxx7n1xo4dy6WXXsp1111HdXU1o0aN4uabb2by5MlunZKSEh588EFuvfVWXnrpJR5//HEqKioYO3YsF154IdGo3rUrGo1y6623ctddd/HMM8/w4osvUlpaysiRIznjjDMYNGgQAJFIhFtvvZWrr76ap59+Gsuy2GeffbjkkkuYOnWqe9/Bgwfzwx/+kHfffZdnn32WaDTK2LFjufHGGznwwAN7piPXgGp5BtJfohqXQfFxWFZuO0s3HDWqnedW0T6oplv0Npqt2ldlTEfrhuWophsodUBlbzfCEM68edoROGrUqF5uSe+wzz77sPnmm3PLLbf0dlN6lK76v2frfgGtzwNg9X8dK5ZbTJdddRok34KSnxCpuAylsqgVe0A2F7xg9XsaK75Fp9qwkVMPVAUPGp+CwWBYP/EuTkvN8JfZq5mt2Gj9akWgcO9ceaS/62cwdAwjFAwGw3qHUsq3OE3Zq5B1WRIyi/SH6Gj3uFWYWyRIwW5aUBg6jOk1g8HQa7hZS4Nkl4Fqyn1Ofpp7n5mPji4CYmNzxwt3AasUAKtwj65t6CaEcTQbDN2ENxTVkE929Q3QfC/0+QdWMHTUazoCSH+by22UdtZbFEFkkFvFsoqg6mZIfQVFvR89taGyyWoKSrWgHBXUYDD0KEploflhUM2o1hfyKzgZUC0np1QGUl/ot47AiI3KMxFZhbthlZ1hTEedYJPtObXqdNSKfcK36QNU8mOyK49AJd7q4ZYZDJsA6Vl6BTJA6uu8YuVoA/GtIDberqf9CsoRGF7TkaHL2GSFgg5dU5D8MLRYNT+sY6Sb7g0vVwrV/DAqMT203ACWZZHNZnu7GYYeJpPJEImsZWhJfpB7n5Zac/DirFiOjYH4JABUyvYrOALD42Q2dB2brlCI6uRhKpOfmwbwbONXHV6emoFq+B2q7lwdDWHIo7CwkEQiQSbThjPRsNGRzWZJpVLEYmt2V6qUZzKmmiAzz1/B/t1Z0TFYcb0ZEckZvqgkJxzV0LVsukIhZi+saVMo2F/SzKLwQT/9jX5VzZBZ3PXt2wioqKhAKcWSJUvaJRg28IWUmzxKKVauXEk2m6Wysu01pUopv6YAPhOSDjm1twONjYGCSXZBnU50l63Rn6PGfNQdbLLRR1Z0FApy6Xc9qOxqyDqbmGS14HDsmk6d9Ozch8w8WIdZi571zIHoaJ3udyOjuLiYQYMGsWzZMhobGyksLGzTrKBUM6gkWOUbZV9sCqTTaZLJJBUVFZSUlKBaXweyWEX7+Stm5uQG9sgAyK5Apb/Gwo4Y8oWcjoHIELCqQNWhWjzJAGOb5kr57mbT1RSi9uYnmQX59syg9hDYzCPvWIhgAVCZJajEO23PgJvvR608CNX413Y2esOjb9++jB49mr59+7o5fEJpfRlaX9IOSMMGSUFBAYMHD2bIkCH6u193LqruHFTQkexoCZG+UGTnWEp9kyv3hZwO1jmPCrbTh1qf069WH6xIVTc9yabNJqspEHN2xErqhTLRIbmy4CAfjJkG8GgKKjMfK78GqvZ0SH+H1ec+KPxefrnz4wiq0k55thG16liIjcWqvNGXEMyt0/wIKvEGVuWfsSIVodfpbYqLi/N2AfOiVAK17O/6Q8kJRCoO6KGWGboL1fo5oE2GqvlhrMrf58qc73t8J6zYVrbG/jVKKf0dd4SCJ+TUik9CJd4A1WCX+XeRM3QdnRYKQogdgZOBvYFRQA3wDnC5lHJWoO6uwLXA9kAD8AhwqZSyubPt6DDREYAFKC0EvEIh4PRSmWrfoK+yjZBd2mZ9t076O/0h9XmoUHDPCxM6AMn3dTrgtISKKz0x2577rL5e21pbX4aSH4VfZ30ns8zzPnztiMosRjX+Dav4x1gF24fXSS8AqwgrOqA7WmnoAD7toPVZVPlFWJEy25+gncxWwY7gJKzLrrInZ4PDQ07jgf+5EQrdRleYjy4GjgBeBX4O3AHsBXwqhHBTFAohtgNeA4qAXwL/BM5EC4Yex7IKtK0S8sxFeRFJQfNRMCIpHeKs9mkS1XnFvu0EVT0qW5t/DefHAZDJ3+ReZeu1QIBuX4jXZjqCriCzxPN+Yfj9mx+AlidQjTeGl2dWaFNczaEoFb5BjEq8Rbb+Ci2wDd1L6qvce9WUM/tk5uUymRbsZPvq7O1QHUHihpx6Bv741kDO/GiZcNRuoyuEwl+BUVLK86WU/5RS/hHYHf2fvthT72q0FrGXlPI2KeXlwM+Ag4UQ++RdtSewTUgqONN3BuuIvV1knhCY7f+cWYhS6UAdj5KUnkse2eU42wn67ulB+fwWIYLHKyjaGEy7gmz95ajlO6HasPerzBI92Ka+XMcbeLWuheE+GKcPw/w7AKkv0abAmvz/j9POhv+Dloeg5fHw8uRHZJdPQTXdF16u0mRrzyZbd5GJlFobTnSepU2aqtme+yXt3eWsKohN0JOz2AT7HL9Q8IacWpESiHn2jDbhqN1Gp4WClPIdKWUycGwm8BWwBYAQogLYH7hPSumdpt0HNAI/7mw71gnH2ZwOzMIdTaFwT/2aXZXbzQnPYB1xzBQp/2wX/ANo2FqHoMkoEyI40mvWFHyCoi2zS/JDsisORLU8F1qu2zoblVkaXqaUnuWp1ZB4M7xO033Q8hBq9Q1t3yOzzNeHPrx9p1pyK119dWyhmV2OyoZYG719HCIUVLbJ7cO2hJdqeUpfv/mh8HamPoHEa9D6VPj/C3tRY7YptGxjQqW+Jrt8F1Rj/l4RKrMcsisAsMrsHebSX6FSX6CcxaIFO+ZSUcS3dK+psnW5/380YCJyQlPBhKN2I90SfSSEsIBBwEr70NZo/8VH3nq2MJkBTKIXsNwIpNwsXWWbXfXWcoQC+AdxRygUTMFVaYMmp4xHKGRrUNmGQHnAbxEWweQZeFSYUPBpCuFrJVTLk5CZq1doh5VnFqNWHoKq+RFKpfIrZFfqtRh4drvKa4f9rG3N0DMrUCv20/cJuUeeQAoIaW1q8wrAMK3K8z9Mz8xvhE9z+ya/HHImj8yc8IHdaxJx/EXBdjRchlq+Iyr5SWg50KZ5a0NCtTymv9dNd+ebFt1+ikHJ0RDbTJ/T/LAbVGEV7ORWt2Jb2ud94/+dBfwG7iI2Ip5AEUNX010hqccDw4BH7c+OF3dJSN0lwNBuasea8Sxgc80B3sE9vrUOm4OAfV8PflZ8M4g6JqagCSpoYqr2fcwzWQVmnipb71krQbhPwdvW7NLwQd0ZTNtapJf6HEhrQRhmgvK2s63V3Y5Gk12CUq355akZQEKbicI0mmxAKATrZJcCHmU07Fl8mkKImcsrKNKz89qpVNIz0KtQwaE8QiEsZ5ZSWWh9AUij2tKqEm+jlm1PdvX14eUqS7buV2Trf9OmiUqlvkQ1TutdjcRJZa3q8/vK+Wybh6zio/Xnlqdy/2tvVlRbUyC7KLeZTqRffjRd0b5QuC9W2flYVmFXPYkhQJcLBSHE5sDfgbeB++3DTjxi2BSp1VPes9ipLlBNuQHYGQStUoj0c1VYJ0GXUumc/T86FqKj7PJq97Iq25w/wOalAnY+2/+CvDDYgHkiaOKCgKDIQpgJyDW7LA0fsH0aUHVI+fw1lvtWn6LacLp7BWrYgB6YK+T1XXtChD11wsxHPu0h4xcSYH/2CNWQJG14zU7pb/PLM/NzewC05X9pfUXfp/Xl0HLSX0Prs9Dy77ZNVPW/RTVO03V6AZVt1hFxDol3/eWO8IxvpV+LD0PHl9j9a1X4d0WLCbDj+1Trf/SxoOkIsKxiIn1uxSo7p/MPYWiTLhUKQojBwPNALXCUlNJZFdZiv4aJ9yJPec8S9aigzmDlDGrRkTpm2lFhnZloZiHulzs2LqfGege7jMcZ6gqNwA/cGazj27qffTPDTMChml2Sn24jOHgGTEhKteowP4cQwaLaardb7hlss8vyZ6eZBbirTyFUm1CZtTnMHaEQs+sHnysYIhz4rBKQXeyrn9dXwUE6OOgH/AxBv4PKNvoH6XRIdl2feSnclOYKo8yCNjQ7b1+FCDeVdjWadXbstwPV+jLZ2rNR3nBhh9QXOGsQAFTy3UC57lsrpoMPrUgFFP8gV16wo2/VuhUpzSW3czQFE3Laa3SZUBBCVAIvAJXAgVJK77TV+dUPyTtRH+uV5EFWpExrA+AOPO6AYw/mbuib82N1f6gFEB2GZdfzz1TtAcjqk4uv9m4t6LGRW4V72QebXOcceJ3Zw5wjvkFfz9AD3RY0u+Q50KvJw6vhhM3A88xca5m1h/lG0l7fSCD8V7W4YbXuzDLwHHn+luDnzALAa2rJ5kcpuZqBPSNN+U0eeatu08HP3/jvkVmYF9qqvOeECCallEc4pUPNdb7JQ5hgySzAnZSEaSuAUilU60uozIrQ8vagGq6GxGuopjvzC51spQ7Jj9xnVdk6bQaC3P8TsIqPyb0PbqgDOROSU8ekxe41ukQoCCGKgGeBzYCDpZTBadSXQBqYHDivANgO7WzuHdyZvJMAzx60HA3AmbGk59mDeS6lr2VF3fO1X8Jewen88GPjsdzzq3P3zC7FtaQV7p477h1wncGhcBfcNYa+Wf0S3Bl6ZKC+71pm2OGmm7X4DIIz+7X5QoKflfIP0HkOec9M1Bks2noOe6vFtgVTEVjl9rGcZqBzWTm27J3t8uCgb8+649u55yvlUWAdoRHp7zkn4Gz2agpk8p81uzInACE8VNmjVYWGAPsc5nPCkzW2PIqqOw9Vf0l+GVpoZGvPIVt7Xn4oNaDSC3OaV4hvxE1h7UxoaIXUZ/qtK1wtfwhpfFso3E9H7BUdlHdN19nsYNYh9BqdFgpCiCh6AdouaJPRe8E6Usp69OK2E4UQZZ6iE4Ey4LHOtmOdcfwKjn3eFg6uBuCqsa3aLm87md3Vlm4URCpnqnFmeLHxPvOTax7y+hNim0FksH3ca3t3YrXHeZzZ3mgjZ8CJQcEO+m02qDmsOcJJr8z2zCbTIQP6WjSDPLNYcBavarUzMq/dzmdHibSw7Lz5eq1CNv+cAntVeDAs1WljbJSbuNCXsNDjP7CKDrGPyZwQVymwHcdW8VF2zSykcjNx11RTsGNu0aPHhKSUyjdJBQf1oBBZWxhyaM4t7zVToXVUwl4LkPwgXGikZkDiVUi85G5c4y/3pLXOzEV5JgZ6RfIMAKzC/XORRYl37PbZfRAdo9cW2FiWRaTPLUQGTseKhhgMApqCMR/1Hl2hKVwPHIo2HfUVQpzg+ZvqqXcZMAB4QwhxlhDij8DNwAtSyle7oB3rhOVGIM2zbfD2IOUcj44k5wyem/sROnHSbroMcgOiPSDpAX20PuY1D7kmqqH24h1dxzFdKZUJOLPtvR+85iBHQESHepL7Bc0ua5vlB2eyy/0mEVWr1ydAnsPdxRESzl65a1volw4kIHT6OzLAMztMuX3lN7V5QoQ9bXfNXtFR2s8DgRn1zFwbHU1BteQG5fQs3Oimwik5k53PR6DfW7GJENczYF8EUnZJTgtwtZXgs/uFRLAv9bNWe55xTl6yRpV3zRATUupz+03Cn2jOIflx7nqJt/OKVXDjKa+2kJmXW0dQMAkKdrGvqf0KrhnOYzpqF066CwCiucmaocfpCqGwnf16CDrayPt3o1NJSvkJsB/abnIDcDrwD+AoehN3Adt8vw3ePm5ZBbmZukcoWPbgo9Nl2BG1mXna6emaoMb70/vaA2ZuELPv7fol7OOZReSc2WM82ox3IHQc4iOwXE0i4FNwzS6VuWcMK3fSDPiOBeo7A3Ibm6G4poTsCr9gcQc+56uWyKU5gJz5KDo418+QMyF5V37Htw83ITltiI3CclKce81Hrjlvgu5LZ9B2BkxnILP6aK3NWUxlCwIdbWNPBuJb5iJnvAOyK0AK3b4Imn/y1k8EBWx2Kb5V7qo5P1w3IBRUyi8UVGaFX2MM2v8BlcoJBUKEQi5Bo/5e+MJrnetZFRAdi+UIhdTnOgjB7gcrOPNfC1akb05jjo7AsuJrPsHQbXQ6IZ6Ucq8O1H0b2K2z9+xSnAFZ1ebsyhS5dnpdZ4yOFkl9RC5Lo8cRFhsJyUU6W2p6Lrlc8OOxrCJUZKj+oabn6nwvrqYwGtDL+RV4Ipwck0AcosOxYiPt8jBNYSREh9vHlqJUGssK+CAKd9Xx89nFKJXUggxyQii2mR6EVb1uo+vwtc+P9MWKT7SzWXqcxh7zk1W4N6rFTmWQmQcRfQ3XYR7fLmeqyCzQQgBQjvkoMgQrUoKK9NXhwZlFwA5+c1RspH7edGCRk/3eio6GqKOxzMs9qzMYx8ZjWRYqtgWkPkClvsYqPgTl+hMm6oiz+ERU4pVcRFL6G9z/aXwrrGyd3Rd6G0nLinhmyAIrJlA8G6IpOBrLEK1Z5GlVTt86kTkZLdyietKhNQn7mu53KuC+cza3t1GpT7E4OfdZZXNrDADSX6Gyq/SgDHohofN/Lzkemu+B5Pso1YJlFaOcc+Pb6ucu2MlubxqSb3kEdMeEgr7mVpBYakxHvcymu5+Cg2dlpKtKx0bmluBD7kvqnTF5v7jeCCQ38qgilwbDMQ85A5njt3BNVKPd4/qH7yQEG6kHeHfQ9+QFsn+4VmyEO2jgLELDH51kFTjObOUTLMpni7fb4Fuk54nEcspVnY4wCdYt2M7Nc+M3gdh14lvkBK1XA3HMR46d2fOsvjZEhmBZRSGmtpacLyc2OpdHB896Evt/YjllzizWsX8HTR5u+Syt+TlaQHS4zuEftzUF1ZTTzmytgthWHhPWHI/fQuWEQtH+9rMHtSrHNDnco8F6N3NahKtJFNsb0gTMR8o1HdkkA5pCenZuYkMEUOD4AwCSdtIBqwSr9Ey7TiKXs8jWFCw75YQVKYP4RLs77saN0OqgpqBveZzWPjyRSoaexwgFqypnTnCEgnf9Ap7EXM7CpMgwLKvYU+6JQPI4md39D9wBt1oPEs5MzBEGbnKvpF6P4OaTtwWPd5GdqrUdwAtzZa5QIDdIZRbhzm4LdgIc7cC7GM2jsdht8S3Cc8tH+qNB3MHWrmtV6Zmm5zlzdW2HeXSM26/+tRFL7XJ7hm8LBSeSyie4wC+Ava9OWWSwx8Q0yw6RtM1VtlCwbJ8AqW909I1tRrIcoRBz7OEZSH2bW4wVm2jfZzS5/rRn6k5sfnxLzy59noV92WWgtACwijz7RXijjTKe/3uYw9wJciCOVWhfI1uDyqzM1XGigJxQ6OzSnDYG4JiOIv2gQCvtKpkzIeX2OtgeK9rPjcZSiTftdPC2YHOCAiDnV3DWGESHY0Uq6ShW4e5EBryIVbR3h881dB2bvFCwLMtvQoLcZ4fg6spgDLU7q5vnMVWMy93DOT891462cfwFzkA3gpwzuzo3u3aFgkdIpedr84ojoKIj9Aza0UpcoeDxF0SHefwSXlu8o7GM9ITO5q8+tmKj9AKkQMqPnPAabbdltH28Wr+qZE4zaXOhn20zdyJ6XP+IPZh6BROeqDB3D23vCvQB9oJDj7PZa8d3BmvHtKHqIDkdd/ZtCwMr2j/nOE9/nXMy20LDsmKezJ7StuPbgie+lS3YHKFhD+RuO2J6oLWq7OPVufa5msIYzzN4o6icCcdoW1txvjNaW1Aq65qPrOKjwJm4ePIwKcfJHN8Bq3CKfp94O6eBurmJdHiw69xPvGkLnCxg5RZdQs6v4LAupiPDesMmLxQAiPkjHaxgsq2gjdMz4AMeIdKa+1F593R2Z9ALPDPDiDsr1s7snLPadWbbEU5WpCy3wU5mgd+34DqrnfMdc4ajjQzX6ylsAeSaXbKNOm4e9GAeGjrrX8iXp004GoEt9KygppCZD87K19gYTwLC+XYbmnPhqrb5yHKFl998lAsRtl+dsFSP0z6nmTmz7Fk5c15kqO5HsP9/etBWzXY0tFXpd3Q7JpHkx7lr2Mf0e21CUinpWfMQg9hmdn87QtZJFmiHo0ZH2RFnY+02ekNQnTDkMW4gg87TpHLPYz+fZRXlJiuOCSkzL2caKpjkDtzK62y2NQWrYPvcGpnsckjP1BqH8/101oy4AQYLc/sjxybk+hKgYHtcIYhH4zJskBihACGaQUAoRAblZl2ErLb0ChUnLNErFFxNI4VKTLePDcs5fD11VOrLXOiqVxg598gsyM20rT65H6c9oDmb7ajgIjxvlBX4NYbYaE/orBYWKtvg0ZwCC/mcQT+Y997jG9Gv9gBjFWuzTjBVedZj1og6kSeOprBErx9wnyNgPgJtrnPNS6Pdw94IJOVxMrvlVtyNryfxun6Nb+Xb7tSNnml9mZyTOTcDttwIJJnzSTj7A4A7cXDMP74IKG977UFYZ+d1wqHH5tqr6nJ5uRxNwQmHdkNjbaHg+BOscv2/cEw8tqagMp6kh/EdIDoupxEl/wcpJ4lxIcS3sdvi8QW1Pmufux1eLKvQFgzk9ZNhw8MIBTwptB0CQsKyIv5jAU3BcgY9Lz6hMBQ37DPxhn1sdKC+ff02ndn2WoXMfI9JxtPuYFhqMF1HLGB2cf0B5VoL8Q221X4TT8xJ+ZELndV+jWp/O517qDq9k5zrMB9t9+EIT3l9znREJGf+chzNZLSD11lV7Nw70t8flupqCqM9feHMsqtzYaeuA9rGjYu3V/QGZ7eO/8AxLUWGYUX6eMptoZCpRjnOWZ/QsP//blpxv3DKmRSr3evk2j/Gb7LMzPalyHCu7RNMeJzM8W2wrAiWuzr7Gy103IVqRRDfQgtBW1tQiek5f0LBdq5w03X2sM/TGosV3BqTgAkpZjSFDRkjFMC/loA4hK249A3QIXlZvNewSn1CQkcQOTN9xw4fcGY7g5qjJVhV/kHIM8v2rlHInR8QCs6Cr+BaiMwi/ww8OgrLsvTqU+/Kame2b1XqiBtvH2SqtcnB9WuM9r+CjqTypATJe+bMfI8/YWAujNbrNE9Oz72POetGLE9fVHv8Il6h7QiAVC5aJiAUgnH0VnAgC852g0LDcVajIPmOfQ3POb4IpGxuQI/bGorPXOeJOLPKINLf/n8462Nm+xzV7oTDaUN6tvbfeIQCoCPC9E0g/aXHn7BNbtC3nc0kPwRHi437cxP5Fg36ruuh6CD9vY9P1j4ZwwaLEQrgXz3p2ODz6tg/Yqsy53D1lXsGvNg4nylCH/P7JfL2mA1uLxgwUVnedBzuGgVvu4NmF9tM4FuZDZCBzOKcX8A3mOo2KK+m4NNG7DaqZnfzde81rEi5J8Hg3JwAdISoN9IrPd8TjuoVoIW5XE7OIBUZ5Iv2yoX4fp0Toj5NYajH3OeYfgKaQtAZ6vUXYEdDuTvr5dvJ9WIrp9z2m3jrRB3zT5OeodsbFeWc3XafOCG1nuCCnG/E8TvM9jicIx4h6wimtPYruBFQ29ht7JPr++SnuZXMTloU0GtYsICE2wbvBji6/m64S5qsqvzAC7QJ0RrwFlbfe/LKDBsWRiiAPQgV6fc+rSGHVbgHEIOiffMHfDymFfCbjhzaMhe1WR6McLIFQHaZO0D4zF6ukzRlzxjtCCefI9pZ1DYvbwGdfm/fMz03L1usbpN3Tccb+k1kqH/A9jqjXZ+D7TD3zvIz83M7rgU1M8eE5IY4BvvKMbV5NYncc2hTVTAYIPDZk8Nf2+BD0ip4B/mA0Mhdw70r/j2ER4G9CE21vuhcxOO096dPcR3O3gHXuzrb9SeMzPktIoPcKCbV8jTu/zy+de4atq1fJafjbH5jeez/VqRP4NniULAtXqxIGRTYuSwLtg39/ut65X4/mWGDxAgF7EHEceQGByCnTsH2WAM/wKq4JvwinkHeChEKVlATCAoB76CNx+bsXt8ZkFXOAex1cEe8ZhdnMVLEFRa+RXDpea4N2/K1226T13zk6Q/tO7EH8MRbdhsCz+F8Tn2aiywKrv4Gvb2ou5o54I9x/Qpp3zluO9wQYjvSxvGL+NrhEQLR4b7kbID+7PwPAk7m3DW8QiHETh73CIHo2EACuIKcAHSEQmysm77Blz4lMzdPgOr3nggk11HtCXW2rFwbWp7Wr5EhWNHcanw3yWDyPbRGY/nXGAC4ixuB+NZ+Ie9cp+wX2jRUaja42dgxQsHGKpqq7efehUXBOpGyNmdJPvNRcFYKAfNR1B/+SMDvkFcfW5sJ5IPx3FPboO1UBc4KVSfhXqC+Sn+Vi2jxCidf6KwzSAXDc+06bpTVaF+xaxZznK/BezjPmJ7v5vXJy5rpCgXnmgFBnadljcr7v/hDggOmIwc766rlJMkLYDlZWWObuWkg/PfwaAphQsMZwN3Fc4HJgjfJYHBtiu/8ZblFacFrOG1wBKTjT3AoCAiA2GZ521xahZ7MM0HTkVOnYBKRfv9yVzIbNl6MULCxyk7XmkDYBiDtITbGnq0W5f8wITAwDg9P+OUdYIM+CCsaGCwL/PmZICdonAGkrcHUmwTN5zPIhc7mhMaaF/LlazTOM9izfDunUa6+Z61CJt+noOv4BWaeNpL3XIFy8AuCMHMeYJVfhNXnTig9Pby8cGesvg/qOmF4hEJoArjAfYPObvd/nHzf47QPEQqQM/0EI9+8Jity/gSX6FjchIiQW+nsJb6d6x/JcyobNjk6nRBvY6JNLaBd5xZB/2dAJXV6gCCRATo6QzW1aaLKHW8jdXB0uMd5O9yfnwnsaJUvcAfkYGhtdJQOKnRmrlaF3+wSHYbWRjzbRAavERvl2+MsT6PJ840Ey53FZ57sn5E1awr560b65/oypI36vp51CW1oClak1L/JUVidNU0SYmNz7QiaZNDair+vgkJijJtYzz7i941EqlCR/rlFhiHX8JmwIN8fYEVQBdu5oc5ef0KuThz63guZZVheJ7Rhk8RoCl2IFR2kE9SFlVlWbsBsy5ntzPpi48Mddt5Zfdh9giapYJ08U5Df7JJnwrJK8yOt8nwhgc959wgu9AuUQ56msDah4HNYE+KvAd0X0eFAHOKT88u7AMsqwOpzO1bln8LNKsGV786CObeNQRPhUD25WNM1guHQsfHgZlWNhK4RsLwCKx4+6Fux8X4zkmGTxQiFHsQqOQGiY7CKDwuvUHwwVvmlWJV/Dj/fF4KaP7jmmV3aitpxP4/Ov0kg++uaQ2vjIb4R/0K+PPNSZBDelAgQ829xCbaQsL+akYF6Rp/XTk/bQ57DsqJY/Z7EGvAyVmx4XnlXYRXshFV8RHhhbCxuhBOF+dpfXvqU/FBPn1CIDMt3mFuFnhDV8eF9VbgPENcL8oLfEYMhgDEf9SBWyZFYJUe2XW4VQOkpbV/At1ht7ZpCvhAYhh5s7dj9EMHidzyHaDTRYeiZacYOjwxZ0xEbDUnbPBRcb2FFUNHhuRw7kYF517CsOCoyRG8AH9bG4LO1pXlFKoGOZ+vsKiyrGBUdpteMxMbm91VkEFglnjUMIfH/0XE5E1RQa3CIb6PDVsP8BaCzwg54GazyTplIDZsGRlPYkPBFOLVDKAQT/XkT7xFudvEdC9NGrHju3mFmGwgIlrDV397nGJxfDrlnadPUZg+gkX65FdfrI85AHuLX8JkUCdGqvOdD2w7zsgu007zs/DabYUWH5UUdGQxhGE1hQyI2EqwyvQo26GAE34CvVwEXhdQZ5dmLYXTIPTxx8m05xONbQKa6zS0X3Z3krOJcwjVfG9YuFKySo1CNi7GK2jC1FX0fkp9iFe4aXr6eYJWejlIprNKTwyvERueyrK7FfBSMPHKPRwdD6Wmda6jBYGOEwgaEZRVD34dANef7D9DrKJRVpdcQrDHCyV4JHGoeGp1739YsvfxSKNgZig4Nv0fhXtB4CxR9Pz9CCh2W6ppEgpFHTp3iw9r2vaD7wqr8fZvl6wtWwU5YfcNj/4FACGqIVhUZqOtk5udWFRsM3YgRChsYVlysuUJ0GKTrwqN8ILffs1UVanaxogNQJafqvEQhYZa6zmAoOa7tNsbGwsD3w/0NEPCNhAuFTQU3bNUqDdWqLMuCfo9Btr7NyDaDoSsxQmFjo3B3SH9l52oKK98Pmh+CooPbvESk4uJON6NNgQABn0KIeWlTomg/SB6DVTA5VKsC7F3vjD/A0DNY7i5bGyZ19GZ4yXqKyjas105FpZKo5buCasDq/2L+pkUGg6EnqAeqggeNprARsj4LBLCjoPreB9laIxAMhvUMIxQMvUJbkUsGg6F3MesUDAaDweBihILBYDAYXIxQMBgMBoNLp30KQoghwM+BnYHJQBmwt5TyjUC9aiBsNdSfpZSXdLYdBoPBYOg8XeFoFsDFwCzgc2BNeQc+Bm4MHPuyC9pgMBgMhi6gK4TCx0B/KWWNEGIq8OQa6i6UUj7QBfc0GAwGQzfQaaEgpVzdkfpCiEIgKqVs7uy9DQaDwdC19LSj+QCgCWgSQswWQpzRw/c3GAwGwxroSaHwOXAFcCRwOrASuF0IYZzMBoPBsJ7QYyuapZS+PMtCiLuBt4HfCiFulVLW91RbDAaDwRBOr61TkFJm0JFIJcAuvdUOg8FgMOTo7cVrC+zXvr3aCoPBYDAAvS8UnBSZK3q1FQaDwWAAekgoCCH6CiEigWNFwK+B1cC7PdEOg8FgMKyZLnE0CyEut99uYb+eKISYAtRJKW8GDgUuE0L8G6gG+gE/ATYDzpZSNnZFOwwGg8HQOboq+ugPgc8/tV/nATcDXwDfAicCA4AE8AnwKynlc13UBoPBYDB0ErMdp8FgMGyahG7H2duOZoPBYDCsRxihYDAYDAYXIxQMBoPB4GKEgsFgMBhcjFAwGAwGg4sRCgaDwWBwMULBYDAYDC5GKBgMBoPBxQgFg8FgMLgYoWAwGAwGFyMUDAaDweBihILBYDAYXIxQMBgMBoOLEQoGg8FgcDFCwWAwGAwuRigYDAaDwcUIBYPBYDC4GKFgMBgMBhcjFAwGg8HgYoSCwWAwGFyMUDAYDAaDixEKBoPBYHAxQsFgMBgMLkYoGAwGg8HFCAWDwWAwuBihYDAYDAYXIxQMBoPB4GKEgsFgMBhcYp29gBBiCPBzYGdgMlAG7C2lfCOk7qHAlcCWwHLgTuAqKWW6s+0wGAwGQ+fpCk1BABcDw4HP26wkxEHAU8Aq4Dz7/e+AG7qgDQaDwWDoArpCKHwM9JdSTgD+soZ61wGfAgdKKf8hpTwfuAY4RwgxoQvaYTAYDIZO0mmhIKVcLaWsWVMdIcSWaJPR7VLKjKfoFrsNR3a2HQaDwWDoPD3laJ5kv37kPSilXAws9JQbDAaDoRfpKaEwxH5dElK2BBjaQ+0wGAwGwxroKaFQbL8mQspaPeUGg8Fg6EV6Sii02K+FIWVFnnKDwWAw9CI9JRQcs9GQkLIhwOIeaofBYDAY1kBPCYUZ9utk70EhxFD0+oYZGAwGg6HX6RGhIKX8CvgWOEMIEfUUnQ1kgcd7oh0Gg8FgWDOdTnMBIIS43H67hf16ohBiClAnpbzZPvZr4BngJSHEI8BE4GfotQvfdUU7DAaDwdA5LKVUpy8ihGjrIvOklKM99aYCV6CFxwrgLuAPnch9VAdUruO5BoPBsClTD1QFD3aJUOhF6jBCwWAwGNaFUKFgUmcbDAaDwcUIBYPBYDC4GKFgMBgMBhcjFAwGg8HgYoSCwWAwGFyMUDAYDAaDixEKBoPBYHAxQsFgMBgMLkYoGAwGwwaEUhkSmRpa0mF7lnWeLsl9ZDAYDIbuY3nT68ys/RuJzApS2TpAZ6KY0OfnjK06s0vvZYSCwWAw9DKZbCuKLLFISWj5rLppNKaCeUMtYpGuz/JjhILBYDB0gsbkHJY2vcjoyp8Qi5R2+PxMNsG7i48klV3NbsOepiDax1eeyjSwOqkFwvg+51NVuB0F0b4URgfk1e0KjE/BYDAY1kBWpciqVGiZUorPll/A7Lqb+W7V9aF1mlMLeH/xCcyrfyC0vC4xg6bUXJKZlaxofiuk/FNAYRFjVMVJ9Cv+HuUFm3WLQAAjFAwGw0ZMMlPH8qbXUSobWq6UYnnzGyTSK0LL09km3lk0lf8tOJBEpiavfFXrezSmZgGwuPFpUpmGvDoza2+iLvEJM2tvChUuq1rf97x/N6+8tvVjACoKt2jTvNSVGKFgMBg2SrIqzcdLT+fT5T9jbv2doXUWrH6YT5edwwdLf0JWJfPKq+vvoSk1l9bMUqrr8q8xryE3+8+oFhY1PuErb04tZGnTi3Z5E3Wtn+VdY1VLTijUtLxHcDsDRyj0KfLtZtxtGKFgMBg2SDLZBJ8sPZuPlpxKKrs6r3xBw8M0JL8CYH7DA3mDvlJZquvvAaA5Vc28+vt95YlMDdX1d7uf569+2KdRNKcWsKL5DQBK42Ps+/wLpTJunXkN96B3HNasbPmf7x7pbBP1iS8891xOU2qO5xlb3fI+hTuE9kNXY4SCwWBYb2lIfE0m2xJaNqtuGita3qSm9V2+XHG5b4adSK9gVu3fcp8zK1ja9LLv/BUtb9GSXuB+nl13K63p5e7nOXV3kFHNxCIVxCNVZFUrc+vvcssXNDwEKIqig9lu4I0AtKQXsqL5TQCSmVUsXK01h8LoAABqWqb72lDb+hGKNBAhHulj18mZkOoTn9vlUFW0fdsd1YUYoWAwGHqFdLaZhsQ3bZbPa3iQdxf/iPcWH0MyU+crq2391DeLX978CtWeAVuuupa0aiQe6UO/ol0BrS14mW87fqsKtyce6UNGNTOz9q8AtKQWsaDhYQDGVp3B6MqfAtrclEivIJ1tZqFtKhpRcQxlBRPoXzzFbvcD9v3+RVa1EotUsGW/KwBoSH5NIrPSbYNjOqosnOieX+PxKzimo7L4BAqiVW32VVdihILBYOhxlFJ8uuxc3l18JLNqb8krb07Nd6N5GlMz+XTZOa7GkMm28OWK3wCK8oLNGVo2FYDvam9gVcsH1LS8x5Km5wEQfX/FuD5nAXrW7dj0G5OzqGl9B4CxVaezWd9fALC48RlqWz9lVt3NKFIURQczsvw4RlYcS0GkL1mVYE79P1jS+CzpbAMRq4Dh5UcBMLLiBEA7n+sSnzO/4UF9vPxY+pdMIWoVA1DT/I77nDW2k7lv0c70K/4eALUtH5JVWjuobf0IgD5FPWM6AiMUDAZDL7Ck6Xk36mZ23d99oZhKKb5aeQVZ1Uo8UglY1CVmMGP5BWRVipm1f6M5PQ+LGBP7X82W/X5HecHmQJbPlv+Kr1f+H6A1gKFlU6kq3IHygi0A7yxeD9glsZH0L96dYWWHU1GwFQBfrriUxY3PADCuz7lEI0XEIqWMrtLawsLVj7pmpCGlP3RDQ/sXT6EkNgqAGcvOI5WtJ2IVMLLyeCJWAX3tQd/xKyQzdaxOfgtAv+Kd3fK0aqQh8RVZlaIuMQPoOSczGKFgMBi6iRXNb7G86bW84+lsE9+t+gsAFlFA8fmKi2hOLQRg4erHXIGx9YA/sUW/ywE9mH689AzmNdwHwLiqc6go3JxopIjtBt5ELFJBMltjC4woW/b/LZYVwbIsRtmz+GVNL9GYnOkO+iMrjrfrRNm8328AaE7PBxSl8TEMLTvMbfeI8mMoiPQjq5KuL2JkxfFuuWVF3M+JjHZIDy2bSmG0PwD9i3e3n2M6SmWobf0Qvf4gTlXhJIpjQ1yHdU3LuzQkvyGjtHZkNAWDwbBBs6rlQz5ZdhafLj+PuYFQztl1t5LIrCBiFbHjkPsoiPQlnW3gs+UX0JSqRtoCY0jpIQwo2ZORFccyrupcfd3W9wFFRcFWjKk61b1mSXwEWw/4k/t5ZMUJlBcI9/Pg0h9QEOmLIs0ny84ho1qIWqUMKz/crdOnaBJDyw51P4/v83MiVi7pQyxSwpiq03L1C3egonBL37MNK59K1HJWNVuMrjzZLetfvBsAqWwdDcmvqbH9CVVFk4hGtGmpb5HWFmpa36XO9icUx4ZTFBvUVld3OUYoGAyGDtOQ+Ja3Fx7MnLrb88qyKsnXNf/nfv6u9nqq6+8FdEqIefV6pj+28gz6FE1im4HXAREakl/z7qKjyKgmCiL92Lzfpe41xlWdw4jy4wCwiDNxwNVErLjvvgNL9mJi/2sYWXEi4/uc5yuLRgoZXvFjAFrSiwAYVn44sUiZr95mfX5FRcFEBpf+kEEl++c924jyoymKDgbwDfgOsUgZIyqOBrQgKo2PdstK4iNc89LK5umsan0PgH5FO7t1+hXvAkBd6wxWNr8N9KzpCMAKLpTYwKgDuj4jlMGwiaOUQpEiYhWEln+09HQ3vHLrAX/yzbDn1N3BzNobgQhVhdtRl/gEgM37/oYVzf+lpvVdimMj2G3YM0QjhfY5/2Bm7Q3uNbYdeAODSw8MtCnLosYnKYmNom9xxwfK1vRy3lqwnx3iaTFl+PO+Qbu9tKQX05JaRN/iHUPLsypNTcu79C3akWikyFf2Tc1VzG94kJLYKJrT8wDYacgD9LHDTVOZel6fvxvetQ1b9f8Dw8uP7HA720E9UBU8aDQFg2ETJJmpJZmpbbP8m5o/8Gr1jm7MvZeGxNe+ePuvVl5BQ+JrQK/gnV13KwCjKk5g8uA76WebTb5ddbUbbrl5v0tdgQAwpvJUBpbsC8CgkgPyBAJom/3w8iPXSSAAFMUGMrj0IAAGFO+5TgIBoDg2tE2BABCxYgwo2T1PIABu2KkjEKJWMZWFE93yeLSSysKtfOf0pD8BjFAwGDY5EukVvL3wh7y98ODQnD9NqWoWrH4ERYqvV/4+b/HY3Pp/AlAaH0txbARZleDTZeeRzKzim5o/klUJCqODGN/nPKKRQiYNnObaygH6F+/BwJK9fNe0rAjbDvwrOwz+J9sMvLbrH9pmy/6/ZfN+lzFxwFXddo810adoR5/21adohzxtzNtXBdF+rsmppzBCwWDYxJjXcD+pbB2pbC1z6v+RV64XhWmzcmtmCXNsIQBaYDgrg8dWncmkQdOIWsW0Zpbw3uJjWdmiQ0s373epm0Y6Gili+0F/Z0DJ3hTHhrOFHeUTJGLF6V+8a5smq64gFiljVMXx3ZZhdO33L6FPYU7T6evxJzg4fgXQzmzLsnqkbQ49tp+CEGIv4L9tFG8hpfy2p9piMGzspDL1xCLlWJZ/3pfONrordQEWNDzCmMqfUhTTztNEegWLG58GtCbQlJpDdf2dDCubSkl8hC0wshTHhjG49CAiVoyJA67ms+W/cMM0+xfvnuekjUaK2X7Q37vxiTcc+pdMcRfOeQWAQ1XhJCJWIVmV6HHTEfSOpnAjcGLgb3EvtMNg2GBpKxU0wJLG//D6/F35fMVFeRk3F6x+lLRqJGoVUxDthyLliyCaZyeOi0eq2GnIfRRFB5NVSb5d9Sda08tZtPopAEZX/tQN1xxceiBjKk8HIGIVskW/y3t8drshMaj0AGKRcsoKhC9s1iEaKWSLfpcxuPT7DCs/osfb12PRRx5N4XAp5VNddNk6TPSRYRPj65V/YHHjU2w78K8MKNnTV5bM1PL2wh/a+/jCVv1/z/DyHwE6VPStBQeQyCxnZMWJlMSG8+2qa7CIsfvwF4hHq3hzwT6ks6sZV3Uu4/ucy9Kml/hsuU4BUVU4ibrEpxRE+rLHiFd9jlSlMixufIaS+Cg3ksbQNqlMAxEr7q5P6CXWn+gjIUS5EMJsBWrY5FBKsarlA9LZptDydLaJD5b8hI+Wnh6a378xOZsFqx8mo1r4fMXFtKQW+crlqr+4AgHg25praEpVA7Ck8TkSmeVYRBldcRLDy39MUXQwijSz625l4erHSGdXE7GKGFmh1wQMKjnAtXvrHcBgVOWJeZE1lhVlWPnhRiC0k3i0orcFQpv0hlC4H2gAWoQQLwshtu6FNhgMvcKsuml8uPRkPll6Vp5pB6C6/l5qWz+kpmU68z22fwe9WYw+L51t4LMVF7q7edW0vM/ixqcAmNDnAgqjg8ioFr5YcTFZlXTz9QwuPYji+DCikULGVp0J6F3D5tZph/Lw8iNdR6xlWWzR7zd2OgqIWqWMKD+26zrEsN7Rk0IhCfwb+DlwGPB/wE7A20KIzXqwHQZDt5HI1LCyebpvoxWH1UnpDry1iY9Z0vhs4NyVVHt2CJtTd6tve8eW1CL3nCGlBwNQn/iMmbU3kckm3FXEVYXbMabyNLYecLVd5ws+Xnqmu3mLNz3EsPLDKY4NQ5EhmV1laxEn+9pVVjCBMVXaZzC26jTi0YqOd4xhg6FXVzQLIbYFPgIelVIev7b6IdRhfAqGHiSrUljEQh2pjcnZfLj0ZJKZGoaVHclW/X/v1lMqw3uLj6MhmdtlqyDaj92Hv+CmWvh65e9ZsPph4pFKsipFRjUzpvI0Nuv7S7v8jyxY/S8KowPZY8TLzKr9O3PtkNL+xbuzsuV/WMTYZdi/KS/Q86xva/7MvIZ73Xv2L57CDoPv8LV70eon+HKlTjo3pPSHbDPwL3nPppQikVlGYXSQcSJvPKw/PgUHKeVnwKvAvr3ZDoOhPaxOfsf/FhzIWwv3p6blHV9ZY3KOKxAAFjU+zqzam9zyeQ0PugJh6wHXErWKSWZqmFWrwzSbknNZuPoxQOf5GVN5mn3efbSkF5NIr2BR478BGF15ChGrgPF9zqOqUNvwnXTMoytPdgUCaDNSWTz3eXRlTktwGFJ2KJWFWxO1Sl1zUhDLsiiKDTYCYRNgfVi8tgDo29uNMBiWNr3E9IVTmbnqRtdO79CYnMlHS35Ka2YprenFfLT0NL6puZpMtpWm5FxXIMQiFW66hjn1dzCv/n5aUotcATG8/CiGlh3M2Cq98cv8hgdoTM7ku9obUWQojg1nRMXRjKo8icLoALIqyazam5nXcL8bKups6hKxYmwz8C/2ngM6m+a4qrN97Y5GCtlm4F8ojA5gYMm+9C3aKe+5I1aMnYbcz14j36CsYHzXdqphg6PXE+IJIV5FL14btg6n12HMRxsFicxK0pnVlMRHh85GVyclNS3vUhofQ7/iXXyrXrMqyYrmN1nS9B+iVjHDy39EVeEkj+lGsar1PebW30VjciajK09mZMVx7jWUyjCrdhpz6nNmlcrCrdlmwHWUxEfQmJzFh0tOIZmtIR6poiQ+wt1MvTQ+lnR2NYnMCmKRCiYPvpPyAsGM5T9nRfN/3TpNqTkURgew27BniUcryKok0xceRnN6nlsOsM2A6xhS9gMAFjQ8xtc1VwAWUauIjGphfNX57k5iDrWtHzGn7p+M73MulYXhcRtKKTPLNwQJNR/15DqFAVLKFYFjU4A3gXullD9dh8vWsYkLhbrWGaxOfsug0u+H7uFa1/oZy5pfpSg6kMrCbago3IKIVYBSWRpTs6lt/Yi61k+wrDgVhVtRWTCR8oLNsSyL+sQX1LZ+Qm3rxyQyKyiLj6W8YHPKCwTF8eG0phfTlKqmKVVNa3ox8UgVxbFhFMWGUhQbTDKzksbkTFanZtKYnIWFRXF8BCWx4RTHhqNIU5/4iobEl7RmlgJQGB3EwJK9GVCyNxUFm7O06SUWNT7J6mRuL9+YVcaAkj0ZULIXDcmvWbz6GZLZGt9zlxdswciK44hFyphbdycNyS995aXxMYi+l1BVuC2fr7jITc+gB+i5gCJqlTK+z7nMrb+TZKaGeKSSyYPvpqxgPHPr/8ns2lvcTdVjkXImD/6nOyhnsq18tPQ0N0MowHYDb2JQaW6l74rm//HJspy5pqJgK7439BF3FXJWpXln0VRXYEStUvYc8Srx6Cb9lTd0Hb0uFF4HmoF3gJXAROAMu2E7Sinnr8Nl69iAhUIis5Ka5ncoLRhDRcFE30wuk21hYeMTLFr9b2JWGaMqf8LAkn3cASORXsF3tde7O0hFrCKGlR3GqIqTKImPpqZlOnPq/0lt6we+e1rEKS+YQEt6sS+e3V8nhmVFQuPke5PC6EB7R6uw72yE/sW7kszU5QkAhz6FO1ASH8OixidwUhPHIhWkszrCZ2TFiYi+F1Lb+iGfr7iEpGeD9Vikgh0H3+XbVKU+8RVfrbycZGYV2w2aRlXhNr77pTL1fLDkJBpTMxlYsi+TBk3La9Mny851NYrJg++mX7E/F87yptf5dPnPAHxOZ4OhC+h1oXA+cDwwHqgAlgMvAVeuo0CAXhQKWZWmPvE5sUgZZfEJeap5XetnzK67haZUNSPKf8yIimPcBGFZlWZBw8PMqv0badUI6L1ih5T9kIEl+7Ki+S07aZk/tXFpfBxjK08nla1nVu0091yLKIpcCGRRbCit6cW+8zKqxXfMoSDan75Fk1EqS33iC1ozS3zlJfHR9CncgeLYMBpTs1md/JbmVLV9vwjFsWGUxkdTHBtGKltPS3oRLenFJDMr9VL++ATKCsZTVjABiwgtqQU0pxfSbOfJqSzYkorCiVQUbkXMKtZbODb/114opWfrQ8p+wLCyw6ks3JZktoblTa+zrPkVVrW8T1FsEMPKjmRY+VSKYoNRSlGf+Jz5DQ+wtOklFGkGlOzNmMpT3YVVq5Pf8W3NNe6WjxGrgC37Xcmw8qnucyczq/hixW9Y2fKWaxYKpjR2UCqDZUVDy5KZOlY0v2GnNijJK29JLWLG8l9QVbRdaKI4pRRf11xJY3I2kwZN67VEboaNkt4VCt1EHesoFBoS37Cq9QNK42OpKNzC3UdVKUUyW0NjciYt6UUURgdQEhtJcXwYFnFWJ79lceMzLGl63p1JlsUnMLTsUIaUHUwis5LZtTezosWfhz4WqWBUxfFUFW7Pd7XXuxt2W8RcE0QQizjDyqeSSC/Pux5APFLFZn1/yaDSA1m8+inmNTzgJiUDnYJ3bNVp9C3aBcuySGRWUt/6OQ3JbymKDaRP0WRKYqN8Ai2RWUlD4iuUSlNZtB2F0X55981kEyQyyymKDWozo2VWJbGIr7MdO5GpoTk1l4qCrdpc+anz/1ht3iOZqUOpFIWxASHnKpY1v8KK5jcYWXGcL6e9t86q1vcojY9xE8YZDBsRRih4mb7ocBqT0v1cGB1AcWwYTal5eTN0TYSCSJ8827UfC69po7xgC6oKt2FR49NkVWte3eHlP2JCn1+QyCxjSePzLGl8ntbMEmJWGSMqjmFUxYnugNaQ+Ja59f9kadOLgHLP9foRlMqwvPm/rE5+S/+SPfLMGQaDweDBCAUvi1Y/TXX93TSlZvtMLzksCqMDSWZWofCHJ5bGxzCk7BCGlh5CMrtKaw6N/3GFSVl8M8b3+RkDS/bFsiySmVXMa3iA+Q0Pks6upqJgK7bo/9u8QVupLM2peRTGBrqmpiAt6cVkVXKdd40yGAwGGyMUwshkEzSmZtKQ+IbWzFJKYiMpL5hAaXwM0UgxSmVoTS+lOT2PlvQSygs2y3MKg17puqrlfSwrQt+i7+XlsQedy74xOYvKwq3btEEbDAZDD2GEgsFgMBhc1r80FwaDwWBYvzBCwWAwGAwuRigYDAaDwcUIBYPBYDC4GKFgMBgMBhcjFAwGg8HgsqGHpOo8BwaDwWDoKIoQxSDWCw3pSrLoh2pYW0WDwWAwuFTgpAoOsKFrCgaDwWDoQoxPwWAwGAwuRigYDAaDwcUIBYPBYDC4GKFgMBgMBhcjFAwGg8HgYoSCwWAwGFyMUDAYDAaDixEKBoPBYHAxQsFgMBgMLkYoGAwGg8HFCAWDwWAwuLRbKAghfiOE+EIIYbKStgMhxJVCCCWEqGqjvMv6UwgRE0JUCyHO7uy11leEEPcIIeraKOvS76YQoo8QYrUQ4qCuuN76hhBiL/u7OTWkrMt/50KIB4UQj3TV9dYnhBAn2325XQ/db7oQ4s/deY92ZUkVQlQCFwLnSymV5/hZwD7AzsBI4F4p5cltXOMk+xqbAbXAY8BvpJSNgXpDgN8D+wMDgUXA48CfpJR1bVw7CnwKbA38Qkp5Y3ueq41rRYCTgVPt60UBCTwA3CylTAbqXwJ8K6V8qgP36I7+/A64TAhxl5Qy4am3BXANsBf6//0+cJGU8uM1tK/Cvt4g4PCOPFvItQqAnwEn2G3NAl8C/wTukVJmPXWLgEuAN6SUb7Tz+nl9KYToB/wUOBTYHIgD3wB/lVI+FnKNKuBa4HCgBN1HTwP/B7wQqHsocCWwJbAcuBO4SkqZXkMbbwHOBp6WUk5tz3Ot4Vp7Ar8CdgHK0b+PZ4GrpZTLA3WPAQa39/fQjX15G/CQEGJrKeUXdr12f9cD1/8PcBBwk5TygvY81xquNRX93dwBKALmAv8G/iKlXB2oexbQKqW8pzP37AKuBR4UQlwf/H93Fe3VFE5F71vwaOD4JcB+6C9JMniSgxDi58C9wFLgl8Dd9jWf9s5IhBClwDvAVOAe4HzgZfSP4Nk1tO8sYGw7n6VNhBAxtLC6E0gAl9v3ngtcD7wmhCgLnHaJ3d6O0B39ORkYChztqTcamA7shP4yXQb0A94QQmy5hvb9Fgg+Z4ex++p1dN/NQw84vwGa0X38qC3QHYqAK9ACrL2E9eUuwFVADfBH9HO32Pf7baCNEeB54BhgGnARWhgeCuwohNjDU/cg4ClgFXCe/f53wA1tNU4IsQ1wGtDagWdq61q/AN4AhH3Pc4H/AGcAM+wJgJdjgAs6cIvu6ss7gM+BX3iqt+u7Hrj+D4E91lqxfde6CXgSqEI/1/loAfYb4AN7curlLPRksbd5Fr1VwFnddYP27qdwMvBUcJYM7AnMl1KqNaj2hegZ1+vAgZ4ZyDvoBzwM/eMCOBgYDRwspXzec40W4FdCiDFSyrmB6/dFaxbX2vfpDBcDRwDXSCl/4zl+mxDiDOB24K/oH2FnOJku6k+gSErZ4unPC4H7PM9TCuwkpZxln/8P4FvgakKEmRBiM/QP5Gr0jLgz3ADsBpwlpbzdc/xmIcTVwKV2G6/uxD1OJr8vvwImSCnnOQfs2fqrwKVCiOuklC120Y+AXdEz22fRv4lH0ZpSnX39t+y616E10gOllBn7ug32Nf8mpZwZ0r6b0FrmPp14RoQQu6OF63+BH0gpWz1ld9ttfEwIMUlKmVrH25xMF/WllPIpIUQJub7MAD8SQvxMStlMO77rgecvQH+fOv07F0Icj/6OPwic5NFW/yGEeBR4Dj3pOqAz9+lKhBAlUspmKWVWCPE4cJIQ4g9eS0NXsVZNQQgxBm1GeTVYJqWc145GbQVUAo9460opnwMa8cxs0Rs/ACwLXGOp/dpCPn8A5gD3r6Uda8T+Al+IHjB/GyyXUt4BvAb8VAgxwj5HoZ/tJ7ZdUQkh7gmc2kcIcZ8Qot7+e4yQ/hRCnIKeuTQLIVaiVe+iQJ1q4EX7nuPRs8+j7fY9h9ZuJtpmANAD8seOQLDrNQPPAAcJIcpDuuIG9I/izbb6qj3YfXQK8GpAIDj8Fm2W+7UQosTWamrtsis8/Xll8LpCiGeEEI1CiBp0X74WuPY84CghxDdCiIQQYgnwN/Ssuhg98XD+f3+07/sndP/tIqVcgR7MSoBDhRCWrVltCdzuCASbW9C/oyND+uAoYEf07LqzXI42vZ3iFQgAUspP7PZvhR6YEUK8gZ5wjfL0ZXXgmhEhxG+FEIuEEAl0X34RuPZcYJgQ4hUhRIMQogl4BfgYf1/egxZ+y4CzhBCNwC2evtwcbe7a175ue8YOLz+373ddB85pi9+htb2zveZLu10voDXv/YUQu4D7u9sW2NPTl28ErlkkhLhRCLFCCNEkhHhSCDEgeGMhxMFCiHfsOvV2vfGBOm8IIWYIIXYSQrxtT4ov8lR5BRgHTOxUL7RBe8xHu9qvn6zjPQrt17ABvQXY3vP5f+gv/k1CiO8JIYYLIQ5Bm3DukVIu9Z4shNgaOBNtQumsxJyCViUfCvzovdyP9jEcaH8+EW0K+Z/9/kS0NuHlcfSX+RL0j+NH9nG3P4UQV6Bt7F+jVey/o2233xdCFAeuN85+nYH+oXzrKWtBq/+72J8LCe/3ZqCAwJdKCPEDtEp/Ucg5HeUgdF+FCmu7jx9C9/muwAr0/xK0cHT68wnPaXG0OXE5WoDPto9PCFz+TrTJ4w1yM8LT0fZjgJWeuqPQg/8DaFPLEvv4B+g+6oc210yyj38UeI7FwEJPOQD2/+064M9SyiV0AnvCsg/wlnfGHsDp5x/ar1ehB+6V5PrygsA5l6PNZNeiJwIAPwncez90PxaiB9PfAsM91/L2ZQw98C9E/yYdbf8DtMbaip6odAghxGD7vr+xJzXrjK0Jb4b276xuo1qwLy8A5qN/a05fXhU45xa0UL4SuBU4BLg5cO+T0ROylejf2DVo0+7bQohBgesNQP9PPkT/zt/zlDn+wA73ZXtoj/loc/t17hprtc1M9IC9G54BQggh0A/uDnpSym9tM811wLuea9yBdtQF+Rta3f2fPdPsDI499vM11HHKtgCQUj4ghLgZmCOlfKCNcz6UUjqDHUKIKeg+nWt/Ho3+wl8kpbzeU++X2FoI2lHnMALdn0uklLd56gv0AAt6Rvsieia+mxCiVErZ5LnGFPt1qOf8OFpLmCalnO1oQ52gQ/0ppXzVVt1vBz5voz9LgPuklNfYbR6GnokfjPZFOGaWk4EfSSkfd04UQnyNFhaf27NXhwK0FvvHwL28A/mWwJCQ4966QwPHLkIL6K6Y2U5A/1bb7Esp5TzblOV8N18RQpwL9F/DdzMO7CylTAkh+qNNp9sIISZKKb8U2kdwK/CSlPIQ5yTbfDEHWB7oSwsddHFa4D5On61E92VHuYZcsEdnWZff+VO2xlq3hr5cDhzkMY9HgPOFEJVSynqh/Ws3An+XUp7nnCR0VNZX6MngJZ7rDQVOlVLeFbyRlHKRECLJuvXlWmmPUOiH9rqvk6NMSrnS/rGfKoSQ6KiOYWhHVAqPULBZiJaKL6Cl8+7o2d4qtA0aACGEY78MOtfWFceU0tbswVtWsYY6QW4LfK6xXwvQM6fD0T+mJ+wfpkMWPaPfK3CNmWgto63+jAPOdZwZy8NCiN8BTcA5aKc0+Pv+50BftDmlK+iu/vRqYv3QtuoxnmM/Qn9X3vT0p4WOfoLATN8mLIrD+33vT66vEm3ULXE+CCFGon0lp3vs7Z2hPX3plHekL+/y+B/6oZ+tEB208SXaZDIebc7z9uWd9ntvkIDDjJBjTl82kftutgshxE7AScCeXWQ/77bvZaB9/0MP9KPQQmZ/9CTv0cDvfDXwGfnBFc2s2SReSwf7sr2019Hc2ZjlM9E/qr/af6Cl/mxsGyOAEGI3tMq0o5Ryhn34KXsGdIUQ4h4ppRQ6dPE6dFjanE62zcH5IoTZ2QmUre3H6WV+4LMzqPRBRxFMQJvx2nqOoF1yLm3351y081iBto8KIc5D25sdc9UstI37WrRPB1t1/S1wqWwj7Hcd6I7+bJRSrgo53sfzfgJauK0IqRdGmpyJ04vXn6PImeHaqusd/P+Cts3/q51tWBvt6UunvCNhisHvpvM7d/rTMcs92Mb5fUKOhYXmOn2p6ICZV+jIxJuAx6WUb7f3vLXQU79zxz8W7Mu3CCf4+1+4loABi86bzENpj1CoAQqFEMXrOuuRUtYDh9kzqNHAPFvdfQc983U4E1jsEQgOz6Btdbug1chz0DObBz1mo+H2a1/72KIORmE4tvltyEVDBdnGfv26A9cN+iecdRnODyVi1zkI/z/5KXQ4qTcKCqBlDf35oV3HtfNKKW8WOjplG3To3wx06CHk+v4yoB542dOfg+3XgfaxjjoGvf05o406He3PYF/WkD9bjaDNFSfZn0+039+BDjdeHKjfSM405MV7bCV65uYcD5qQhqBDqRFC7AD8GDge7eR16sQAx6FeswZ7dhiz0IPtNm1VEEKMQs9s1/W7WYPWXiEnHByf4y/QmkOwL4NkWXNfFuP3QayNw9E299+EmIcr7GPLOjgueb+XbdEVv3OHYF8eR/iEJfgMa3umKjrWl+2mPULB6cQxdKyT8pBSzseWqEIvctkBf4z3IMJV0rj96rR3JDqOfkZI3d/af1vgd8KujbfRA+MxQoir2nA2n4D+57/kOdZRae0MKCPQAm42+plnSimrnUpCiDTab9DmIrOQ/tzWLvomUK8Jj4/Gdh4u8dQbabcnLKTSMdcU07FY+xfQfXUCuRBZF6HXJxyDDvt8xz7c0b4M+//OBvZGq++noQexG6SUv2zjGiuAHYQQVkDo7Yx+3iJ0Pznfy8n4gwSGoickM+xDji8mbHY9DK3NnU2+WbFNpJRNdrTLXkKIkfb/PYhjHnvec2xdhLgXx5Ffh3a2r60vM7Tdl43o3/c3oWeGMxI9mL4eUnaK/XcQ2n/WLmxLw0z0pKpMBhbP2nS2L8Nw+nKJbOfCzLawfWkFdKwv2017oo+cwWTyGmt1nGvQMwuvjfg7dPjb7oG6x9qvn9qvd6JnEd4/x5l7l/15YUcaYw+cf0ULkyuD5UKIU9GROXdJKRd4iprIOXjbg/PlcGYjT6L74XdhlYVeh9EerrFfFf5IheD1dkU7FP/mCce7hvz+dMJy/2R/btcCIwd74LoPHdp3akiVK9EO9794Ikpa7PZXtfM274Yc+zf6B3M/OhDhQXT0GkKIQqFXa3uZhXbqHeYcsG2+RwHVaP+ElFJ+hR44zxD+BXdno/9/jlP7ffL78nC08PnAft/uQczDVWjBdJfQa1VchE6xcAl60vZvT1ET2o7dHsL68hO0WeP3BPrSvm/QtJmi7b58Ey1g36H9PEt4X4I2Mx/OukVF/hFtYvy77RB2EUIciBY2r0gpvX3S0d95kJfR5uLfCL1I1kfAz7A2drBfO9KX7WatmoKUco4Q4kv0gOib8dnhos7stBAduXC5/fl+J3xOCHEZerB9H60GT0UvDDlT+hej3Yz+hzxnR/XMRy9yORZ40Zk1S71U3hdP7VEvv5CBtAxCx6O/KaXcay2PezU6RPZyoWOUn0J/0fdDOzCno0PtvHwM7GdHCy0G5kop31/DPRzVcTd0qoBZthP4j0KIHdHCLIUO4TsWqBRCfIw/cqut/vwcWOX4BYQQ49B27WfQaz0mooXnW+R8EYS1V+QWFL3v7U+7n+fSvrQEF6AH/n/a4a6voAe2qeg+fQJw87hIKZNCiC+Ao4UQ36EH5C+llF+GXdz+bi5Hp0Nxjv1XCPE0eiBKotX3e4ReobozcIsQ4kYppbMWZiba7nufEOI6tEp+DnrCFAGe8cx6f43uy5fsqJGJ6DDX26WU39n3X0KI+VEIcSN6lvhU4PgbaCfqGv12Uso3hBAXo31Bnwm9LmAFenJxOlrLPSpgMv0YOF4I8Vd0aGOjlDI0M4DdlxKtETjHMkKI69Eh0hn0d/If9kRla2CZEOJIT1+m0BOSsL78HP1bfs1+7rWOHVLK2eQmUd4+A5gd0pfVdrtHhz2j57nusx3Y5wJbCiEeQg/Yu6K1oZkEQnPRfXme3cZZ6MirMA2mrXvWCyF+hl4U95H9/alBm38PRX9nLm/zAn72R/8Gv1hbxXWhvWku7kYv4ikIHD8SvXjsD+hZwCTPZ29EyOfo2OCr0V/qInT41h3ei0kpJVoKvoy2X05D/6OuRc9uO4zIpaVYa6y41PlrjkD/yErRM+gb0E6iC4F9QtTNC9ERLX9Ex923Nynd/k5/SimvQi9CGwR8Hx0xFEPPeKfSvv48Ej0A3+upV4cWBueh46gPRg/CP5D5q6nbS0f6swFtyvk1OqLlerTmUYY27RwVYqY7Ay0Y/4ruzx+xZmaAu+LV4Sn7tQBtwz0J/UOqQM+ovRFrCvgBeg3J+Wgn8Qr05GQzPP0p9QLBI9D+rGn2eydFwrpSRm5x5hqRUv4FvV5hJvp7dwv6u/IPYFspZdC8ezs6AOFk9ORg2lpu4fgJvJpQs+fYVLQ/6nB0VNJu5Ef/hfXl3na7H5e50Oj2jh0doZR2fC8BpJQ/Q3+3GtBa+s1on+XV6AwAwetchdZOLkJ/L0M1+7Xc837093AF+nt4o92Gd4CH23MNW7M5Eh2a3S2OZkuptV/XtlfPRSfK6tTK4Z5GCPF99ErWbW0No9fpjv4UQpyP/sKOX9fw4Xbe5yx05Nc4zwyx1+iu76Y9u95DStnVZlPvPcrQUSoXSCn/3l336UB7quievtwWbeaZJKVc0/qAztxjc7SN3ZciZ2ND6ISMDwFju+v31y5NwTZH/AW4SGx4qbP3Ah5eXwQCdH1/2jbKX6KzdXabQLDZC+2P6HWBAN3z3RRC9EFri3npTrqYKegsp//o5vu0i278nV8E/Lu7BILNXsC7G7NAsLkYna25235/7dIUDAaDwbBpYHZeMxgMBoOLEQoGg8FgcDFCwWAwGAwuRigYDAaDwcUIBYPBYDC4GKFgMBgMBhcjFAyGjRghxFQR2NLUYFgTRigYDBs3U7F3pTMY2oMRCgaDByFE3N7EaZNECFEclsXTsOlgVjQbegUhxOHoLKlnSCnz0jwIIb5CZ8+cIKVUQogJ6CRk+6ET0i1GJ3C70pNkzcmBcz46I+dIdCK3b4BbpZT/DNzjSvQseiI60duP0RvC7LumnPd2CojT7L+t7MNzgSellL/z1OsP/B86C+YgYBk6y+rvpJQ1nnpOO8Z499Swy6qBam+GXzvr773ohHd/Qqe1b0WnYb/ASdroZGANeYRTpJT32JlWf4LOMvtn9Eb1A4DvofcXeUxKeXzI8/8dnfhxbLC9hg0fMyMw9BbPorOD/pRA7h8hxPfQm5JfZguEHdAbrdShB8JF6LTL5wO7CSH29KSM3gvYA53Rci46c+ZR6JTPA6SU15DPg+i9HK5HZ01dW6bN+9E7q72Pzp5Zh85Q+yPs7JlCiEp09svx6D0+PkFnAj0b2EcIsVMHd18Lsh36Ge9GZ0DdCy3YsuhMs9hti6D3OT/Rc24wD/8r6P/FH9D9NQctvI4QQlRJzxatthZ1HPCqEQgbJ0YoGHoFKWVa6G1CLxVCbBlI+3wqOn//Pfbnu9AD9Y7egVQI8Rpa2zjeU/d+KaVvVzMhxA1ooXKJEOI6mb9Nax2wn506fY0IIZytNh8AfuLZqMhJa+xwETrl+rlSyls8dWag0zRfROcS7m0D7OLZC+N2ewOhU4QQv5RSNkopXxFCHA/sLqV8YA3X+lJKeYL3gBDiDnSK5uPQKbodjkRvNuPTugwbD8anYOhN/oGembs7swkhStF7S7wgpVwshNgaPQD+C71XeH/nD23iaEJvMAS4O+g51yoSQvRD77L1Mno/hc1D2nFjewSCjWNOudArEOx7ez87u6359gxBazoryO0gtq68G7I50uvoid7oDl7rupBjr6A1reCueaeiN4d5qoP3MGwgGKFg6DXsXfdeBU4UQjj7cP8YKCc3E3U2cfk/9GDq/VuONncMcq4phCgTQlwnhJiPNgmttOteZVfpE9KU7zrQ7AnoHdTWlrp4DHrfKJ+wsT9/h950qDPMCTnm+Cn6dfBaec9vb+DyT2B7e7tPhBBj0Waq+zuxSZNhPceYjwy9zR1oh/Gh6H2OT0Xbt528+E5e/+tpe2/jWs/7f6F3mLsDve1oDdoU9QPgF4RPhJpDjvUka4r2aOs3GtyxzkuH9kLw7JEd5C60MD4VvXvfT+1rG9PRRowRCobe5mn0jP9Uey/w3YA/e2bYM+3XjJTy1TVdyN457GD0TPasQNl+XdTe74DDhBCD1qItzNG3FTGvtmCHe26Gf6a/yn7tC1R76haho6FmdaK96xxeKKVcKoR4Fr3P8yXobT3fl1J+1Yn2GNZzjPnI0KvYTt97gAPJLbK601PlU+BL4CzbfOFDCBGzN5KH3OzZCtQZgg4f7QoetF+vDTiWnVBVh6fQ4Z3B+55uH3/Sc8wx3wQFV1uaTUdwwlP7rq1iG/wDbXK7DRiG0RI2eoymYFgf+Afwa+BY4E0ppaMdYIeknoh2on4uhLgL+AooQYd7HgFcCtwjpVwthHgZOEEI0QJ8CIwCzkQ7TTtka/esHzhFSnmP3Z7HhBCPACcBE4QQz6DNV5uhBdtE+/Rr0aGwfxdCbI8WbpPQphhplzu8ah/7ve0Yn4veqvN7aJ9IZ3gP+BlwixDieSCFnu3Pbef5LwHzgBPQAqZdG8wbNlyMpmDodaSUs4D/2h/vDCmfgR5QH0D7HqYBl6MHzXuA1zzVT0Dbwg9Bh35OBS4D/r4OTSu3XxcFjh+HHmiL0OsSrgP2R/tGnDbXo01ht6P9GX+zX28DpnhDa6WUGfu53kDb7v8EFKAXnrnRVOvIQ2h/zBR0Xz1E+IK2UOyIKud/8qizMM6w8WJWNBvWC4QQ/wF2AYZKKVt6uz0AQohPgNVSynYPohsjQoiL0Cued5VSvtvb7TF0L8Z8ZOh1hBDj0aaXW9YjgTAQvWp6595uS29iO8bPBL4wAmHTwAgFQ68hhNgZvQ7hfCCJNnOsF0gpl6PzJm2SCCHGoDW3w9BrKo7t3RYZegojFAy9ydloh+0c4HiTS2e9Yk90XqWVwO+llMbBvIlgfAoGg8FgcDHRRwaDwWBwMULBYDAYDC5GKBgMBoPBxQgFg8FgMLgYoWAwGAwGFyMUDAaDweDy/yvqRmPfzHugAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# back to simpler example, adding plots\n",
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['comb08', 'speeds']]\n",
" .mean()\n",
" .plot()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"2\" halign=\"left\">comb08</th>\n",
" <th colspan=\"2\" halign=\"left\">speeds</th>\n",
" </tr>\n",
" <tr>\n",
" <th>country</th>\n",
" <th>Other</th>\n",
" <th>US</th>\n",
" <th>Other</th>\n",
" <th>US</th>\n",
" </tr>\n",
" <tr>\n",
" <th>year</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1984</th>\n",
" <td>21.417330</td>\n",
" <td>17.797119</td>\n",
" <td>3.969054</td>\n",
" <td>3.872749</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1985</th>\n",
" <td>21.373068</td>\n",
" <td>18.025157</td>\n",
" <td>3.958057</td>\n",
" <td>3.886792</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1986</th>\n",
" <td>21.213622</td>\n",
" <td>17.645390</td>\n",
" <td>4.069659</td>\n",
" <td>3.886525</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1987</th>\n",
" <td>20.710414</td>\n",
" <td>17.326007</td>\n",
" <td>4.142653</td>\n",
" <td>3.902930</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1988</th>\n",
" <td>20.814642</td>\n",
" <td>17.372951</td>\n",
" <td>4.205607</td>\n",
" <td>4.028689</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1989</th>\n",
" <td>20.662261</td>\n",
" <td>16.908898</td>\n",
" <td>4.264317</td>\n",
" <td>4.025424</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1990</th>\n",
" <td>20.640747</td>\n",
" <td>16.577011</td>\n",
" <td>4.328149</td>\n",
" <td>4.105747</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1991</th>\n",
" <td>20.174468</td>\n",
" <td>16.599532</td>\n",
" <td>4.341844</td>\n",
" <td>4.234192</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1992</th>\n",
" <td>20.098731</td>\n",
" <td>16.735437</td>\n",
" <td>4.356841</td>\n",
" <td>4.252427</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1993</th>\n",
" <td>20.309760</td>\n",
" <td>16.896373</td>\n",
" <td>4.371994</td>\n",
" <td>4.279793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1994</th>\n",
" <td>20.264423</td>\n",
" <td>16.829609</td>\n",
" <td>4.355769</td>\n",
" <td>4.293296</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1995</th>\n",
" <td>20.091054</td>\n",
" <td>16.422287</td>\n",
" <td>4.380192</td>\n",
" <td>4.313783</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1996</th>\n",
" <td>20.906615</td>\n",
" <td>16.961390</td>\n",
" <td>4.416342</td>\n",
" <td>4.262548</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1997</th>\n",
" <td>20.509470</td>\n",
" <td>16.991453</td>\n",
" <td>4.452652</td>\n",
" <td>4.290598</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1998</th>\n",
" <td>20.457295</td>\n",
" <td>17.408000</td>\n",
" <td>4.485765</td>\n",
" <td>4.272000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999</th>\n",
" <td>20.386023</td>\n",
" <td>17.756972</td>\n",
" <td>4.507488</td>\n",
" <td>4.215139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2000</th>\n",
" <td>20.301370</td>\n",
" <td>17.757812</td>\n",
" <td>4.619863</td>\n",
" <td>4.253906</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2001</th>\n",
" <td>20.289026</td>\n",
" <td>17.496212</td>\n",
" <td>4.761978</td>\n",
" <td>4.412879</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2002</th>\n",
" <td>20.076923</td>\n",
" <td>16.979021</td>\n",
" <td>4.920174</td>\n",
" <td>4.367133</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2003</th>\n",
" <td>19.953020</td>\n",
" <td>16.628763</td>\n",
" <td>5.154362</td>\n",
" <td>4.307692</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2004</th>\n",
" <td>19.923833</td>\n",
" <td>16.805195</td>\n",
" <td>5.229730</td>\n",
" <td>4.308442</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2005</th>\n",
" <td>19.892078</td>\n",
" <td>17.132203</td>\n",
" <td>5.362801</td>\n",
" <td>4.688136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2006</th>\n",
" <td>19.509025</td>\n",
" <td>17.285714</td>\n",
" <td>5.492178</td>\n",
" <td>4.776557</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2007</th>\n",
" <td>19.452038</td>\n",
" <td>17.626712</td>\n",
" <td>5.864508</td>\n",
" <td>4.883562</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008</th>\n",
" <td>19.677985</td>\n",
" <td>17.937956</td>\n",
" <td>5.969332</td>\n",
" <td>5.120438</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2009</th>\n",
" <td>20.186329</td>\n",
" <td>18.259928</td>\n",
" <td>6.189636</td>\n",
" <td>5.563177</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010</th>\n",
" <td>20.851598</td>\n",
" <td>19.600858</td>\n",
" <td>6.378995</td>\n",
" <td>5.866953</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2011</th>\n",
" <td>21.635308</td>\n",
" <td>19.014870</td>\n",
" <td>6.714286</td>\n",
" <td>6.066914</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012</th>\n",
" <td>22.339751</td>\n",
" <td>20.111524</td>\n",
" <td>6.834655</td>\n",
" <td>6.286245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2013</th>\n",
" <td>23.471658</td>\n",
" <td>21.823293</td>\n",
" <td>7.033155</td>\n",
" <td>6.385542</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014</th>\n",
" <td>23.655870</td>\n",
" <td>23.012658</td>\n",
" <td>7.210526</td>\n",
" <td>6.046414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2015</th>\n",
" <td>23.935294</td>\n",
" <td>24.441065</td>\n",
" <td>7.211765</td>\n",
" <td>6.353612</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016</th>\n",
" <td>24.439716</td>\n",
" <td>27.701818</td>\n",
" <td>7.296859</td>\n",
" <td>6.301818</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017</th>\n",
" <td>24.910521</td>\n",
" <td>26.496377</td>\n",
" <td>7.474926</td>\n",
" <td>6.304348</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2018</th>\n",
" <td>24.779868</td>\n",
" <td>25.925267</td>\n",
" <td>7.391345</td>\n",
" <td>5.601423</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019</th>\n",
" <td>25.456922</td>\n",
" <td>26.250000</td>\n",
" <td>7.545983</td>\n",
" <td>5.647887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2020</th>\n",
" <td>25.174359</td>\n",
" <td>26.571429</td>\n",
" <td>7.743590</td>\n",
" <td>7.785714</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comb08 speeds \n",
"country Other US Other US\n",
"year \n",
"1984 21.417330 17.797119 3.969054 3.872749\n",
"1985 21.373068 18.025157 3.958057 3.886792\n",
"1986 21.213622 17.645390 4.069659 3.886525\n",
"1987 20.710414 17.326007 4.142653 3.902930\n",
"1988 20.814642 17.372951 4.205607 4.028689\n",
"1989 20.662261 16.908898 4.264317 4.025424\n",
"1990 20.640747 16.577011 4.328149 4.105747\n",
"1991 20.174468 16.599532 4.341844 4.234192\n",
"1992 20.098731 16.735437 4.356841 4.252427\n",
"1993 20.309760 16.896373 4.371994 4.279793\n",
"1994 20.264423 16.829609 4.355769 4.293296\n",
"1995 20.091054 16.422287 4.380192 4.313783\n",
"1996 20.906615 16.961390 4.416342 4.262548\n",
"1997 20.509470 16.991453 4.452652 4.290598\n",
"1998 20.457295 17.408000 4.485765 4.272000\n",
"1999 20.386023 17.756972 4.507488 4.215139\n",
"2000 20.301370 17.757812 4.619863 4.253906\n",
"2001 20.289026 17.496212 4.761978 4.412879\n",
"2002 20.076923 16.979021 4.920174 4.367133\n",
"2003 19.953020 16.628763 5.154362 4.307692\n",
"2004 19.923833 16.805195 5.229730 4.308442\n",
"2005 19.892078 17.132203 5.362801 4.688136\n",
"2006 19.509025 17.285714 5.492178 4.776557\n",
"2007 19.452038 17.626712 5.864508 4.883562\n",
"2008 19.677985 17.937956 5.969332 5.120438\n",
"2009 20.186329 18.259928 6.189636 5.563177\n",
"2010 20.851598 19.600858 6.378995 5.866953\n",
"2011 21.635308 19.014870 6.714286 6.066914\n",
"2012 22.339751 20.111524 6.834655 6.286245\n",
"2013 23.471658 21.823293 7.033155 6.385542\n",
"2014 23.655870 23.012658 7.210526 6.046414\n",
"2015 23.935294 24.441065 7.211765 6.353612\n",
"2016 24.439716 27.701818 7.296859 6.301818\n",
"2017 24.910521 26.496377 7.474926 6.304348\n",
"2018 24.779868 25.925267 7.391345 5.601423\n",
"2019 25.456922 26.250000 7.545983 5.647887\n",
"2020 25.174359 26.571429 7.743590 7.785714"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['comb08', 'speeds']]\n",
" .mean()\n",
" .unstack()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f22cdce5b20>"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['city08', 'speeds']]\n",
" .mean()\n",
" #.std()\n",
" .unstack()\n",
" .city08\n",
" .plot()\n",
" .legend(bbox_to_anchor=(1,1))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f22ce028a60>"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# smoothe it out a bit w/ rolling\n",
"(autos2\n",
" .assign(country=autos2.make.apply(country))\n",
" .groupby(['year', 'country'])\n",
" [['city08', 'speeds']]\n",
" .mean()\n",
" .unstack()\n",
" .city08\n",
" .rolling(3)\n",
" .mean()\n",
" .plot()\n",
" .legend(bbox_to_anchor=(1,1))\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:xlabel='year'>"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEcCAYAAADQqlM0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABOi0lEQVR4nO3deZwUxd348U/PPXvfy30JFCooKoigQSX6+PPEKxoeAY364PHEO4nyJI/RHCYoRqMmxvvWBw+MUeOFUfGEaEKIiCUo93LsvTu7c0///ujecXfZhZ1l9v6+ec2rZ6qrq2t6h/lOVVd1G6ZpIoQQQnSUo6crIIQQom+RwCGEECIlEjiEEEKkRAKHEEKIlEjgEEIIkRJXT1cgjWJYgbCupysihBB9SA6QIIV4YPSj4bgJwOjpSgghRB9kkkIPVH/qqpKWhhBCdE5K35/9KXAIIYToBhI4hBBCpEQChxBCiJRI4BBCCJESCRxCCCFS0p/mcXRIQ0MDdXV1xGIxEolET1dHdIDD4cDn81FUVIRhyIhrIXragAkciUSCsrIy6uvrcTgcuN1unE5nT1dLdEA0GiUQCBAOhxk6dKgEDzGgmPGdEN+E4Tm8p6uSNGACR21tLfX19RQVFVFYWIjDIb10fUlVVRU7d+6koqKC4uLinq6OEN3CjG/DrDgDzBoofBHDfWBPVwkYQOc4AoEAHo+HoqIiCRp9UEFBAV6vl1Ao1NNVEaJbmGYIs/qHVtAw8sA5tKerlDRgvkETiQQul0u6Ofowp9Mp56XEgGCaJmbdzRBbAzgw8u7AcOT1dLWSBkzgEEKIPiO4BIIvAGBkXYfhPbKHK9SSBA4hhOhFzMgqzLpfWi+8J0DmxT1boTZI4BBCiF7CjFdg1vwQiIJzDEbub3pl97oEjgFg3rx5zJo1q6erIYTYA9OMYtZcBYldYGRi5P8Bw5HV09VqkwQOIYToBcz62yD6dwCM3EUYrv16uEbtk8AhhBA9zAy+Ao2PWi8yL8Hw/UeP1mdvJHAIIUQPMqNfYtb+j/XCcyRG1tU9Wp+OkMDRA5YuXYpSio8//ph77rmHY489loMOOojvfe97rFq1CoCVK1cyZ84cJk+ezFFHHcUf/vCHFmV88MEHXH311Xz3u9/loIMOYsqUKVx44YWsXLmyQ3Worq7m3HPP5bDDDuPjjz9Opn/00UdceOGFTJkyhUmTJnHqqafyzDPPpO29CyG+ZSbq7ZPhIXAMxcj7HYbR+y+FNGAuOdIbLV68mEQiwfz584lGozz88MNceOGF3Hrrrfz0pz/lnHPO4dRTT+W1117jrrvuYtiwYcyePRuAF198kdraWk4//XQGDRrEzp07ee6557jgggt4/PHHmTJlSrv73bJlCxdffDENDQ08+eST7L///gAsWbKEn//850yePJlLL70Uv9/PRx99xE033cTmzZu5/vrru+W4CDFQmA0PQ3wz4MXIvwfDkd/TVeoY0zT7y6PG3IONGzeaGzdu3FOWbvPCCy+Y48ePN08//XQzHA4n05ctW2aOHz/ePOCAA8zVq1cn08PhsHnkkUea55xzTjKtoaFht3LLy8vNww8/3Lz44otbpM+dO9c89thjTdM0zTVr1phHHnmkecIJJ5hbtmxJ5tm5c6c5ceJE89prr92t3F/+8pfmhAkTzM2bN3f+TadBb/obCrGvEvGAGd8xxYxvH2fG637X09WpMVP4vpWuqh40Z84cPB5P8nVTK+Gggw5i0qRJyXSPx8OkSZPYuHFjMi0jIyP5vKGhgerqahwOBwcffDCrV69uc38fffQRc+fOZejQoTzzzDMMGzYsue6NN94gEolw9tlnU1VV1eIxa9YsEokEH330UbreuhAi+AKYtYAHI2N+T9cmJdJV1YOGDx/e4nVubi5Aiy/05utqamqSrzdv3swdd9zBBx98QF1dXYu8bU0YqqioYMGCBey33348+uij+P3+Fuu//vprAC644IJ261tRUbHH9yOE6BjTjFrdVAD+szCchT1boRRJ4OhB7V2ld2/3CWloaOC8884jGAxy/vnnM378eDIzM3E4HNx333188sknu22Tm5vLgQceyLvvvsvLL7/MOeec02K9aZoALFq0iJKSkjb32zrQCSE6KfQaJMoAB0bmhT1dm5R1KHAopQYDVwHTgClAFnCs1vrdNvKeBtwEHADsAh4Cfq21jrXKlwfcCpwBZAArgGu11qs69U4GkI8//phdu3Zxyy23cNZZZ7VYd+edd7a5jdvt5u677+aaa67hxhtvJBqNct555yXXjxo1CoD8/HxmzJjRVVUXYsAzTROz4QHrhe8EDNfInq1QJ3T0HIcCrgeGAW13oANKqROBPwNVwBX28xuBO1rlcwCvAt8H7gZ+ApQC7yqleu90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3IhSiqeeeiqZtnnzZq688kqmTp3KwQcfzJw5c1ixYkVy/dKlS/nv//5vAObPn49SCqVUMs+yZctYsGABRx11FBMnTuS4447jD3/4Q4vbyQohei9pcfRzpmly2WWXsXLlSs455xzGjx/PO++8w80330xtbS2XXXYZmZmZHHfccbz++ussXLgQp9OZ3P7ll1/G7XZz0knW3YArKiqYM2cOkUiEefPmkZWVxfPPP89FF13EQw89xLRp05g6dSrnn38+jz32GJdeeiljxowBYL/99gPgxRdfJCMjgx/84AdkZGTwySefcNdddxEIBLj++uu7/yAJIVIigQOImzFqo1U9XQ1y3QU4jfT+Sd5++21WrFjBddddx4IFCwA477zzWLBgAX/84x8599xzKSgoYPbs2bz88st88sknHHnkt7eCf/nllznqqKPIz88H4P7776eiooIlS5YwefJkAM4++2xOOukkFi1axNKlSxk+fDiHH344jz32GDNmzGDatGkt6nT77bfj8/mSr+fMmcONN97IM888wzXXXIPH40nrMRBCpNeADxxxM8atX15DZWRnT1eFQk8pP5lwR1qDx/Lly3G73cydOzeZZhgG8+fPZ/ny5Xz88cecfPLJzJgxg+LiYl5++eVk4Fi9ejWbNm3i6quvTm773nvvccghhySDBkBOTg5nnHEG999/P+Xl5RQXF++xTs2DRiAQIBKJMGXKFJYsWcI333zDhAkT0vPmhRBdYsAHjv5u27ZtlJaWkpGR0SK9qfto27ZtADidTk499VSeffZZbr75ZrxeL3/5y1/Iyspi1qxZye3Kyso49NBDd9tPU3llZWV7DRzr1q3jzjvv5JNPPiEQCLRYV19fn/qbFEJ0qwEfOJyGi59MuKPfdlWlYvbs2Tz88MO88847HH/88bz22mv8x3/8R4sWwr6qq6tj7ty5ZGVlceWVVzJixAi8Xi9r1qxh8eLFJBKJtO1LCNE1BnzgACt4FHhKeroaXWLo0KGsWLGCxsbGFq2ODRs2JNc3mTBhAkopXn75ZTIzM6moqOC0005rUd6QIUOS2zbXlDZkyJA91mflypXU1NRwzz33MHXq1GT61q1bU39zQogeIcNx+7mZM2cSjUZbDL81TZMnnngCj8fD9OnTW+Q//fTTWb58OU8//TQlJSW7ndg++uij+ec//8nq1auTafX19Sxd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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# One more example of cleaning up with Matplotlib\n",
"makes = ['Tesla', 'Honda', 'Toyota', 'Ford']\n",
"(autos\n",
" .query('make.isin(@makes)')\n",
" ##.loc[autos.make.isin(makes)]\n",
" .groupby(['year', 'make'])\n",
" .city08\n",
" .mean()\n",
" .unstack()\n",
" .loc[:, makes]\n",
" .plot()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"lines_to_next_cell": 2,
"pycharm": {
"name": "#%%\n"
},
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAGmCAYAAACz98ctAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqSElEQVR4nO3dd3gU1cIG8Hd7Te8BkhB6l96kCYIICmIBRQW7VyxcbJ/e4r1WruXa21URK0WqCKKgiDRpht5CCKSQ3sv2Pd8fm0yyJEA2dQLv78k+uztzdubM7mbfKWfOKIQQAkRERCRLypauABEREZ0fg5qIiEjGGNREREQyxqAmIiKSMQY1ERGRjDGoiYiIZIxBTUREJGMMaiIiIhljUBMREcnYZRXUCoUCDz74YIOnc/r0aSgUCsyfP78RatU4Zs+eDb1eLz3/17/+BYVCgczMzBasFRERNVS9g/qxxx6DQqHAsWPHGrM+La68vBx/+9vfEB8fD61Wi6ioKNxxxx1ITk6WykRGRmLDhg249dZbG33+cXFxUCgU+OSTT85b5p133oFCocDo0aOlYU899RR+/PHHRq8PERG1rHoFtcvlwpIlSwAAixYtatQKtSSHw4EJEybgnXfewT333IMVK1bg6aefxqZNmzBw4ECcOnUKAKDX6zFu3DjExsZKr50/fz4UCgVOnz7dKHX57LPPfBrXvXt3jBkzplHmTURE8lGvoN64cSOysrIQFRV1SQX1O++8g61bt+Krr77C3/72N0yePBlz587Fb7/9htLSUjz//PPNUg+1Wo2dO3fi8OHDNcbt2rULBw4caJZ6EBFRy6tXUH/zzTcICQnB888/j8TEROzdu9dr/MKFC6FQKLBr1y5MnjwZJpMJcXFxNY7pKhQKvPTSS3j++ecRGRmJoKAgTJs2DRkZGVKZc4+9AkBmZiYUCgX+9a9/ScNKSkrw+OOPIzY2FiaTCX379sWyZct8Wq6vv/4a3bp1w9SpU72Gd+zYEePHj0d6ejqAmseo4+Li8MwzzwAA2rdvj9GjR2Pp0qVQKBR47733vKb1yCOPQKFQYP/+/eetx/DhwxEUFIRPP/20xrjPPvsMUVFR6NChg9fw2t6ncyUlJeH666+HyWRCVFQUZsyYgbNnz3qV+e6779C/f3+YTCbExMRg3rx5KCsr8yqzatUqdOvWDXq9Hn369MHGjRtrfL5lZWV4+OGHERYWhsDAQIwaNQp//PHHBetHREQ1+RzU5eXlWLlyJaZMmYIbbrgBarX6vFvV999/PyZPnoxvv/0WAwYMwDPPPFMjPN99913k5eXh008/xbPPPot169bhvvvu83lBbr75ZnzyySd44okn8PXXXyMwMBDTp0/Hli1b6jyNY8eOoU+fPrWO+/7777Fhw4Zax33zzTe45557AHjC/o033sDUqVMREhKCxYsXS+XcbjeWL1+OK6644rzzATy71u+44w58/fXXsNvt0vCysjIsXrwYd999N9RqdZ2XCwCys7MxYsQIFBcX48svv8T8+fOxe/duTJo0CW63GwCwePFi3HLLLejVqxcWLVqEWbNm4a233sLcuXOl6SQkJOCmm26C0WjEZ599hsceewwPPvggUlJSpDJCCEydOhVr167Fq6++igULFkCr1WLs2LFITU31qd5ERJc94aNFixYJAGLt2rVCCCGuuuoq0bZtW+F2u6Uyn3/+uQAg1q9fLw2zWCzCaDSKO++8UxoGQMyYMcNr+nfffbdQqVTC4XAIIYSYNWuW0Ol0XmUyMjIEAPHcc88JIYRwOBzipptuEgsWLJDKZGdnCwDiiSee8JrfAw88cN5lu9j4SsnJyQKAeOWVV6Rhr7zyigAgkpOTpWFz584VCoVCpKSkCCGE+O233wQA8dZbb5132rGxsWLChAni0KFDAoBYunSpNG7BggVCqVSK5ORk0aVLFzFq1Chp3Lnv03PPPScAiIyMDCGEEE888YQIDg4W+fn5wmKxCIvFIr777jsBQOzYsUMIIcRbb70lZs2a5fVZXnvttSI0NFR6fttttwm9Xi9ycnKkYdu2bfN6P3744QcBQPz+++/SvDIzM4VCofB6z4iI6OJ83qL+5ptvEBAQgHHjxgEAbrjhBqSlpdW65RoQECA91uv1aNOmDdLS0s5bBgA6dOgAl8vltfv7YtRqNb777jvcddddAAC73Q4/Pz/odDrk5OTUeTqN7d5774UQQmp4t3TpUmg0GsycOfOir+3RoweGDRvm1XDss88+w9VXX424uDif6/Lrr78iPz8fwcHBMBgMMBgMuPnmmwF4dokDnpb8lYctXC4XrFYroqOjkZubK03njz/+wKhRoxAaGioNi46OrjEvABg5cqQ0r8jISAghpHkREVHd+LT/NC8vDz/99BOu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\n",
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.reset_defaults()\n",
"makes = ['Tesla', 'Honda', 'Toyota', 'Ford']\n",
"colors = ['#e3120b', '#76725e', '#b3b09e', '#d2d0c4']\n",
"fig, ax = plt.subplots(figsize=(6,4), dpi=100)\n",
"ax = (autos\n",
" #.query('make.isin(@makes)')\n",
" .loc[autos.make.isin(makes)]\n",
" .groupby(['year', 'make'])\n",
" .city08\n",
" .mean()\n",
" .unstack()\n",
" .loc[:, makes]\n",
" .plot(color=colors, legend=False, linewidth=3, ax=ax)\n",
")\n",
"plt.rcParams[\"font.family\"] = \"Roboto\"\n",
"plt.grid(axis='y')\n",
"plt.suptitle('Annual City Mileage', ha='left', x=.12)\n",
"[ax.spines[side].set_visible(False) for side in ['top', 'left', 'right']]\n",
"ax.tick_params(left=False) # hide ticks\n",
"ax.set_xlabel('') # clear x label\n",
"ax.set_xticks(minor=True, ticks=range(1984,2020))\n",
"# set positions and labels for major ticks\n",
"ax.set_xticks(ticks=range(1985,2019,5))\n",
"ax.set_xticklabels(['1985', '90', '95', '2000', '05', '10', '2015'])\n",
"ax.set_yticks(ticks=range(0,121,20))\n",
"ax.set_yticklabels([]) # hide left hand side\n",
"for label in range(20,121,20): # my own vertically shifted y-labels\n",
" ax.text(2022, label+3, f'{label}', color=colors[-3], ha='right')\n",
"for label, pos, color in zip(makes, [(2015, 110), # label makes\n",
" (2010, 33),\n",
" (1986, 20.5),\n",
" (1995, 10),\n",
" ], colors):\n",
" ax.text(*pos, label, color=color, ha='left')\n",
"_ = ax.text(1982, -20, 'Source: fueleconomy.gov', ha='left')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Summary\n",
"\n",
"* Correct types save space and enable convenient math, string, and date functionality\n",
"* Chaining operations will:\n",
" * Make code readable\n",
" * Remove bugs\n",
" * Easier to debug\n",
"* Don't mutate (there's no point). Embrace chaining.\n",
"* ``.apply`` is slow for math\n",
"* Aggregations are powerful. Play with them until they make sense\n",
"* Upcoming course \n",
"* https://store.metasnake.com/effective-pandas-book?coupon=CORISE\n",
"\n",
"Follow me on Twitter ``@__mharrison__``\n",
"\n",
"Book giveaway!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import random\n",
"random.randrange(1,13)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
}
],
"metadata": {
"jupytext": {
"encoding": "# -*- coding: utf-8 -*-",
"formats": "ipynb,py:light"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment