{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
    "    <a href=\"https://cocl.us/corsera_da0101en_notebook_top\">\n",
    "         <img src=\"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DA0101EN/Images/TopAd.png\" width=\"750\" align=\"center\">\n",
    "    </a>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a href=\"https://www.bigdatauniversity.com\"><img src = \"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DA0101EN/Images/CCLog.png\" width = 300, align = \"center\"></a>\n",
    "\n",
    "<h1 align=center><font size=5>Data Analysis with Python</font></h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Data Wrangling</h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Welcome!</h3>\n",
    "\n",
    "By the end of this notebook, you will have learned the basics of Data Wrangling! "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Table of content</h2>\n",
    "\n",
    "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
    "<ul>\n",
    "    <li><a href=\"#identify_handle_missing_values\">Identify and handle missing values</a>\n",
    "        <ul>\n",
    "            <li><a href=\"#identify_missing_values\">Identify missing values</a></li>\n",
    "            <li><a href=\"#deal_missing_values\">Deal with missing values</a></li>\n",
    "            <li><a href=\"#correct_data_format\">Correct data format</a></li>\n",
    "        </ul>\n",
    "    </li>\n",
    "    <li><a href=\"#data_standardization\">Data standardization</a></li>\n",
    "    <li><a href=\"#data_normalization\">Data Normalization (centering/scaling)</a></li>\n",
    "    <li><a href=\"#binning\">Binning</a></li>\n",
    "    <li><a href=\"#indicator\">Indicator variable</a></li>\n",
    "</ul>\n",
    "    \n",
    "Estimated Time Needed: <strong>30 min</strong>\n",
    "</div>\n",
    " \n",
    "<hr>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>What is the purpose of Data Wrangling?</h2>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data Wrangling is the process of converting data from the initial format to a format that may be better for analysis."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>What is the fuel consumption (L/100k) rate for the diesel car?</h3>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Import data</h3>\n",
    "<p>\n",
    "You can find the \"Automobile Data Set\" from the following link: <a href=\"https://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.data\">https://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.data</a>. \n",
    "We will be using this data set throughout this course.\n",
    "</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Import pandas</h4> "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pylab as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Reading the data set from the URL and adding the related headers.</h2>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "URL of the dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This dataset was hosted on IBM Cloud object click <a href=\"https://cocl.us/corsera_da0101en_notebook_bottom\">HERE</a> for free storage "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "filename = \"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DA0101EN/auto.csv\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " Python list <b>headers</b> containing name of headers "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "headers = [\"symboling\",\"normalized-losses\",\"make\",\"fuel-type\",\"aspiration\", \"num-of-doors\",\"body-style\",\n",
    "         \"drive-wheels\",\"engine-location\",\"wheel-base\", \"length\",\"width\",\"height\",\"curb-weight\",\"engine-type\",\n",
    "         \"num-of-cylinders\", \"engine-size\",\"fuel-system\",\"bore\",\"stroke\",\"compression-ratio\",\"horsepower\",\n",
    "         \"peak-rpm\",\"city-mpg\",\"highway-mpg\",\"price\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use the Pandas method <b>read_csv()</b> to load the data from the web address. Set the parameter  \"names\" equal to the Python list \"headers\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv(filename, names = headers)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " Use the method <b>head()</b> to display the first five rows of the dataframe. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>make</th>\n",
       "      <th>fuel-type</th>\n",
       "      <th>aspiration</th>\n",
       "      <th>num-of-doors</th>\n",
       "      <th>body-style</th>\n",
       "      <th>drive-wheels</th>\n",
       "      <th>engine-location</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>...</th>\n",
       "      <th>engine-size</th>\n",
       "      <th>fuel-system</th>\n",
       "      <th>bore</th>\n",
       "      <th>stroke</th>\n",
       "      <th>compression-ratio</th>\n",
       "      <th>horsepower</th>\n",
       "      <th>peak-rpm</th>\n",
       "      <th>city-mpg</th>\n",
       "      <th>highway-mpg</th>\n",
       "      <th>price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>?</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>130</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>13495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>?</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>130</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>16500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>?</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>hatchback</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>94.5</td>\n",
       "      <td>...</td>\n",
       "      <td>152</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>2.68</td>\n",
       "      <td>3.47</td>\n",
       "      <td>9.0</td>\n",
       "      <td>154</td>\n",
       "      <td>5000</td>\n",
       "      <td>19</td>\n",
       "      <td>26</td>\n",
       "      <td>16500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>fwd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.8</td>\n",
       "      <td>...</td>\n",
       "      <td>109</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>10.0</td>\n",
       "      <td>102</td>\n",
       "      <td>5500</td>\n",
       "      <td>24</td>\n",
       "      <td>30</td>\n",
       "      <td>13950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>4wd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.4</td>\n",
       "      <td>...</td>\n",
       "      <td>136</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>8.0</td>\n",
       "      <td>115</td>\n",
       "      <td>5500</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "      <td>17450</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   symboling normalized-losses         make fuel-type aspiration num-of-doors  \\\n",
       "0          3                 ?  alfa-romero       gas        std          two   \n",
       "1          3                 ?  alfa-romero       gas        std          two   \n",
       "2          1                 ?  alfa-romero       gas        std          two   \n",
       "3          2               164         audi       gas        std         four   \n",
       "4          2               164         audi       gas        std         four   \n",
       "\n",
       "    body-style drive-wheels engine-location  wheel-base  ...  engine-size  \\\n",
       "0  convertible          rwd           front        88.6  ...          130   \n",
       "1  convertible          rwd           front        88.6  ...          130   \n",
       "2    hatchback          rwd           front        94.5  ...          152   \n",
       "3        sedan          fwd           front        99.8  ...          109   \n",
       "4        sedan          4wd           front        99.4  ...          136   \n",
       "\n",
       "   fuel-system  bore  stroke compression-ratio horsepower  peak-rpm city-mpg  \\\n",
       "0         mpfi  3.47    2.68               9.0        111      5000       21   \n",
       "1         mpfi  3.47    2.68               9.0        111      5000       21   \n",
       "2         mpfi  2.68    3.47               9.0        154      5000       19   \n",
       "3         mpfi  3.19    3.40              10.0        102      5500       24   \n",
       "4         mpfi  3.19    3.40               8.0        115      5500       18   \n",
       "\n",
       "  highway-mpg  price  \n",
       "0          27  13495  \n",
       "1          27  16500  \n",
       "2          26  16500  \n",
       "3          30  13950  \n",
       "4          22  17450  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# To see what the data set looks like, we'll use the head() method.\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can see, several question marks appeared in the dataframe; those are missing values which may hinder our further analysis. \n",
    "<div>So, how do we identify all those missing values and deal with them?</div> \n",
    "\n",
    "\n",
    "<b>How to work with missing data?</b>\n",
    "\n",
    "Steps for working with missing data:\n",
    "<ol>\n",
    "    <li>dentify missing data</li>\n",
    "    <li>deal with missing data</li>\n",
    "    <li>correct data format</li>\n",
    "</ol>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 id=\"identify_handle_missing_values\">Identify and handle missing values</h2>\n",
    "\n",
    "\n",
    "<h3 id=\"identify_missing_values\">Identify missing values</h3>\n",
    "<h4>Convert \"?\" to NaN</h4>\n",
    "In the car dataset, missing data comes with the question mark \"?\".\n",
    "We replace \"?\" with NaN (Not a Number), which is Python's default missing value marker, for reasons of computational speed and convenience. Here we use the function: \n",
    " <pre>.replace(A, B, inplace = True) </pre>\n",
    "to replace A by B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# replace \"?\" to NaN\n",
    "#df.replace(\"?\", np.nan, inplace = True)\n",
    "#df.head(5)\n",
    "df.loc[0].get(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "dentify_missing_values\n",
    "\n",
    "<h4>Evaluating for Missing Data</h4>\n",
    "\n",
    "The missing values are converted to Python's default. We use Python's built-in functions to identify these missing values. There are two methods to detect missing data:\n",
    "<ol>\n",
    "    <li><b>.isnull()</b></li>\n",
    "    <li><b>.notnull()</b></li>\n",
    "</ol>\n",
    "The output is a boolean value indicating whether the value that is passed into the argument is in fact missing data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>make</th>\n",
       "      <th>fuel-type</th>\n",
       "      <th>aspiration</th>\n",
       "      <th>num-of-doors</th>\n",
       "      <th>body-style</th>\n",
       "      <th>drive-wheels</th>\n",
       "      <th>engine-location</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>...</th>\n",
       "      <th>engine-size</th>\n",
       "      <th>fuel-system</th>\n",
       "      <th>bore</th>\n",
       "      <th>stroke</th>\n",
       "      <th>compression-ratio</th>\n",
       "      <th>horsepower</th>\n",
       "      <th>peak-rpm</th>\n",
       "      <th>city-mpg</th>\n",
       "      <th>highway-mpg</th>\n",
       "      <th>price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   symboling  normalized-losses   make  fuel-type  aspiration  num-of-doors  \\\n",
       "0      False               True  False      False       False         False   \n",
       "1      False               True  False      False       False         False   \n",
       "2      False               True  False      False       False         False   \n",
       "3      False              False  False      False       False         False   \n",
       "4      False              False  False      False       False         False   \n",
       "\n",
       "   body-style  drive-wheels  engine-location  wheel-base  ...  engine-size  \\\n",
       "0       False         False            False       False  ...        False   \n",
       "1       False         False            False       False  ...        False   \n",
       "2       False         False            False       False  ...        False   \n",
       "3       False         False            False       False  ...        False   \n",
       "4       False         False            False       False  ...        False   \n",
       "\n",
       "   fuel-system   bore  stroke  compression-ratio  horsepower  peak-rpm  \\\n",
       "0        False  False   False              False       False     False   \n",
       "1        False  False   False              False       False     False   \n",
       "2        False  False   False              False       False     False   \n",
       "3        False  False   False              False       False     False   \n",
       "4        False  False   False              False       False     False   \n",
       "\n",
       "   city-mpg  highway-mpg  price  \n",
       "0     False        False  False  \n",
       "1     False        False  False  \n",
       "2     False        False  False  \n",
       "3     False        False  False  \n",
       "4     False        False  False  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "missing_data = df.isnull()\n",
    "missing_data.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\"True\" stands for missing value, while \"False\" stands for not missing value."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Count missing values in each column</h4>\n",
    "<p>\n",
    "Using a for loop in Python, we can quickly figure out the number of missing values in each column. As mentioned above, \"True\" represents a missing value, \"False\"  means the value is present in the dataset.  In the body of the for loop the method  \".value_counts()\"  counts the number of \"True\" values. \n",
    "</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "symboling\n",
      "False    205\n",
      "Name: symboling, dtype: int64\n",
      "----\n",
      "normalized-losses\n",
      "False    164\n",
      "True      41\n",
      "Name: normalized-losses, dtype: int64\n",
      "----\n",
      "make\n",
      "False    205\n",
      "Name: make, dtype: int64\n",
      "----\n",
      "fuel-type\n",
      "False    205\n",
      "Name: fuel-type, dtype: int64\n",
      "----\n",
      "aspiration\n",
      "False    205\n",
      "Name: aspiration, dtype: int64\n",
      "----\n",
      "num-of-doors\n",
      "False    203\n",
      "True       2\n",
      "Name: num-of-doors, dtype: int64\n",
      "----\n",
      "body-style\n",
      "False    205\n",
      "Name: body-style, dtype: int64\n",
      "----\n",
      "drive-wheels\n",
      "False    205\n",
      "Name: drive-wheels, dtype: int64\n",
      "----\n",
      "engine-location\n",
      "False    205\n",
      "Name: engine-location, dtype: int64\n",
      "----\n",
      "wheel-base\n",
      "False    205\n",
      "Name: wheel-base, dtype: int64\n",
      "----\n",
      "length\n",
      "False    205\n",
      "Name: length, dtype: int64\n",
      "----\n",
      "width\n",
      "False    205\n",
      "Name: width, dtype: int64\n",
      "----\n",
      "height\n",
      "False    205\n",
      "Name: height, dtype: int64\n",
      "----\n",
      "curb-weight\n",
      "False    205\n",
      "Name: curb-weight, dtype: int64\n",
      "----\n",
      "engine-type\n",
      "False    205\n",
      "Name: engine-type, dtype: int64\n",
      "----\n",
      "num-of-cylinders\n",
      "False    205\n",
      "Name: num-of-cylinders, dtype: int64\n",
      "----\n",
      "engine-size\n",
      "False    205\n",
      "Name: engine-size, dtype: int64\n",
      "----\n",
      "fuel-system\n",
      "False    205\n",
      "Name: fuel-system, dtype: int64\n",
      "----\n",
      "bore\n",
      "False    201\n",
      "True       4\n",
      "Name: bore, dtype: int64\n",
      "----\n",
      "stroke\n",
      "False    201\n",
      "True       4\n",
      "Name: stroke, dtype: int64\n",
      "----\n",
      "compression-ratio\n",
      "False    205\n",
      "Name: compression-ratio, dtype: int64\n",
      "----\n",
      "horsepower\n",
      "False    203\n",
      "True       2\n",
      "Name: horsepower, dtype: int64\n",
      "----\n",
      "peak-rpm\n",
      "False    203\n",
      "True       2\n",
      "Name: peak-rpm, dtype: int64\n",
      "----\n",
      "city-mpg\n",
      "False    205\n",
      "Name: city-mpg, dtype: int64\n",
      "----\n",
      "highway-mpg\n",
      "False    205\n",
      "Name: highway-mpg, dtype: int64\n",
      "----\n",
      "price\n",
      "False    201\n",
      "True       4\n",
      "Name: price, dtype: int64\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "for column in missing_data.columns.values.tolist():\n",
    "    print(column)\n",
    "    print (missing_data[column].value_counts())\n",
    "    print(\"----\")    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Based on the summary above, each column has 205 rows of data, seven columns containing missing data:\n",
    "<ol>\n",
    "    <li>\"normalized-losses\": 41 missing data</li>\n",
    "    <li>\"num-of-doors\": 2 missing data</li>\n",
    "    <li>\"bore\": 4 missing data</li>\n",
    "    <li>\"stroke\" : 4 missing data</li>\n",
    "    <li>\"horsepower\": 2 missing data</li>\n",
    "    <li>\"peak-rpm\": 2 missing data</li>\n",
    "    <li>\"price\": 4 missing data</li>\n",
    "</ol>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3 id=\"deal_missing_values\">Deal with missing data</h3>\n",
    "<b>How to deal with missing data?</b>\n",
    "\n",
    "<ol>\n",
    "    <li>drop data<br>\n",
    "        a. drop the whole row<br>\n",
    "        b. drop the whole column\n",
    "    </li>\n",
    "    <li>replace data<br>\n",
    "        a. replace it by mean<br>\n",
    "        b. replace it by frequency<br>\n",
    "        c. replace it based on other functions\n",
    "    </li>\n",
    "</ol>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Whole columns should be dropped only if most entries in the column are empty. In our dataset, none of the columns are empty enough to drop entirely.\n",
    "We have some freedom in choosing which method to replace data; however, some methods may seem more reasonable than others. We will apply each method to many different columns:\n",
    "\n",
    "<b>Replace by mean:</b>\n",
    "<ul>\n",
    "    <li>\"normalized-losses\": 41 missing data, replace them with mean</li>\n",
    "    <li>\"stroke\": 4 missing data, replace them with mean</li>\n",
    "    <li>\"bore\": 4 missing data, replace them with mean</li>\n",
    "    <li>\"horsepower\": 2 missing data, replace them with mean</li>\n",
    "    <li>\"peak-rpm\": 2 missing data, replace them with mean</li>\n",
    "</ul>\n",
    "\n",
    "<b>Replace by frequency:</b>\n",
    "<ul>\n",
    "    <li>\"num-of-doors\": 2 missing data, replace them with \"four\". \n",
    "        <ul>\n",
    "            <li>Reason: 84% sedans is four doors. Since four doors is most frequent, it is most likely to occur</li>\n",
    "        </ul>\n",
    "    </li>\n",
    "</ul>\n",
    "\n",
    "<b>Drop the whole row:</b>\n",
    "<ul>\n",
    "    <li>\"price\": 4 missing data, simply delete the whole row\n",
    "        <ul>\n",
    "            <li>Reason: price is what we want to predict. Any data entry without price data cannot be used for prediction; therefore any row now without price data is not useful to us</li>\n",
    "        </ul>\n",
    "    </li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Calculate the average of the column </h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average of normalized-losses: 122.0\n"
     ]
    }
   ],
   "source": [
    "avg_norm_loss = df[\"normalized-losses\"].astype(\"float\").mean()\n",
    "print(\"Average of normalized-losses:\", avg_norm_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Replace \"NaN\" by mean value in \"normalized-losses\" column</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[\"normalized-losses\"].replace(np.nan, avg_norm_loss, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Calculate the mean value for 'bore' column</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average of bore: 3.3297512437810943\n"
     ]
    }
   ],
   "source": [
    "avg_bore=df['bore'].astype('float').mean(axis=0)\n",
    "print(\"Average of bore:\", avg_bore)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Replace NaN by mean value</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[\"bore\"].replace(np.nan, avg_bore, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-danger alertdanger\" style=\"margin-top: 20px\">\n",
    "<h1> Question  #1: </h1>\n",
    "\n",
    "<b>According to the example above, replace NaN in \"stroke\" column by mean.</b>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# Write your code below and press Shift+Enter to execute \n",
    "df[\"stroke\"].astype(\"float\").mean()\n",
    "df[\"stroke\"].replace(np.NaN,df[\"stroke\"].astype(\"float\").mean(),inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Double-click <b>here</b> for the solution.\n",
    "\n",
    "<!-- The answer is below:\n",
    "\n",
    "# calculate the mean vaule for \"stroke\" column\n",
    "avg_stroke = df[\"stroke\"].astype(\"float\").mean(axis = 0)\n",
    "print(\"Average of stroke:\", avg_stroke)\n",
    "\n",
    "# replace NaN by mean value in \"stroke\" column\n",
    "df[\"stroke\"].replace(np.nan, avg_stroke, inplace = True)\n",
    "\n",
    "-->\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Calculate the mean value for the  'horsepower' column:</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average horsepower: 104.25615763546797\n"
     ]
    }
   ],
   "source": [
    "avg_horsepower = df['horsepower'].astype('float').mean(axis=0)\n",
    "print(\"Average horsepower:\", avg_horsepower)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Replace \"NaN\" by mean value:</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['horsepower'].replace(np.nan, avg_horsepower, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Calculate the mean value for 'peak-rpm' column:</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average peak rpm: 5125.369458128079\n"
     ]
    }
   ],
   "source": [
    "avg_peakrpm=df['peak-rpm'].astype('float').mean(axis=0)\n",
    "print(\"Average peak rpm:\", avg_peakrpm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Replace NaN by mean value:</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['peak-rpm'].replace(np.nan, avg_peakrpm, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To see which values are present in a particular column, we can use the \".value_counts()\" method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "four    114\n",
       "two      89\n",
       "Name: num-of-doors, dtype: int64"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['num-of-doors'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that four doors are the most common type. We can also use the \".idxmax()\" method to calculate for us the most common type automatically:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'four'"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['num-of-doors'].value_counts().idxmax()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The replacement procedure is very similar to what we have seen previously"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "#replace the missing 'num-of-doors' values by the most frequent \n",
    "df[\"num-of-doors\"].replace(np.nan, \"four\", inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let's drop all rows that do not have price data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# simply drop whole row with NaN in \"price\" column\n",
    "df.dropna(subset=[\"price\"], axis=0, inplace=True)\n",
    "\n",
    "# reset index, because we droped two rows\n",
    "df.reset_index(drop=True, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>make</th>\n",
       "      <th>fuel-type</th>\n",
       "      <th>aspiration</th>\n",
       "      <th>num-of-doors</th>\n",
       "      <th>body-style</th>\n",
       "      <th>drive-wheels</th>\n",
       "      <th>engine-location</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>...</th>\n",
       "      <th>engine-size</th>\n",
       "      <th>fuel-system</th>\n",
       "      <th>bore</th>\n",
       "      <th>stroke</th>\n",
       "      <th>compression-ratio</th>\n",
       "      <th>horsepower</th>\n",
       "      <th>peak-rpm</th>\n",
       "      <th>city-mpg</th>\n",
       "      <th>highway-mpg</th>\n",
       "      <th>price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>130</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>13495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>130</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>16500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>hatchback</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>94.5</td>\n",
       "      <td>...</td>\n",
       "      <td>152</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>2.68</td>\n",
       "      <td>3.47</td>\n",
       "      <td>9.0</td>\n",
       "      <td>154</td>\n",
       "      <td>5000</td>\n",
       "      <td>19</td>\n",
       "      <td>26</td>\n",
       "      <td>16500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>fwd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.8</td>\n",
       "      <td>...</td>\n",
       "      <td>109</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>10.0</td>\n",
       "      <td>102</td>\n",
       "      <td>5500</td>\n",
       "      <td>24</td>\n",
       "      <td>30</td>\n",
       "      <td>13950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>4wd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.4</td>\n",
       "      <td>...</td>\n",
       "      <td>136</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>8.0</td>\n",
       "      <td>115</td>\n",
       "      <td>5500</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "      <td>17450</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   symboling normalized-losses         make fuel-type aspiration num-of-doors  \\\n",
       "0          3               122  alfa-romero       gas        std          two   \n",
       "1          3               122  alfa-romero       gas        std          two   \n",
       "2          1               122  alfa-romero       gas        std          two   \n",
       "3          2               164         audi       gas        std         four   \n",
       "4          2               164         audi       gas        std         four   \n",
       "\n",
       "    body-style drive-wheels engine-location  wheel-base  ...  engine-size  \\\n",
       "0  convertible          rwd           front        88.6  ...          130   \n",
       "1  convertible          rwd           front        88.6  ...          130   \n",
       "2    hatchback          rwd           front        94.5  ...          152   \n",
       "3        sedan          fwd           front        99.8  ...          109   \n",
       "4        sedan          4wd           front        99.4  ...          136   \n",
       "\n",
       "   fuel-system  bore  stroke compression-ratio horsepower  peak-rpm city-mpg  \\\n",
       "0         mpfi  3.47    2.68               9.0        111      5000       21   \n",
       "1         mpfi  3.47    2.68               9.0        111      5000       21   \n",
       "2         mpfi  2.68    3.47               9.0        154      5000       19   \n",
       "3         mpfi  3.19    3.40              10.0        102      5500       24   \n",
       "4         mpfi  3.19    3.40               8.0        115      5500       18   \n",
       "\n",
       "  highway-mpg  price  \n",
       "0          27  13495  \n",
       "1          27  16500  \n",
       "2          26  16500  \n",
       "3          30  13950  \n",
       "4          22  17450  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Good!</b> Now, we obtain the dataset with no missing values."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3 id=\"correct_data_format\">Correct data format</h3>\n",
    "<b>We are almost there!</b>\n",
    "<p>The last step in data cleaning is checking and making sure that all data is in the correct format (int, float, text or other).</p>\n",
    "\n",
    "In Pandas, we use \n",
    "<p><b>.dtype()</b> to check the data type</p>\n",
    "<p><b>.astype()</b> to change the data type</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Lets list the data types for each column</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "symboling              int64\n",
       "normalized-losses     object\n",
       "make                  object\n",
       "fuel-type             object\n",
       "aspiration            object\n",
       "num-of-doors          object\n",
       "body-style            object\n",
       "drive-wheels          object\n",
       "engine-location       object\n",
       "wheel-base           float64\n",
       "length               float64\n",
       "width                float64\n",
       "height               float64\n",
       "curb-weight            int64\n",
       "engine-type           object\n",
       "num-of-cylinders      object\n",
       "engine-size            int64\n",
       "fuel-system           object\n",
       "bore                  object\n",
       "stroke                object\n",
       "compression-ratio    float64\n",
       "horsepower            object\n",
       "peak-rpm              object\n",
       "city-mpg               int64\n",
       "highway-mpg            int64\n",
       "price                 object\n",
       "dtype: object"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p>As we can see above, some columns are not of the correct data type. Numerical variables should have type 'float' or 'int', and variables with strings such as categories should have type 'object'. For example, 'bore' and 'stroke' variables are numerical values that describe the engines, so we should expect them to be of the type 'float' or 'int'; however, they are shown as type 'object'. We have to convert data types into a proper format for each column using the \"astype()\" method.</p> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Convert data types to proper format</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df[[\"bore\", \"stroke\"]] = df[[\"bore\", \"stroke\"]].astype(\"float\")\n",
    "df[[\"normalized-losses\"]] = df[[\"normalized-losses\"]].astype(\"int\")\n",
    "df[[\"price\"]] = df[[\"price\"]].astype(\"float\")\n",
    "df[[\"peak-rpm\"]] = df[[\"peak-rpm\"]].astype(\"float\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h4>Let us list the columns after the conversion</h4>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "symboling              int64\n",
       "normalized-losses      int64\n",
       "make                  object\n",
       "fuel-type             object\n",
       "aspiration            object\n",
       "num-of-doors          object\n",
       "body-style            object\n",
       "drive-wheels          object\n",
       "engine-location       object\n",
       "wheel-base           float64\n",
       "length               float64\n",
       "width                float64\n",
       "height               float64\n",
       "curb-weight            int64\n",
       "engine-type           object\n",
       "num-of-cylinders      object\n",
       "engine-size            int64\n",
       "fuel-system           object\n",
       "bore                 float64\n",
       "stroke               float64\n",
       "compression-ratio    float64\n",
       "horsepower            object\n",
       "peak-rpm             float64\n",
       "city-mpg               int64\n",
       "highway-mpg            int64\n",
       "price                float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Wonderful!</b>\n",
    "\n",
    "Now, we finally obtain the cleaned dataset with no missing values and all data in its proper format."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 id=\"data_standardization\">Data Standardization</h2>\n",
    "<p>\n",
    "Data is usually collected from different agencies with different formats.\n",
    "(Data Standardization is also a term for a particular type of data normalization, where we subtract the mean and divide by the standard deviation)\n",
    "</p>\n",
    "    \n",
    "<b>What is Standardization?</b>\n",
    "<p>Standardization is the process of transforming data into a common format which allows the researcher to make the meaningful comparison.\n",
    "</p>\n",
    "\n",
    "<b>Example</b>\n",
    "<p>Transform mpg to L/100km:</p>\n",
    "<p>In our dataset, the fuel consumption columns \"city-mpg\" and \"highway-mpg\" are represented by mpg (miles per gallon) unit. Assume we are developing an application in a country that accept the fuel consumption with L/100km standard</p>\n",
    "<p>We will need to apply <b>data transformation</b> to transform mpg into L/100km?</p>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p>The formula for unit conversion is<p>\n",
    "L/100km = 235 / mpg\n",
    "<p>We can do many mathematical operations directly in Pandas.</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>make</th>\n",
       "      <th>fuel-type</th>\n",
       "      <th>aspiration</th>\n",
       "      <th>num-of-doors</th>\n",
       "      <th>body-style</th>\n",
       "      <th>drive-wheels</th>\n",
       "      <th>engine-location</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>...</th>\n",
       "      <th>fuel-system</th>\n",
       "      <th>bore</th>\n",
       "      <th>stroke</th>\n",
       "      <th>compression-ratio</th>\n",
       "      <th>horsepower</th>\n",
       "      <th>peak-rpm</th>\n",
       "      <th>city-mpg</th>\n",
       "      <th>highway-mpg</th>\n",
       "      <th>price</th>\n",
       "      <th>city-L/100km</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>13495.0</td>\n",
       "      <td>11.190476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>convertible</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>88.6</td>\n",
       "      <td>...</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.47</td>\n",
       "      <td>2.68</td>\n",
       "      <td>9.0</td>\n",
       "      <td>111</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>21</td>\n",
       "      <td>27</td>\n",
       "      <td>16500.0</td>\n",
       "      <td>11.190476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>122</td>\n",
       "      <td>alfa-romero</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>two</td>\n",
       "      <td>hatchback</td>\n",
       "      <td>rwd</td>\n",
       "      <td>front</td>\n",
       "      <td>94.5</td>\n",
       "      <td>...</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>2.68</td>\n",
       "      <td>3.47</td>\n",
       "      <td>9.0</td>\n",
       "      <td>154</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>19</td>\n",
       "      <td>26</td>\n",
       "      <td>16500.0</td>\n",
       "      <td>12.368421</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>fwd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.8</td>\n",
       "      <td>...</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>10.0</td>\n",
       "      <td>102</td>\n",
       "      <td>5500.0</td>\n",
       "      <td>24</td>\n",
       "      <td>30</td>\n",
       "      <td>13950.0</td>\n",
       "      <td>9.791667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>164</td>\n",
       "      <td>audi</td>\n",
       "      <td>gas</td>\n",
       "      <td>std</td>\n",
       "      <td>four</td>\n",
       "      <td>sedan</td>\n",
       "      <td>4wd</td>\n",
       "      <td>front</td>\n",
       "      <td>99.4</td>\n",
       "      <td>...</td>\n",
       "      <td>mpfi</td>\n",
       "      <td>3.19</td>\n",
       "      <td>3.40</td>\n",
       "      <td>8.0</td>\n",
       "      <td>115</td>\n",
       "      <td>5500.0</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "      <td>17450.0</td>\n",
       "      <td>13.055556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 27 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   symboling  normalized-losses         make fuel-type aspiration  \\\n",
       "0          3                122  alfa-romero       gas        std   \n",
       "1          3                122  alfa-romero       gas        std   \n",
       "2          1                122  alfa-romero       gas        std   \n",
       "3          2                164         audi       gas        std   \n",
       "4          2                164         audi       gas        std   \n",
       "\n",
       "  num-of-doors   body-style drive-wheels engine-location  wheel-base  ...  \\\n",
       "0          two  convertible          rwd           front        88.6  ...   \n",
       "1          two  convertible          rwd           front        88.6  ...   \n",
       "2          two    hatchback          rwd           front        94.5  ...   \n",
       "3         four        sedan          fwd           front        99.8  ...   \n",
       "4         four        sedan          4wd           front        99.4  ...   \n",
       "\n",
       "   fuel-system  bore  stroke  compression-ratio horsepower peak-rpm  city-mpg  \\\n",
       "0         mpfi  3.47    2.68                9.0        111   5000.0        21   \n",
       "1         mpfi  3.47    2.68                9.0        111   5000.0        21   \n",
       "2         mpfi  2.68    3.47                9.0        154   5000.0        19   \n",
       "3         mpfi  3.19    3.40               10.0        102   5500.0        24   \n",
       "4         mpfi  3.19    3.40                8.0        115   5500.0        18   \n",
       "\n",
       "  highway-mpg    price  city-L/100km  \n",
       "0          27  13495.0     11.190476  \n",
       "1          27  16500.0     11.190476  \n",
       "2          26  16500.0     12.368421  \n",
       "3          30  13950.0      9.791667  \n",
       "4          22  17450.0     13.055556  \n",
       "\n",
       "[5 rows x 27 columns]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Convert mpg to L/100km by mathematical operation (235 divided by mpg)\n",
    "df['city-L/100km'] = 235/df[\"city-mpg\"]\n",
    "\n",
    "# check your transformed data \n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-danger alertdanger\" style=\"margin-top: 20px\">\n",
    "<h1> Question  #2: </h1>\n",
    "\n",
    "<b>According to the example above, transform mpg to L/100km in the column of \"highway-mpg\", and change the name of column to \"highway-L/100km\".</b>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>highway-L/100km</th>\n",
       "      <th>highway-mpg</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.703704</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.703704</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9.038462</td>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7.833333</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10.681818</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>8.392857</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197</th>\n",
       "      <td>9.400000</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>198</th>\n",
       "      <td>10.217391</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>199</th>\n",
       "      <td>8.703704</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200</th>\n",
       "      <td>9.400000</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>201 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     highway-L/100km  highway-mpg\n",
       "0           8.703704           27\n",
       "1           8.703704           27\n",
       "2           9.038462           26\n",
       "3           7.833333           30\n",
       "4          10.681818           22\n",
       "..               ...          ...\n",
       "196         8.392857           28\n",
       "197         9.400000           25\n",
       "198        10.217391           23\n",
       "199         8.703704           27\n",
       "200         9.400000           25\n",
       "\n",
       "[201 rows x 2 columns]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Write your code below and press Shift+Enter to execute \n",
    "df[\"highway-L/100km\"]=235/df[\"highway-mpg\"]\n",
    "df[[\"highway-L/100km\",\"highway-mpg\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Double-click <b>here</b> for the solution.\n",
    "\n",
    "<!-- The answer is below:\n",
    "\n",
    "# transform mpg to L/100km by mathematical operation (235 divided by mpg)\n",
    "df[\"highway-mpg\"] = 235/df[\"highway-mpg\"]\n",
    "\n",
    "# rename column name from \"highway-mpg\" to \"highway-L/100km\"\n",
    "df.rename(columns={'\"highway-mpg\"':'highway-L/100km'}, inplace=True)\n",
    "\n",
    "# check your transformed data \n",
    "df.head()\n",
    "\n",
    "-->\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 id=\"data_normalization\">Data Normalization</h2>\n",
    "\n",
    "<b>Why normalization?</b>\n",
    "<p>Normalization is the process of transforming values of several variables into a similar range. Typical normalizations include scaling the variable so the variable average is 0, scaling the variable so the variance is 1, or scaling variable so the variable values range from 0 to 1\n",
    "</p>\n",
    "\n",
    "<b>Example</b>\n",
    "<p>To demonstrate normalization, let's say we want to scale the columns \"length\", \"width\" and \"height\" </p>\n",
    "<p><b>Target:</b>would like to Normalize those variables so their value ranges from 0 to 1.</p>\n",
    "<p><b>Approach:</b> replace original value by (original value)/(maximum value)</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# replace (original value) by (original value)/(maximum value)\n",
    "df['length'] = df['length']/df['length'].max()\n",
    "df['width'] = df['width']/df['width'].max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-danger alertdanger\" style=\"margin-top: 20px\">\n",
    "<h1> Questiont #3: </h1>\n",
    "\n",
    "<b>According to the example above, normalize the column \"height\".</b>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>length</th>\n",
       "      <th>width</th>\n",
       "      <th>height</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.811148</td>\n",
       "      <td>0.890278</td>\n",
       "      <td>0.816054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.811148</td>\n",
       "      <td>0.890278</td>\n",
       "      <td>0.816054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.822681</td>\n",
       "      <td>0.909722</td>\n",
       "      <td>0.876254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.848630</td>\n",
       "      <td>0.919444</td>\n",
       "      <td>0.908027</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.848630</td>\n",
       "      <td>0.922222</td>\n",
       "      <td>0.908027</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     length     width    height\n",
       "0  0.811148  0.890278  0.816054\n",
       "1  0.811148  0.890278  0.816054\n",
       "2  0.822681  0.909722  0.876254\n",
       "3  0.848630  0.919444  0.908027\n",
       "4  0.848630  0.922222  0.908027"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Write your code below and press Shift+Enter to execute \n",
    "df['height'] = df['height']/df['height'].max()\n",
    "df[[\"length\",\"width\",\"height\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Double-click <b>here</b> for the solution.\n",
    "\n",
    "<!-- The answer is below:\n",
    "\n",
    "df['height'] = df['height']/df['height'].max() \n",
    "# show the scaled columns\n",
    "df[[\"length\",\"width\",\"height\"]].head()\n",
    "\n",
    "-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we can see, we've normalized \"length\", \"width\" and \"height\" in the range of [0,1]."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 id=\"binning\">Binning</h2>\n",
    "<b>Why binning?</b>\n",
    "<p>\n",
    "    Binning is a process of transforming continuous numerical variables into discrete categorical 'bins', for grouped analysis.\n",
    "</p>\n",
    "\n",
    "<b>Example: </b>\n",
    "<p>In our dataset, \"horsepower\" is a real valued variable ranging from 48 to 288, it has 57 unique values. What if we only care about the price difference between cars with high horsepower, medium horsepower, and little horsepower (3 types)? Can we rearrange them into three ‘bins' to simplify analysis? </p>\n",
    "\n",
    "<p>We will use the Pandas method 'cut' to segment the 'horsepower' column into 3 bins </p>\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Example of Binning Data In Pandas</h3>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " Convert data to correct format "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df[\"horsepower\"]=df[\"horsepower\"].astype(int, copy=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets plot the histogram of horspower, to see what the distribution of horsepower looks like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'horsepower bins')"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAYdklEQVR4nO3dfbRddX3n8feHoPgA8tBcEAkYZKLT4DiIKUodlUoVfBjD2KphFSeD2GgXos6IGupU7Ezp4EO11tG6YkFipWB8QDLLGYVGSbQVMCjyKJJCgEAklweFWhsBv/PH3tkc4r3JJeScc5Pzfq111tn7t/c++3t/OTmfs/c5+3dSVUiSBLDLsAuQJE0fhoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoaFpKsjbJ7w67jukuyVFJ1m1h+aeT/Mkga9KObddhFyCpf6rqrcOuQTsWjxS0U0uy07zx2Zn+Fk1fhoKms8OSXJXkZ0m+kOQJmxYk+cMka5Lck2R5kqf1LKskJye5EbgxjY8l2dA+1lVJnt2uu1uSjyS5Ncmd7emWJ7bLjkqyLskfJ7mrPaX1Bz372TPJ55KMJ7klyX9Psku77JYkz2unT2hrmtvOvznJV9vpXZIsTvJPSe5OsizJPu2y2e12JyW5FfjmZB21hRrPSfJnm/0972r7Yn2SE3vWfWWS65Lcn+T2JKc+ln887ZgMBU1nrweOBQ4GngP8F4AkLwX+V7t8f+AW4PzNtj0OeD4wF3g58GLgmcBewBuAu9v1Pti2Hwb8G+AA4P09j/NUYGbbvhBYkuRZ7bJPAHsCzwBeAvxnYNOL7ErgqHb6xcBN7Tqb5le2029va30J8DTgXuCTm/0tLwF+Ezhmgj7aWo0Trbtnu+5JwCeT7N0uOwt4S1XtATybLYSQdmJV5c3btLsBa4ETeuY/BHy6nT4L+FDPst2BB4DZ7XwBL+1Z/lLgx8ALgF162gP8HDikp+1I4OZ2+ijgQeDJPcuXAX8CzAA2AnN7lr0FuKSdPglY3k5fD7wZOL+dvwU4vGfZ0T2PsX/7t+wKzG7/lmdsoZ8mrbGdPgf4s551fwHs2rPuBuAF7fSt7d/wlGH/+3sb3s0jBU1nP+mZ/heaF39o3lHfsmlBVf0zzTv/A3rWv61n+TeB/03zDvzOJEuSPAUYA54EXJHkp0l+Cny9bd/k3qr6ec/8Le3+ZwKP762jnd5Uw0rgRUmeShMgXwBemGQ2zTv1K9v1ng5c0LP/64GHgP0m+lsmMVmNE7m7qh7sme/t198DXgnckmRlkiO3sl/thAwF7YjuoHkxBSDJk4HfAG7vWecRw/9W1V9V1fOAQ2lOF70buIvmnfOhVbVXe9uzqnbv2XTv9vE3Oajd/1007+ifvtmy29v9raF5wX07sKqq7qcJuUXAd6rqV+02twGv6Nn/XlX1hKqa9G+ZwGQ1PipV9b2qmg/sC3yV5ohDI8ZQ0I7o74ATkxyWZDfgz4HLqmrtRCsn+a0kz0/yOJrTRf8KPNS+MH8G+FiSfdt1D0iy+bn7P03y+CQvAl4NfLGqHqJ50TwjyR5Jng78N+DzPdutBN7Gw58fXLLZPMCn28d4erv/sSTzt6FPfq3GR7Nxu+0fJNmzqh4A7qM5YtGIMRS0w6mqFTTn9b8MrAcOARZsYZOn0Lz430tzauVu4CPtsvcCa4BLk9wH/D3Q+yHtT9rt7gDOBd5aVT9ql51CEzI3Ad+hCauze7ZdCewBrJpkHuDjwHLgoiT3A5fSfED+aGypxkfjjcDath/eCpywDY+hHVyq/JEdaSJJjgI+X1Wzhl2LNCgeKUiSOoaCJKnTt1BIcnZ71eQ1m7WfkuSGJNcm+VBP+2ntFao3TPBBnzRwVXWJp440avo5lso5NN8N/9ymhiS/A8wHnlNVG3u+8TGX5oPCQ2m+X/33SZ7ZfsNDkjQgfQuFqlrVXqjT64+AM6tqY7vOhrZ9Ps3VnhuBm5OsAY4AvrulfcycObNmz958F5KkLbniiivuqqqxiZYNetTFZ9Jc5XkGzXfFT62q79FcBXppz3rreOTVqZ0ki2guAOKggw5i9erV/a1YknYySW6ZbNmgP2jeFdibZgyadwPLkoRmDJrNTfhd2apaUlXzqmre2NiEQSdJ2kaDDoV1wFeqcTnwK5oxZNYBB/asN4ttuExfkvTYDDoUvkozYiVJnkkzoNhdNFd0LmjHtj8YmANcPuDaJGnk9e0zhSTn0QzVOzPNb8ieTjMEwNnt11R/CSys5pLqa5MsA66jGQb4ZL95JEmDt0MPczFv3rzyg2ZJenSSXFFV8yZa5hXNkqSOoSBJ6hgKkqSOoSBJ6gz6iuZpZfbirw27BG1m7ZmvGnYJ0kjzSEGS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1OlbKCQ5O8mG9veYN192apJKMrOn7bQka5LckOSYftUlSZpcP48UzgGO3bwxyYHAy4Bbe9rmAguAQ9ttPpVkRh9rkyRNoG+hUFWrgHsmWPQx4D1A9bTNB86vqo1VdTOwBjiiX7VJkiY20M8UkrwGuL2qfrjZogOA23rm17VtEz3GoiSrk6weHx/vU6WSNJoGFgpJngS8D3j/RIsnaKsJ2qiqJVU1r6rmjY2Nbc8SJWnkDfLnOA8BDgZ+mARgFvD9JEfQHBkc2LPuLOCOAdYmSWKARwpVdXVV7VtVs6tqNk0QHF5VPwGWAwuS7JbkYGAOcPmgapMkNfr5ldTzgO8Cz0qyLslJk61bVdcCy4DrgK8DJ1fVQ/2qTZI0sb6dPqqq47eyfPZm82cAZ/SrHknS1nlFsySpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjr9/I3ms5NsSHJNT9uHk/woyVVJLkiyV8+y05KsSXJDkmP6VZckaXL9PFI4Bzh2s7aLgWdX1XOAHwOnASSZCywADm23+VSSGX2sTZI0gb6FQlWtAu7ZrO2iqnqwnb0UmNVOzwfOr6qNVXUzsAY4ol+1SZImNszPFN4E/L92+gDgtp5l69q2X5NkUZLVSVaPj4/3uURJGi1DCYUk7wMeBM7d1DTBajXRtlW1pKrmVdW8sbGxfpUoSSNp10HvMMlC4NXA0VW16YV/HXBgz2qzgDsGXZskjbqBHikkORZ4L/CaqvqXnkXLgQVJdktyMDAHuHyQtUmS+nikkOQ84ChgZpJ1wOk03zbaDbg4CcClVfXWqro2yTLgOprTSidX1UP9qk2SNLG+hUJVHT9B81lbWP8M4Ix+1SNJ2jqvaJYkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVKnb6GQ5OwkG5Jc09O2T5KLk9zY3u/ds+y0JGuS3JDkmH7VJUmaXD+PFM4Bjt2sbTGwoqrmACvaeZLMBRYAh7bbfCrJjD7WJkmaQN9CoapWAfds1jwfWNpOLwWO62k/v6o2VtXNwBrgiH7VJkma2KA/U9ivqtYDtPf7tu0HALf1rLeubfs1SRYlWZ1k9fj4eF+LlaRRM10+aM4EbTXRilW1pKrmVdW8sbGxPpclSaNl0KFwZ5L9Adr7DW37OuDAnvVmAXcMuDZJGnmDDoXlwMJ2eiFwYU/7giS7JTkYmANcPuDaJGnk7dqvB05yHnAUMDPJOuB04ExgWZKTgFuB1wFU1bVJlgHXAQ8CJ1fVQ/2qTZI0sb6FQlUdP8mioydZ/wzgjH7VI0nauunyQbMkaRowFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJnSmFQpIVU2mTJO3Ytjj2UZInAE+iGdRubx7+3YOnAE/rc22SpAHb2oB4bwHeSRMAV/BwKNwHfLKPdUmShmCLoVBVHwc+nuSUqvrEgGqSJA3JlIbOrqpPJPltYHbvNlX1uT7VJUkagimFQpK/BQ4BrgQ2/fhNAYaCJO1EpvojO/OAuVVV/SxGkjRcU71O4Rrgqf0sRJI0fFM9UpgJXJfkcmDjpsaqes227DTJfwXeTHMK6mrgRJqvvn6B5nOLtcDrq+rebXl8SdK2mWoofGB77TDJAcDbaU5H/SLJMmABMBdYUVVnJlkMLAbeu732K0nauql++2hlH/b7xCQP0Bwh3AGcBhzVLl8KXIKhIEkDNdVhLu5Pcl97+9ckDyW5b1t2WFW3Ax8BbgXWAz+rqouA/apqfbvOemDfbXl8SdK2m+qRwh6980mOA47Ylh22w2XMBw4Gfgp8MckJj2L7RcAigIMOOmhbSpAkTWKbRkmtqq8CL93Gff4ucHNVjVfVA8BXgN8G7kyyP0B7v2GSfS+pqnlVNW9sbGwbS5AkTWSqF6+9tmd2F5rrFrb1moVbgRckeRLwC+BoYDXwc2AhcGZ7f+E2Pr4kaRtN9dtH/7Fn+kGar4zO35YdVtVlSb4EfL99rB8AS4DdgWVJTqIJjtdty+NLkrbdVD9TOHF77rSqTgdO36x5I81RgyRpSKb67aNZSS5IsiHJnUm+nGRWv4uTJA3WVD9o/iywnOZ3FQ4A/k/bJknaiUw1FMaq6rNV9WB7Owfwqz+StJOZaijcleSEJDPa2wnA3f0sTJI0eFMNhTcBrwd+QnMV8u/TDGInSdqJTPUrqf8TWLhp1NIk+9AMVfGmfhUmSRq8qR4pPKd3GOuqugd4bn9KkiQNy1RDYZd2zCKgO1KY6lGGJGkHMdUX9r8A/rG9ErloPl84o29VSZKGYqpXNH8uyWqaQfACvLaqrutrZZKkgZvyKaA2BAwCSdqJbdPQ2ZKknZOhIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpM5QQiHJXkm+lORHSa5PcmSSfZJcnOTG9n7vrT+SJGl7GtaRwseBr1fVvwX+PXA9sBhYUVVzgBXtvCRpgAYeCkmeArwYOAugqn5ZVT8F5gNL29WWAscNujZJGnXDOFJ4BjAOfDbJD5L8TZInA/tV1XqA9n7fIdQmSSNtGKGwK3A48NdV9Vzg5zyKU0VJFiVZnWT1+Ph4v2qUpJE0jFBYB6yrqsva+S/RhMSdSfYHaO83TLRxVS2pqnlVNW9sbGwgBUvSqBh4KFTVT4DbkjyrbTqaZvTV5cDCtm0hcOGga5OkUTesX087BTg3yeOBm4ATaQJqWZKTgFuB1w2pNkkaWUMJhaq6Epg3waKjB12LJOlhXtEsSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkzrB+o5kkM4DVwO1V9eok+wBfAGYDa4HXV9W9w6pPwzF78deGXYI2s/bMVw27BA3QMI8U3gFc3zO/GFhRVXOAFe28JGmAhhIKSWYBrwL+pqd5PrC0nV4KHDfouiRp1A3rSOEvgfcAv+pp26+q1gO09/sOozBJGmUDD4UkrwY2VNUV27j9oiSrk6weHx/fztVJ0mgbxpHCC4HXJFkLnA+8NMnngTuT7A/Q3m+YaOOqWlJV86pq3tjY2KBqlqSRMPBQqKrTqmpWVc0GFgDfrKoTgOXAwna1hcCFg65NkkbddLpO4UzgZUluBF7WzkuSBmho1ykAVNUlwCXt9N3A0cOsR5JG3XQ6UpAkDZmhIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpI6hIEnqGAqSpM7AQyHJgUm+leT6JNcmeUfbvk+Si5Pc2N7vPejaJGnUDeNI4UHgXVX1m8ALgJOTzAUWAyuqag6wop2XJA3QwEOhqtZX1ffb6fuB64EDgPnA0na1pcBxg65NkkbdUD9TSDIbeC5wGbBfVa2HJjiAfSfZZlGS1UlWj4+PD6pUSRoJQwuFJLsDXwbeWVX3TXW7qlpSVfOqat7Y2Fj/CpSkETSUUEjyOJpAOLeqvtI235lk/3b5/sCGYdQmSaNsGN8+CnAWcH1VfbRn0XJgYTu9ELhw0LVJ0qjbdQj7fCHwRuDqJFe2bX8MnAksS3IScCvwuiHUJkkjbeChUFXfATLJ4qMHWYsk6ZG8olmS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEmdYfyegqQdyOzFXxt2CZrA2jNf1ZfH9UhBktQxFCRJHUNBktSZdqGQ5NgkNyRZk2TxsOuRpFEyrUIhyQzgk8ArgLnA8UnmDrcqSRod0yoUgCOANVV1U1X9EjgfmD/kmiRpZEy3r6QeANzWM78OeH7vCkkWAYva2X9OcsN22O9M4K7t8Dg7K/tncvbN5OybyT3mvskHH9P+nz7ZgukWCpmgrR4xU7UEWLJdd5qsrqp52/Mxdyb2z+Tsm8nZN5Obzn0z3U4frQMO7JmfBdwxpFokaeRMt1D4HjAnycFJHg8sAJYPuSZJGhnT6vRRVT2Y5G3AN4AZwNlVde0Adr1dT0fthOyfydk3k7NvJjdt+yZVtfW1JEkjYbqdPpIkDZGhIEnqjGQoJFmb5OokVyZZ3bbtk+TiJDe293sPu85BSHJ2kg1Jrulpm7QvkpzWDkFyQ5JjhlP1YEzSNx9Icnv73LkyySt7lo1S3xyY5FtJrk9ybZJ3tO0j/9zZQt/sGM+dqhq5G7AWmLlZ24eAxe30YuCDw65zQH3xYuBw4Jqt9QXN0CM/BHYDDgb+CZgx7L9hwH3zAeDUCdYdtb7ZHzi8nd4D+HHbByP/3NlC3+wQz52RPFKYxHxgaTu9FDhuiLUMTFWtAu7ZrHmyvpgPnF9VG6vqZmANzdAkO6VJ+mYyo9Y366vq++30/cD1NCMSjPxzZwt9M5lp1TejGgoFXJTkinbYDID9qmo9NP+owL5Dq274JuuLiYYh2dKTfWf1tiRXtaeXNp0eGdm+STIbeC5wGT53HmGzvoEd4LkzqqHwwqo6nGY01pOTvHjYBe0gtjoMyQj4a+AQ4DBgPfAXbftI9k2S3YEvA++sqvu2tOoEbTt1/0zQNzvEc2ckQ6Gq7mjvNwAX0Byq3Zlkf4D2fsPwKhy6yfpi5Ichqao7q+qhqvoV8BkePswfub5J8jiaF71zq+orbbPPHSbumx3luTNyoZDkyUn22DQNvBy4hmY4jYXtaguBC4dT4bQwWV8sBxYk2S3JwcAc4PIh1Dc0m17wWv+J5rkDI9Y3SQKcBVxfVR/tWTTyz53J+maHee4M+5P6Qd+AZ9B80v9D4FrgfW37bwArgBvb+32GXeuA+uM8mkPZB2jesZy0pb4A3kfz7YgbgFcMu/4h9M3fAlcDV9H8Z95/RPvmP9Cc4rgKuLK9vdLnzhb7Zod47jjMhSSpM3KnjyRJkzMUJEkdQ0GS1DEUJEkdQ0GS1DEUNBKSzO4d7VTSxAwFaSuSTKufrZ3MjlKnpjdDQaNkRpLPtGPcX5TkiUkOS3JpO0jZBZsGKUtySZI/T7ISeEeS1yW5JskPk6xq15mR5MNJvtdu/5a2/agkq9rHuy7Jp5Ps0i47Ps1veVyT5INt2+uTfLSdfkeSm9rpQ5J8p51+XpKV7SCO3+gZSuIRdQ62O7Uz8p2FRskc4Piq+sMky4DfA94DnFJVK5P8D+B04J3t+ntV1UsAklwNHFNVtyfZq11+EvCzqvqtJLsB/5DkonbZETTj5N8CfB14bZJ/BD4IPA+4l2ak3uOAVcC72+1eBNyd5ACaK2O/3Y6j8wlgflWNJ3kDcAbwps3rlB4rQ0Gj5OaqurKdvoJmxMq9qmpl27YU+GLP+l/omf4H4Jw2TDYN/vZy4DlJfr+d35MmeH4JXF5Vm97xn0fzAv8AcElVjbft5wIvrqqvJtm9HZPrQODvaH7g50Xtvp4FPBu4uBlWhxk0w29MVKf0mBgKGiUbe6YfAvaabMXWzzdNVNVbkzwfeBVwZZLDaIY8PqWqvtG7UZKj+PWhj4uJh0je5LvAiTRj33yb5ijgSOBdwEHAtVV15NbqlB4rP1PQKPsZcG+SF7XzbwRWTrRikkOq6rKqej9wF807+m8Af9Se3iHJM9uRdwGOSHJw+1nCG4Dv0PzQykuSzEwyAzi+Z3+rgFPb+x8AvwNsrKqf0QTFWJIj2/08Lsmh268bpId5pKBRtxD4dJInATfRvFufyIeTzKF5t7+CZpTdq4DZwPfb4ZLHefjnJ78LnAn8O5oX+guq6ldJTgO+1T7O/62qTUNLf5smaFZV1UNJbgN+BFBVv2xPUf1Vkj1p/t/+Jc0ov9J25Sip0nbWnj46tapePexapEfL00eSpI5HCpKkjkcKkqSOoSBJ6hgKkqSOoSBJ6hgKkqTO/wfvYYrxyMFQgQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as plt\n",
    "from matplotlib import pyplot\n",
    "plt.pyplot.hist(df[\"horsepower\"])\n",
    "\n",
    "#plt.pyplot.hist(df[\"horsepower\"], bins = 3)\n",
    "\n",
    "# set x/y labels and plot title\n",
    "plt.pyplot.xlabel(\"horsepower\")\n",
    "plt.pyplot.ylabel(\"count\")\n",
    "plt.pyplot.title(\"horsepower bins\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p>We would like 3 bins of equal size bandwidth so we use numpy's <code>linspace(start_value, end_value, numbers_generated</code> function.</p>\n",
    "<p>Since we want to include the minimum value of horsepower we want to set start_value=min(df[\"horsepower\"]).</p>\n",
    "<p>Since we want to include the maximum value of horsepower we want to set end_value=max(df[\"horsepower\"]).</p>\n",
    "<p>Since we are building 3 bins of equal length, there should be 4 dividers, so numbers_generated=4.</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We build a bin array, with a minimum value to a maximum value, with bandwidth calculated above. The bins will be values used to determine when one bin ends and another begins."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 48.        , 119.33333333, 190.66666667, 262.        ])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bins = np.linspace(df[\"horsepower\"].min(), df[\"horsepower\"].max(), 4)\n",
    "bins"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " We set group  names:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "group_names = ['Low', 'Medium', 'High']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " We apply the function \"cut\" the determine what each value of \"df['horsepower']\" belongs to. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>horsepower</th>\n",
       "      <th>horsepower-binned</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>111</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>111</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>154</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>102</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>115</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>110</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>110</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>110</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>140</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>101</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>101</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>121</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>121</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>121</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>182</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>182</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>182</td>\n",
       "      <td>Medium</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>48</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>70</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>70</td>\n",
       "      <td>Low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    horsepower horsepower-binned\n",
       "0          111               Low\n",
       "1          111               Low\n",
       "2          154            Medium\n",
       "3          102               Low\n",
       "4          115               Low\n",
       "5          110               Low\n",
       "6          110               Low\n",
       "7          110               Low\n",
       "8          140            Medium\n",
       "9          101               Low\n",
       "10         101               Low\n",
       "11         121            Medium\n",
       "12         121            Medium\n",
       "13         121            Medium\n",
       "14         182            Medium\n",
       "15         182            Medium\n",
       "16         182            Medium\n",
       "17          48               Low\n",
       "18          70               Low\n",
       "19          70               Low"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['horsepower-binned'] = pd.cut(df['horsepower'], bins, labels=group_names, include_lowest=True )\n",
    "df[['horsepower','horsepower-binned']].head(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets see the number of vehicles in each bin."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Low       153\n",
       "Medium     43\n",
       "High        5\n",
       "Name: horsepower-binned, dtype: int64"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"horsepower-binned\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets plot the distribution of each bin."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'horsepower bins')"
      ]
     },
     "execution_count": 63,
     "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": [
    "%matplotlib inline\n",
    "import matplotlib as plt\n",
    "from matplotlib import pyplot\n",
    "pyplot.bar(group_names, df[\"horsepower-binned\"].value_counts())\n",
    "\n",
    "# set x/y labels and plot title\n",
    "plt.pyplot.xlabel(\"horsepower\")\n",
    "plt.pyplot.ylabel(\"count\")\n",
    "plt.pyplot.title(\"horsepower bins\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p>\n",
    "    Check the dataframe above carefully, you will find the last column provides the bins for \"horsepower\" with 3 categories (\"Low\",\"Medium\" and \"High\"). \n",
    "</p>\n",
    "<p>\n",
    "    We successfully narrow the intervals from 57 to 3!\n",
    "</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Bins visualization</h3>\n",
    "Normally, a histogram is used to visualize the distribution of bins we created above. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'horsepower bins')"
      ]
     },
     "execution_count": 69,
     "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": [
    "%matplotlib inline\n",
    "import matplotlib as plt\n",
    "from matplotlib import pyplot\n",
    "\n",
    "a = (0,1,2)\n",
    "\n",
    "# draw historgram of attribute \"horsepower\" with bins = 3\n",
    "plt.pyplot.hist(df[\"horsepower\"], bins = 3)\n",
    "\n",
    "# set x/y labels and plot title\n",
    "plt.pyplot.xlabel(\"horsepower\")\n",
    "plt.pyplot.ylabel(\"count\")\n",
    "plt.pyplot.title(\"horsepower bins\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The plot above shows the binning result for attribute \"horsepower\". "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 id=\"indicator\">Indicator variable (or dummy variable)</h2>\n",
    "<b>What is an indicator variable?</b>\n",
    "<p>\n",
    "    An indicator variable (or dummy variable) is a numerical variable used to label categories. They are called 'dummies' because the numbers themselves don't have inherent meaning. \n",
    "</p>\n",
    "\n",
    "<b>Why we use indicator variables?</b>\n",
    "<p>\n",
    "    So we can use categorical variables for regression analysis in the later modules.\n",
    "</p>\n",
    "<b>Example</b>\n",
    "<p>\n",
    "    We see the column \"fuel-type\" has two unique values, \"gas\" or \"diesel\". Regression doesn't understand words, only numbers. To use this attribute in regression analysis, we convert \"fuel-type\" into indicator variables.\n",
    "</p>\n",
    "\n",
    "<p>\n",
    "    We will use the panda's method 'get_dummies' to assign numerical values to different categories of fuel type. \n",
    "</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',\n",
       "       'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',\n",
       "       'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',\n",
       "       'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',\n",
       "       'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg',\n",
       "       'highway-mpg', 'price', 'city-L/100km', 'highway-L/100km',\n",
       "       'horsepower-binned'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "get indicator variables and assign it to data frame \"dummy_variable_1\" "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>diesel</th>\n",
       "      <th>gas</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   diesel  gas\n",
       "0       0    1\n",
       "1       0    1\n",
       "2       0    1\n",
       "3       0    1\n",
       "4       0    1"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummy_variable_1 = pd.get_dummies(df[\"fuel-type\"])\n",
    "dummy_variable_1.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "change column names for clarity "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "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>diesel</th>\n",
       "      <th>gas</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   diesel  gas\n",
       "0       0    1\n",
       "1       0    1\n",
       "2       0    1\n",
       "3       0    1\n",
       "4       0    1"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummy_variable_1.rename(columns={'fuel-type-diesel':'gas', 'fuel-type-diesel':'diesel'}, inplace=True)\n",
    "dummy_variable_1.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now have the value 0 to represent \"gas\" and 1 to represent \"diesel\" in the column \"fuel-type\". We will now insert this column back into our original dataset. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "ename": "InvalidIndexError",
     "evalue": "Reindexing only valid with uniquely valued Index objects",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mInvalidIndexError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-94-888564365f8c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# merge data frame \"df\" and \"dummy_variable_1\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdummy_variable_1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"fuel-type\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\"diesel\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\"gas\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;31m# drop original column \"fuel-type\" from \"df\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"fuel-type\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[1;32m    253\u001b[0m         \u001b[0mverify_integrity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverify_integrity\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    254\u001b[0m         \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 255\u001b[0;31m         \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    256\u001b[0m     )\n\u001b[1;32m    257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy, sort)\u001b[0m\n\u001b[1;32m    426\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    427\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 428\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_axes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_new_axes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    429\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    430\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36m_get_new_axes\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    495\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    496\u001b[0m                     \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 497\u001b[0;31m                 \u001b[0mnew_axes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_comb_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    498\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    499\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/reshape/concat.py\u001b[0m in \u001b[0;36m_get_comb_axis\u001b[0;34m(self, i)\u001b[0m\n\u001b[1;32m    527\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    528\u001b[0m             return _get_objs_combined_axis(\n\u001b[0;32m--> 529\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata_axis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mintersect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintersect\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    530\u001b[0m             )\n\u001b[1;32m    531\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/api.py\u001b[0m in \u001b[0;36m_get_objs_combined_axis\u001b[0;34m(objs, intersect, axis, sort)\u001b[0m\n\u001b[1;32m     91\u001b[0m     \u001b[0mobs_idxes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mobjs\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"_get_axis\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     92\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mobs_idxes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_get_combined_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobs_idxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mintersect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mintersect\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/api.py\u001b[0m in \u001b[0;36m_get_combined_index\u001b[0;34m(indexes, intersect, sort)\u001b[0m\n\u001b[1;32m    138\u001b[0m             \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    139\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 140\u001b[0;31m         \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_union_indexes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    141\u001b[0m         \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mensure_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/api.py\u001b[0m in \u001b[0;36m_union_indexes\u001b[0;34m(indexes, sort)\u001b[0m\n\u001b[1;32m    204\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    205\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mother\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mindexes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    207\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    208\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mkind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"array\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36munion\u001b[0;34m(self, other, sort)\u001b[0m\n\u001b[1;32m   2515\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2516\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_compatible_with_other\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2517\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_union_incompatible_dtypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2519\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_union\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m_union_incompatible_dtypes\u001b[0;34m(self, other, sort)\u001b[0m\n\u001b[1;32m   2434\u001b[0m         \u001b[0;31m# cast to Index for when `other` is list-like\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2435\u001b[0m         \u001b[0mother\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2436\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2437\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2438\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_is_compatible_with_other\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36munion\u001b[0;34m(self, other, sort)\u001b[0m\n\u001b[1;32m   2517\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_union_incompatible_dtypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2519\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_union\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2520\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2521\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_union\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m_union\u001b[0;34m(self, other, sort)\u001b[0m\n\u001b[1;32m   2566\u001b[0m                 \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrvals\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvalue_set\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2567\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2568\u001b[0;31m             \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2569\u001b[0m             \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnonzero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2570\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_indexer\u001b[0;34m(self, target, method, limit, tolerance)\u001b[0m\n\u001b[1;32m   2983\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2984\u001b[0m             raise InvalidIndexError(\n\u001b[0;32m-> 2985\u001b[0;31m                 \u001b[0;34m\"Reindexing only valid with uniquely\"\u001b[0m \u001b[0;34m\" valued Index objects\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2986\u001b[0m             )\n\u001b[1;32m   2987\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mInvalidIndexError\u001b[0m: Reindexing only valid with uniquely valued Index objects"
     ]
    }
   ],
   "source": [
    "# merge data frame \"df\" and \"dummy_variable_1\" \n",
    "df = pd.concat([df, dummy_variable_1], axis=1)\n",
    "df[[\"fuel-type\",\"diesel\",\"gas\"]]\n",
    "# drop original column \"fuel-type\" from \"df\"\n",
    "df.drop(\"fuel-type\", axis = 1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "symboling                      3\n",
       "normalized-losses            122\n",
       "make                 alfa-romero\n",
       "aspiration                   std\n",
       "num-of-doors                 two\n",
       "Name: 0, dtype: object"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The last two columns are now the indicator variable representation of the fuel-type variable. It's all 0s and 1s now."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-danger alertdanger\" style=\"margin-top: 20px\">\n",
    "<h1> Question  #4: </h1>\n",
    "\n",
    "<b>As above, create indicator variable to the column of \"aspiration\": \"std\" to 0, while \"turbo\" to 1.</b>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# Write your code below and press Shift+Enter to execute \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Double-click <b>here</b> for the solution.\n",
    "\n",
    "<!-- The answer is below:\n",
    "\n",
    "# get indicator variables of aspiration and assign it to data frame \"dummy_variable_2\"\n",
    "dummy_variable_2 = pd.get_dummies(df['aspiration'])\n",
    "\n",
    "# change column names for clarity\n",
    "dummy_variable_2.rename(columns={'std':'aspiration-std', 'turbo': 'aspiration-turbo'}, inplace=True)\n",
    "\n",
    "# show first 5 instances of data frame \"dummy_variable_1\"\n",
    "dummy_variable_2.head()\n",
    "\n",
    "-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " <div class=\"alert alert-danger alertdanger\" style=\"margin-top: 20px\">\n",
    "<h1> Question  #5: </h1>\n",
    "\n",
    "<b>Merge the new dataframe to the original dataframe then drop the column 'aspiration'</b>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# Write your code below and press Shift+Enter to execute \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Double-click <b>here</b> for the solution.\n",
    "\n",
    "<!-- The answer is below:\n",
    "\n",
    "#merge the new dataframe to the original datafram\n",
    "df = pd.concat([df, dummy_variable_2], axis=1)\n",
    "\n",
    "# drop original column \"aspiration\" from \"df\"\n",
    "df.drop('aspiration', axis = 1, inplace=True)\n",
    "\n",
    "-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "save the new csv "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": [
    "df.to_csv('clean_df.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Thank you for completing this notebook</h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
    "\n",
    "    <p><a href=\"https://cocl.us/corsera_da0101en_notebook_bottom\"><img src=\"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DA0101EN/Images/BottomAd.png\" width=\"750\" align=\"center\"></a></p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>About the Authors:</h3>\n",
    "\n",
    "This notebook was written by <a href=\"https://www.linkedin.com/in/mahdi-noorian-58219234/\" target=\"_blank\">Mahdi Noorian PhD</a>, <a href=\"https://www.linkedin.com/in/joseph-s-50398b136/\" target=\"_blank\">Joseph Santarcangelo</a>, Bahare Talayian, Eric Xiao, Steven Dong, Parizad, Hima Vsudevan and <a href=\"https://www.linkedin.com/in/fiorellawever/\" target=\"_blank\">Fiorella Wenver</a> and <a href=\" https://www.linkedin.com/in/yi-leng-yao-84451275/ \" target=\"_blank\" >Yi Yao</a>.\n",
    "\n",
    "<p><a href=\"https://www.linkedin.com/in/joseph-s-50398b136/\" target=\"_blank\">Joseph Santarcangelo</a> is a Data Scientist at IBM, and holds a PhD in Electrical Engineering. His research focused on using Machine Learning, Signal Processing, and Computer Vision to determine how videos impact human cognition. Joseph has been working for IBM since he completed his PhD.</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr>\n",
    "<p>Copyright &copy; 2018 IBM Developer Skills Network. This notebook and its source code are released under the terms of the <a href=\"https://cognitiveclass.ai/mit-license/\">MIT License</a>.</p>"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python",
   "language": "python",
   "name": "conda-env-python-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}