{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "29b9a9eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "#importing all the libraries needed for this implementation. The warnings module was introduced as a way to warn \n",
    "#programmers about changes in language or library features in anticipation of backwards incompatible changes coming \n",
    "#with Python 3.0. Since warnings are not fatal, a program may encounter the same warn-able situation many times in \n",
    "#the course of running a program\n",
    "#The filter is set to ignore so that the warnings are not displayed\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "#The main purpose of the OS module is to interact with the operating system\n",
    "import os\n",
    "#The main purpose of the OS module is to interact with the operating system\n",
    "import os\n",
    "#Boto3 is the name of the Python SDK for AWS. The module makes it easy to integrate the Python application, library, or script with AWS services including Amazon S3 and more\n",
    "#It allows for direct creation, updating and deletion of AWS resources from your Python scripts\n",
    "import boto3\n",
    "#Python io module allows us to manage the file-related input and output operations\n",
    "import io\n",
    "#SageMaker Python SDK is an open-source library for training and deploying machine learning models on Amazon SageMaker\n",
    "import sagemaker\n",
    "#For matrix operations and numerical processing\n",
    "import numpy as np\n",
    "#for munging tabular data\n",
    "import pandas as pd\n",
    "#For charts and visualizations \n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "#Scikit-learn is a machine learning library for Python. It features several regression, classification and clustering \n",
    "#algorithms including SVMs, gradient boosting, k-means, random forests and DBSCAN. . Using train_test_split() from the\n",
    "#data science library scikit-learn, you can split your dataset into subsets that minimize the potential for bias in \n",
    "#your evaluation and validation process.\n",
    "import sklearn\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "#With Scikit-Learn it is extremely straight forward to implement linear regression models, as all you really need to \n",
    "#do is import the LinearRegression class, instantiate it, and call the fit() method along with our training data.\n",
    "from sklearn.linear_model import LinearRegression\n",
    "#Import seaborn, a library for making statistical graphics in Python\n",
    "import seaborn\n",
    "#importing other modules that makr it easier to work with the data\n",
    "import pickle,gzip,urllib,json,csv\n",
    "#The preprocessing module provides the StandardScaler utility class, which is a quick and easy way to perform the \n",
    "#many operations on an array-like dataset\n",
    "from sklearn import preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f2b681a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Get the execution role for the notebook instance. This is the IAM role that you created for your notebook instance.\n",
    "#You pass the role to the tuning job.\n",
    "from sagemaker import get_execution_role\n",
    "role = get_execution_role()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "96251e40",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Resources represent an object-oriented interface to Amazon Web Services (AWS). They provide a higher-level \n",
    "#abstraction than the raw, low-level calls made by service clients. Defining the S3 resource, bucket name and csv\n",
    "#file object\n",
    "s3 = boto3.resource('s3')\n",
    "bucket_name = 'aws-machinelearning-chez'\n",
    "object_key = 'weatherhistory2.csv'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6dfefdb3",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Use the boto3 client to retrieve the file from bucket aws-machinelearning-chez named weatherhistory.csv. \n",
    "#Define Weather dataset as the csv file read in the response from the get_object operation\n",
    "s3_client = boto3.client('s3')\n",
    "response = s3_client.get_object(Bucket=bucket_name, Key=object_key)\n",
    "response_body = response[\"Body\"].read()\n",
    "weather_df = pd.read_csv(io.BytesIO(response_body), header=0, delimiter=\",\", low_memory=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "64579fec",
   "metadata": {},
   "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>Formatted Date</th>\n",
       "      <th>Summary</th>\n",
       "      <th>Precip Type</th>\n",
       "      <th>Temperature (C)</th>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <th>Visibility (km)</th>\n",
       "      <th>Loud Cover</th>\n",
       "      <th>Pressure (millibars)</th>\n",
       "      <th>Daily Summary</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2006-04-01 00:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>rain</td>\n",
       "      <td>9.472222</td>\n",
       "      <td>7.388889</td>\n",
       "      <td>0.89</td>\n",
       "      <td>14.1197</td>\n",
       "      <td>251</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.13</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2006-04-01 01:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>rain</td>\n",
       "      <td>9.355556</td>\n",
       "      <td>7.227778</td>\n",
       "      <td>0.86</td>\n",
       "      <td>14.2646</td>\n",
       "      <td>259</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.63</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2006-04-01 02:00:00.000 +0200</td>\n",
       "      <td>Mostly Cloudy</td>\n",
       "      <td>rain</td>\n",
       "      <td>9.377778</td>\n",
       "      <td>9.377778</td>\n",
       "      <td>0.89</td>\n",
       "      <td>3.9284</td>\n",
       "      <td>204</td>\n",
       "      <td>14.9569</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.94</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2006-04-01 03:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>rain</td>\n",
       "      <td>8.288889</td>\n",
       "      <td>5.944444</td>\n",
       "      <td>0.83</td>\n",
       "      <td>14.1036</td>\n",
       "      <td>269</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1016.41</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2006-04-01 04:00:00.000 +0200</td>\n",
       "      <td>Mostly Cloudy</td>\n",
       "      <td>rain</td>\n",
       "      <td>8.755556</td>\n",
       "      <td>6.977778</td>\n",
       "      <td>0.83</td>\n",
       "      <td>11.0446</td>\n",
       "      <td>259</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1016.51</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  Formatted Date        Summary Precip Type  Temperature (C)  \\\n",
       "0  2006-04-01 00:00:00.000 +0200  Partly Cloudy        rain         9.472222   \n",
       "1  2006-04-01 01:00:00.000 +0200  Partly Cloudy        rain         9.355556   \n",
       "2  2006-04-01 02:00:00.000 +0200  Mostly Cloudy        rain         9.377778   \n",
       "3  2006-04-01 03:00:00.000 +0200  Partly Cloudy        rain         8.288889   \n",
       "4  2006-04-01 04:00:00.000 +0200  Mostly Cloudy        rain         8.755556   \n",
       "\n",
       "   Apparent Temperature (C)  Humidity  Wind Speed (km/h)  \\\n",
       "0                  7.388889      0.89            14.1197   \n",
       "1                  7.227778      0.86            14.2646   \n",
       "2                  9.377778      0.89             3.9284   \n",
       "3                  5.944444      0.83            14.1036   \n",
       "4                  6.977778      0.83            11.0446   \n",
       "\n",
       "   Wind Bearing (degrees)  Visibility (km)  Loud Cover  Pressure (millibars)  \\\n",
       "0                     251          15.8263           0               1015.13   \n",
       "1                     259          15.8263           0               1015.63   \n",
       "2                     204          14.9569           0               1015.94   \n",
       "3                     269          15.8263           0               1016.41   \n",
       "4                     259          15.8263           0               1016.51   \n",
       "\n",
       "                       Daily Summary  \n",
       "0  Partly cloudy throughout the day.  \n",
       "1  Partly cloudy throughout the day.  \n",
       "2  Partly cloudy throughout the day.  \n",
       "3  Partly cloudy throughout the day.  \n",
       "4  Partly cloudy throughout the day.  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Look at the data\n",
    "weather_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e9f78728",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Formatted Date', 'Summary', 'Precip Type', 'Temperature (C)',\n",
       "       'Apparent Temperature (C)', 'Humidity', 'Wind Speed (km/h)',\n",
       "       'Wind Bearing (degrees)', 'Visibility (km)', 'Loud Cover',\n",
       "       'Pressure (millibars)', 'Daily Summary'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Gives an array of colums names \n",
    "weather_df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "38e6a55c",
   "metadata": {},
   "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>Temperature (C)</th>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <th>Visibility (km)</th>\n",
       "      <th>Loud Cover</th>\n",
       "      <th>Pressure (millibars)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.000000</td>\n",
       "      <td>96453.0</td>\n",
       "      <td>96453.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>11.932678</td>\n",
       "      <td>10.855029</td>\n",
       "      <td>0.734899</td>\n",
       "      <td>10.810640</td>\n",
       "      <td>187.509232</td>\n",
       "      <td>10.347325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1003.235956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>9.551546</td>\n",
       "      <td>10.696847</td>\n",
       "      <td>0.195473</td>\n",
       "      <td>6.913571</td>\n",
       "      <td>107.383428</td>\n",
       "      <td>4.192123</td>\n",
       "      <td>0.0</td>\n",
       "      <td>116.969906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-21.822222</td>\n",
       "      <td>-27.716667</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>4.688889</td>\n",
       "      <td>2.311111</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>5.828200</td>\n",
       "      <td>116.000000</td>\n",
       "      <td>8.339800</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1011.900000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>12.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>0.780000</td>\n",
       "      <td>9.965900</td>\n",
       "      <td>180.000000</td>\n",
       "      <td>10.046400</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1016.450000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>18.838889</td>\n",
       "      <td>18.838889</td>\n",
       "      <td>0.890000</td>\n",
       "      <td>14.135800</td>\n",
       "      <td>290.000000</td>\n",
       "      <td>14.812000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1021.090000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>39.905556</td>\n",
       "      <td>39.344444</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>63.852600</td>\n",
       "      <td>359.000000</td>\n",
       "      <td>16.100000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1046.380000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Temperature (C)  Apparent Temperature (C)      Humidity  \\\n",
       "count     96453.000000              96453.000000  96453.000000   \n",
       "mean         11.932678                 10.855029      0.734899   \n",
       "std           9.551546                 10.696847      0.195473   \n",
       "min         -21.822222                -27.716667      0.000000   \n",
       "25%           4.688889                  2.311111      0.600000   \n",
       "50%          12.000000                 12.000000      0.780000   \n",
       "75%          18.838889                 18.838889      0.890000   \n",
       "max          39.905556                 39.344444      1.000000   \n",
       "\n",
       "       Wind Speed (km/h)  Wind Bearing (degrees)  Visibility (km)  Loud Cover  \\\n",
       "count       96453.000000            96453.000000     96453.000000     96453.0   \n",
       "mean           10.810640              187.509232        10.347325         0.0   \n",
       "std             6.913571              107.383428         4.192123         0.0   \n",
       "min             0.000000                0.000000         0.000000         0.0   \n",
       "25%             5.828200              116.000000         8.339800         0.0   \n",
       "50%             9.965900              180.000000        10.046400         0.0   \n",
       "75%            14.135800              290.000000        14.812000         0.0   \n",
       "max            63.852600              359.000000        16.100000         0.0   \n",
       "\n",
       "       Pressure (millibars)  \n",
       "count          96453.000000  \n",
       "mean            1003.235956  \n",
       "std              116.969906  \n",
       "min                0.000000  \n",
       "25%             1011.900000  \n",
       "50%             1016.450000  \n",
       "75%             1021.090000  \n",
       "max             1046.380000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Generate descriptive statistics that summarize the central tendency, dispersion and shape of the dataset’s \n",
    "#distribution excluding NaN values\n",
    "weather_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "63edd7c4",
   "metadata": {},
   "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>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>25%</th>\n",
       "      <th>50%</th>\n",
       "      <th>75%</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Temperature (C)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>11.932678</td>\n",
       "      <td>9.551546</td>\n",
       "      <td>-21.822222</td>\n",
       "      <td>4.688889</td>\n",
       "      <td>12.0000</td>\n",
       "      <td>18.838889</td>\n",
       "      <td>39.905556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>10.855029</td>\n",
       "      <td>10.696847</td>\n",
       "      <td>-27.716667</td>\n",
       "      <td>2.311111</td>\n",
       "      <td>12.0000</td>\n",
       "      <td>18.838889</td>\n",
       "      <td>39.344444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Humidity</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>0.734899</td>\n",
       "      <td>0.195473</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.7800</td>\n",
       "      <td>0.890000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>10.810640</td>\n",
       "      <td>6.913571</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>5.828200</td>\n",
       "      <td>9.9659</td>\n",
       "      <td>14.135800</td>\n",
       "      <td>63.852600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>187.509232</td>\n",
       "      <td>107.383428</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>116.000000</td>\n",
       "      <td>180.0000</td>\n",
       "      <td>290.000000</td>\n",
       "      <td>359.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Visibility (km)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>10.347325</td>\n",
       "      <td>4.192123</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>8.339800</td>\n",
       "      <td>10.0464</td>\n",
       "      <td>14.812000</td>\n",
       "      <td>16.100000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Loud Cover</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Pressure (millibars)</th>\n",
       "      <td>96453.0</td>\n",
       "      <td>1003.235956</td>\n",
       "      <td>116.969906</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1011.900000</td>\n",
       "      <td>1016.4500</td>\n",
       "      <td>1021.090000</td>\n",
       "      <td>1046.380000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            count         mean         std        min  \\\n",
       "Temperature (C)           96453.0    11.932678    9.551546 -21.822222   \n",
       "Apparent Temperature (C)  96453.0    10.855029   10.696847 -27.716667   \n",
       "Humidity                  96453.0     0.734899    0.195473   0.000000   \n",
       "Wind Speed (km/h)         96453.0    10.810640    6.913571   0.000000   \n",
       "Wind Bearing (degrees)    96453.0   187.509232  107.383428   0.000000   \n",
       "Visibility (km)           96453.0    10.347325    4.192123   0.000000   \n",
       "Loud Cover                96453.0     0.000000    0.000000   0.000000   \n",
       "Pressure (millibars)      96453.0  1003.235956  116.969906   0.000000   \n",
       "\n",
       "                                  25%        50%          75%          max  \n",
       "Temperature (C)              4.688889    12.0000    18.838889    39.905556  \n",
       "Apparent Temperature (C)     2.311111    12.0000    18.838889    39.344444  \n",
       "Humidity                     0.600000     0.7800     0.890000     1.000000  \n",
       "Wind Speed (km/h)            5.828200     9.9659    14.135800    63.852600  \n",
       "Wind Bearing (degrees)     116.000000   180.0000   290.000000   359.000000  \n",
       "Visibility (km)              8.339800    10.0464    14.812000    16.100000  \n",
       "Loud Cover                   0.000000     0.0000     0.000000     0.000000  \n",
       "Pressure (millibars)      1011.900000  1016.4500  1021.090000  1046.380000  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weather_df.describe().transpose()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e880e09f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#A seaborn plot enables us to visualize a statistical plot of the raw data\n",
    "plt.figure(figsize=(15,10))\n",
    "plt.tight_layout()\n",
    "seaborn.distplot(weather_df['Apparent Temperature (C)'])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "061b2760",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 96453 entries, 0 to 96452\n",
      "Data columns (total 12 columns):\n",
      " #   Column                    Non-Null Count  Dtype  \n",
      "---  ------                    --------------  -----  \n",
      " 0   Formatted Date            96453 non-null  object \n",
      " 1   Summary                   96453 non-null  object \n",
      " 2   Precip Type               95936 non-null  object \n",
      " 3   Temperature (C)           96453 non-null  float64\n",
      " 4   Apparent Temperature (C)  96453 non-null  float64\n",
      " 5   Humidity                  96453 non-null  float64\n",
      " 6   Wind Speed (km/h)         96453 non-null  float64\n",
      " 7   Wind Bearing (degrees)    96453 non-null  int64  \n",
      " 8   Visibility (km)           96453 non-null  float64\n",
      " 9   Loud Cover                96453 non-null  int64  \n",
      " 10  Pressure (millibars)      96453 non-null  float64\n",
      " 11  Daily Summary             96453 non-null  object \n",
      "dtypes: float64(6), int64(2), object(4)\n",
      "memory usage: 8.8+ MB\n"
     ]
    }
   ],
   "source": [
    "#Prints a concise summary of the dataframe\n",
    "weather_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "936c25af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Formatted Date              False\n",
       "Summary                     False\n",
       "Precip Type                  True\n",
       "Temperature (C)             False\n",
       "Apparent Temperature (C)    False\n",
       "Humidity                    False\n",
       "Wind Speed (km/h)           False\n",
       "Wind Bearing (degrees)      False\n",
       "Visibility (km)             False\n",
       "Loud Cover                  False\n",
       "Pressure (millibars)        False\n",
       "Daily Summary               False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#check if there is any null value in a particular column\n",
    "weather_df.isnull().any()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7edff764",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Formatted Date              False\n",
       "Summary                     False\n",
       "Precip Type                 False\n",
       "Temperature (C)             False\n",
       "Apparent Temperature (C)    False\n",
       "Humidity                    False\n",
       "Wind Speed (km/h)           False\n",
       "Wind Bearing (degrees)      False\n",
       "Visibility (km)             False\n",
       "Loud Cover                  False\n",
       "Pressure (millibars)        False\n",
       "Daily Summary               False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#check if there are all null values in a particular column\n",
    "weather_df.isnull().all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "582d3b83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Formatted Date              0.00\n",
       "Summary                     0.00\n",
       "Precip Type                 0.54\n",
       "Temperature (C)             0.00\n",
       "Apparent Temperature (C)    0.00\n",
       "Humidity                    0.00\n",
       "Wind Speed (km/h)           0.00\n",
       "Wind Bearing (degrees)      0.00\n",
       "Visibility (km)             0.00\n",
       "Loud Cover                  0.00\n",
       "Pressure (millibars)        0.00\n",
       "Daily Summary               0.00\n",
       "dtype: float64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#calculate the percentage of null values in each column\n",
    "round(100*(weather_df.isnull().sum()/len(weather_df.index)),2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4e91d9bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "rain    85224\n",
       "snow    10712\n",
       "Name: Precip Type, dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#determine what values are in this column and what the count is of each value\n",
    "weather_df['Precip Type'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f2d4f021",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Handling missing values by imputation of the mode i.e. rain\n",
    "weather_df.loc[weather_df['Precip Type'].isnull(),'Precip Type']='rain'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2e854ebd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Formatted Date              0.0\n",
       "Summary                     0.0\n",
       "Precip Type                 0.0\n",
       "Temperature (C)             0.0\n",
       "Apparent Temperature (C)    0.0\n",
       "Humidity                    0.0\n",
       "Wind Speed (km/h)           0.0\n",
       "Wind Bearing (degrees)      0.0\n",
       "Visibility (km)             0.0\n",
       "Loud Cover                  0.0\n",
       "Pressure (millibars)        0.0\n",
       "Daily Summary               0.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#calculate the percentage of null values in each column for the second time\n",
    "round(100*(weather_df.isnull().sum()/len(weather_df.index)),2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "de3b07c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Input binary values in Precip type column for rain and snow\n",
    "weather_df.loc[weather_df['Precip Type']=='rain','Precip Type']=1\n",
    "weather_df.loc[weather_df['Precip Type']=='snow','Precip Type']=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c46161fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "weather_df_num=weather_df[list(weather_df.dtypes[weather_df.dtypes!='odject'].index)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "9601e37b",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Drop columns that are irrelevant to the model training\n",
    "to_drop = ['Formatted Date','Summary','Daily Summary']\n",
    "weather_df.drop(to_drop, inplace=True, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "117f1c38",
   "metadata": {},
   "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>Precip Type</th>\n",
       "      <th>Temperature (C)</th>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <th>Visibility (km)</th>\n",
       "      <th>Loud Cover</th>\n",
       "      <th>Pressure (millibars)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>9.472222</td>\n",
       "      <td>7.388889</td>\n",
       "      <td>0.89</td>\n",
       "      <td>14.1197</td>\n",
       "      <td>251</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>9.355556</td>\n",
       "      <td>7.227778</td>\n",
       "      <td>0.86</td>\n",
       "      <td>14.2646</td>\n",
       "      <td>259</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>9.377778</td>\n",
       "      <td>9.377778</td>\n",
       "      <td>0.89</td>\n",
       "      <td>3.9284</td>\n",
       "      <td>204</td>\n",
       "      <td>14.9569</td>\n",
       "      <td>0</td>\n",
       "      <td>1015.94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>8.288889</td>\n",
       "      <td>5.944444</td>\n",
       "      <td>0.83</td>\n",
       "      <td>14.1036</td>\n",
       "      <td>269</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1016.41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>8.755556</td>\n",
       "      <td>6.977778</td>\n",
       "      <td>0.83</td>\n",
       "      <td>11.0446</td>\n",
       "      <td>259</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1016.51</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Precip Type  Temperature (C)  Apparent Temperature (C)  Humidity  \\\n",
       "0           1         9.472222                  7.388889      0.89   \n",
       "1           1         9.355556                  7.227778      0.86   \n",
       "2           1         9.377778                  9.377778      0.89   \n",
       "3           1         8.288889                  5.944444      0.83   \n",
       "4           1         8.755556                  6.977778      0.83   \n",
       "\n",
       "   Wind Speed (km/h)  Wind Bearing (degrees)  Visibility (km)  Loud Cover  \\\n",
       "0            14.1197                     251          15.8263           0   \n",
       "1            14.2646                     259          15.8263           0   \n",
       "2             3.9284                     204          14.9569           0   \n",
       "3            14.1036                     269          15.8263           0   \n",
       "4            11.0446                     259          15.8263           0   \n",
       "\n",
       "   Pressure (millibars)  \n",
       "0               1015.13  \n",
       "1               1015.63  \n",
       "2               1015.94  \n",
       "3               1016.41  \n",
       "4               1016.51  "
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weather_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a993c8b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Separating the training and the test datasets. The feature that we are predicting is temperature, so we separate \n",
    "#it out into a column on its own (weather_y) leaving the rest of the data in weather_x\n",
    "weather_df_y = weather_df_num.pop('Temperature (C)')\n",
    "weather_df_x = weather_df_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a634eefc",
   "metadata": {},
   "outputs": [],
   "source": [
    "#In supervised machine learning, we add data to the model and tell it what the output will be based on the various \n",
    "#conditions of that data. The model then learns from these features and is then able to make a prediction for new \n",
    "#values \n",
    "#So we now split the data into train and test\n",
    "\n",
    "train_x,test_x,train_y,test_y = train_test_split(weather_df_x,weather_df_y,test_size = 0.2,random_state=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "01558688",
   "metadata": {},
   "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>Formatted Date</th>\n",
       "      <th>Summary</th>\n",
       "      <th>Precip Type</th>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <th>Visibility (km)</th>\n",
       "      <th>Loud Cover</th>\n",
       "      <th>Pressure (millibars)</th>\n",
       "      <th>Daily Summary</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>70626</th>\n",
       "      <td>2014-04-27 18:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>1</td>\n",
       "      <td>21.061111</td>\n",
       "      <td>0.31</td>\n",
       "      <td>12.5580</td>\n",
       "      <td>110</td>\n",
       "      <td>16.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>1005.87</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52457</th>\n",
       "      <td>2011-09-30 17:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>1</td>\n",
       "      <td>25.016667</td>\n",
       "      <td>0.36</td>\n",
       "      <td>18.4989</td>\n",
       "      <td>352</td>\n",
       "      <td>10.3523</td>\n",
       "      <td>0</td>\n",
       "      <td>1025.36</td>\n",
       "      <td>Partly cloudy starting in the morning continui...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90690</th>\n",
       "      <td>2016-01-13 21:00:00.000 +0100</td>\n",
       "      <td>Overcast</td>\n",
       "      <td>1</td>\n",
       "      <td>0.738889</td>\n",
       "      <td>0.89</td>\n",
       "      <td>17.1304</td>\n",
       "      <td>270</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1014.75</td>\n",
       "      <td>Partly cloudy overnight.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69528</th>\n",
       "      <td>2013-09-13 00:00:00.000 +0200</td>\n",
       "      <td>Overcast</td>\n",
       "      <td>1</td>\n",
       "      <td>13.772222</td>\n",
       "      <td>0.78</td>\n",
       "      <td>14.4900</td>\n",
       "      <td>300</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1014.56</td>\n",
       "      <td>Mostly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92419</th>\n",
       "      <td>2016-06-22 22:00:00.000 +0200</td>\n",
       "      <td>Partly Cloudy</td>\n",
       "      <td>1</td>\n",
       "      <td>23.288889</td>\n",
       "      <td>0.82</td>\n",
       "      <td>6.3917</td>\n",
       "      <td>357</td>\n",
       "      <td>16.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>1022.05</td>\n",
       "      <td>Partly cloudy throughout the day.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                      Formatted Date        Summary Precip Type  \\\n",
       "70626  2014-04-27 18:00:00.000 +0200  Partly Cloudy           1   \n",
       "52457  2011-09-30 17:00:00.000 +0200  Partly Cloudy           1   \n",
       "90690  2016-01-13 21:00:00.000 +0100       Overcast           1   \n",
       "69528  2013-09-13 00:00:00.000 +0200       Overcast           1   \n",
       "92419  2016-06-22 22:00:00.000 +0200  Partly Cloudy           1   \n",
       "\n",
       "       Apparent Temperature (C)  Humidity  Wind Speed (km/h)  \\\n",
       "70626                 21.061111      0.31            12.5580   \n",
       "52457                 25.016667      0.36            18.4989   \n",
       "90690                  0.738889      0.89            17.1304   \n",
       "69528                 13.772222      0.78            14.4900   \n",
       "92419                 23.288889      0.82             6.3917   \n",
       "\n",
       "       Wind Bearing (degrees)  Visibility (km)  Loud Cover  \\\n",
       "70626                     110          16.1000           0   \n",
       "52457                     352          10.3523           0   \n",
       "90690                     270          15.8263           0   \n",
       "69528                     300          15.8263           0   \n",
       "92419                     357          16.1000           0   \n",
       "\n",
       "       Pressure (millibars)                                      Daily Summary  \n",
       "70626               1005.87                  Partly cloudy throughout the day.  \n",
       "52457               1025.36  Partly cloudy starting in the morning continui...  \n",
       "90690               1014.75                           Partly cloudy overnight.  \n",
       "69528               1014.56                  Mostly cloudy throughout the day.  \n",
       "92419               1022.05                  Partly cloudy throughout the day.  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Look at the training dataset. It has all columns except the temperature column\n",
    "train_x.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "24d17b8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Drop columns that are irrelevant to the model training\n",
    "to_drop = ['Formatted Date','Summary','Daily Summary']\n",
    "train_x.drop(to_drop, inplace=True, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b0916361",
   "metadata": {},
   "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>Precip Type</th>\n",
       "      <th>Apparent Temperature (C)</th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed (km/h)</th>\n",
       "      <th>Wind Bearing (degrees)</th>\n",
       "      <th>Visibility (km)</th>\n",
       "      <th>Loud Cover</th>\n",
       "      <th>Pressure (millibars)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>70626</th>\n",
       "      <td>1</td>\n",
       "      <td>21.061111</td>\n",
       "      <td>0.31</td>\n",
       "      <td>12.5580</td>\n",
       "      <td>110</td>\n",
       "      <td>16.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>1005.87</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52457</th>\n",
       "      <td>1</td>\n",
       "      <td>25.016667</td>\n",
       "      <td>0.36</td>\n",
       "      <td>18.4989</td>\n",
       "      <td>352</td>\n",
       "      <td>10.3523</td>\n",
       "      <td>0</td>\n",
       "      <td>1025.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90690</th>\n",
       "      <td>1</td>\n",
       "      <td>0.738889</td>\n",
       "      <td>0.89</td>\n",
       "      <td>17.1304</td>\n",
       "      <td>270</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1014.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69528</th>\n",
       "      <td>1</td>\n",
       "      <td>13.772222</td>\n",
       "      <td>0.78</td>\n",
       "      <td>14.4900</td>\n",
       "      <td>300</td>\n",
       "      <td>15.8263</td>\n",
       "      <td>0</td>\n",
       "      <td>1014.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92419</th>\n",
       "      <td>1</td>\n",
       "      <td>23.288889</td>\n",
       "      <td>0.82</td>\n",
       "      <td>6.3917</td>\n",
       "      <td>357</td>\n",
       "      <td>16.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>1022.05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Precip Type  Apparent Temperature (C)  Humidity  Wind Speed (km/h)  \\\n",
       "70626           1                 21.061111      0.31            12.5580   \n",
       "52457           1                 25.016667      0.36            18.4989   \n",
       "90690           1                  0.738889      0.89            17.1304   \n",
       "69528           1                 13.772222      0.78            14.4900   \n",
       "92419           1                 23.288889      0.82             6.3917   \n",
       "\n",
       "       Wind Bearing (degrees)  Visibility (km)  Loud Cover  \\\n",
       "70626                     110          16.1000           0   \n",
       "52457                     352          10.3523           0   \n",
       "90690                     270          15.8263           0   \n",
       "69528                     300          15.8263           0   \n",
       "92419                     357          16.1000           0   \n",
       "\n",
       "       Pressure (millibars)  \n",
       "70626               1005.87  \n",
       "52457               1025.36  \n",
       "90690               1014.75  \n",
       "69528               1014.56  \n",
       "92419               1022.05  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Look at the training dataset. It has all columns except the temperature column\n",
    "train_x.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "efd264ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "70626    21.061111\n",
       "52457    25.016667\n",
       "90690     4.422222\n",
       "69528    13.772222\n",
       "92419    23.288889\n",
       "Name: Temperature (C), dtype: float64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_y.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "3c257e03",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37443    -2.288889\n",
       "86534     8.861111\n",
       "2082      9.805556\n",
       "53130    27.222222\n",
       "45196    17.705556\n",
       "Name: Temperature (C), dtype: float64"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_y.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "b8cfd12e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(19291, 11)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "962d5baa",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Drop columns that are irrelevant to the model training\n",
    "to_drop = ['Formatted Date','Summary','Daily Summary']\n",
    "test_x.drop(to_drop, inplace=True, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "83092f66",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(19291, 8)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "4b3bd7b2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(77162, 8)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d5e2cc30",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Using polynomial regression to train the model. Polynomial Regression is a one of the types of linear regression in \n",
    "#which the relationship between the independent variable x and dependent variable y is modeled as an nth degree \n",
    "#polynomial. In this case that degree is 4\n",
    "\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "poly = PolynomialFeatures(degree = 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "0c42763e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PolynomialFeatures(degree=4)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Now we train the model\n",
    "X_poly = poly.fit_transform(train_x)\n",
    "poly.fit(X_poly, train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "a04a7b45",
   "metadata": {},
   "outputs": [],
   "source": [
    "#We now look at how well out model has been trained by feeding it test data and getting it to make a prediction and\n",
    "#then comparing its output to test data output\n",
    "lin2 = LinearRegression()\n",
    "lin2.fit(X_poly, train_y)\n",
    "prediction2 = lin2.predict(poly.fit_transform(test_x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "2b9dec31",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Now look at the difference between predicted and actual\n",
    "df=pd.DataFrame({'actual':test_y,\n",
    "             'prediction':prediction2,\n",
    "             'diff':(test_y-prediction2)})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "a7cec161",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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0m2//fb5t3/7txtM+/5Vw3Gej370o28wfe+998555513g2lnnHHG6suve93rkiS77rprTj/99Hkfb2rnOE0W5jynAAAAsFGUUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6W4jznAIsqCVHnjzv9B7nHAMAtkLLdl7g+7tyYe9vPZYvX543vOEN+ehHP5oPf/jD+drXvpYjjzxy3t+94oorcuKJJ+aFL3xhkuT73/9+XvziF+f973//mJGT+OYUAABgs/CrX/3qJv/N4x73uLUW02Qop8cee+zq63vssUeXYpoop8DmZNnO1/8sf931lwEANnMrVqzIPvvsk8MOOyz3ute98uQnPzk//9nPs2TJkrzqVa/KAx/4wLzvfe/LJz/5ydz//vfP/vvvn6c85Sm5+uqrkyQf//jHs88+++SBD3xgPvjBD66+3+OPPz4vetGLkiQ//OEP88QnPjH3vve9c+973ztf+MIXcuSRR+bb3/529ttvv/zZn/1ZVqxYkXve855JkpUrV+ZZz3pW9t133zzygY/MZz7zmdX3+aQnPSmHHHJI9tprr/z5n//5gswD5RQAAGACvv71r+eII47Ieeedl1ve8pY54W0nJEkWL16c0047LQ9/+MPz6le/OqecckrOPvvsLF26NG984xuzcuXKPPe5z81HPvKRnHrqqbn00kvnvf8Xv/jFechDHpIvf/nLOfvss3OPe9wjRx99dH7zN38z5557bl7/+tff4Pff/OY3J0nOP//8HPvPx+awww7LypUrkyTnnntu3vOe9+T888/Pe97znnzve9/b6P+/cgoAADABd7zjHfOABzwgSfKMZzwjXzz9i0mSpz71qUmSM844I1/72tfygAc8IPvtt19OOOGEXHTRRbnwwgtzl7vcJXvttVeqKs94xjPmvf9///d/zwte8IIkybbbbpudd173HminnXZanvnMZyZJ7rr3XXPnO9853/jGN5IkBx98cHbeeecsXrw4d7/73XPRRRdt9P/fgEgAAAATUFXzXr/FLW6RJGmt5RGPeETe9a533eD3zj333Bv97UJora31tu2333715W233TbXXnvtRj+eb04BAAAm4OKLL87pp5+eJHnXu96V377/b9/g9gMPPDCf//zn861vfStJ8rOf/Szf+MY3ss8+++S73/1uvv3tb6/+2/kcfPDBectb3pJkGFzpJz/5SXbaaadcddVV8/7+gx/84Lzzne9Mknz7m9/OxRdfnLvd7W4b/x9dC9+cAgAAzDXyqV9W+a3f+q2ccMIJed7znpe99torR776yLzjuHesvn233XbL8ccfn6c97Wn5xS9+kSR59atfnb333jvHHXdcDj300Oy666554AMfmK985Ss3uv+///u/zxFHHJG3v/3t2XbbbfOWt7wl97///fOABzwg97znPfPoRz86f/zHf7z691/4whfm+c9/fvbdd9+0bVqOP/74G3xjutCUUwAAgAnYZptt8ta3vnX19e9f9f2sWLHiBr/zsIc9LF/60pdu9LeHHHJILrzwwhtNP/zww3P44YcnSW53u9vlpJNOutHvnHjiiTe4vqrYLl68OMcff/zqLHvstMeN7jNJPvrRj673/7Yh7NYLAABAd8opAABAZ0uWLJl3V9ytiXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1TyQAAAMyx7wn7Luj9nX/Y+Tf5b5YtW5brtrsu+UXy4Ac/OA9/+MNz6qmn5vnPf3622267nH766fnrv/7rfOxjH8vv/u7v5vWvf/2CZu5BOQUAAJioV73qVasvv/Od78zLXvayPOtZz0qS/OM//mMuu+yybL/99r3iLSjlFAAAYAJe85rX5B3veEfueMc7Zrfddste99wrhx9+eB7zmMfkiiuuyHvf+9584hOfyCmnnJKrrroqP/3pT3O/+90vL3/5y/PUpz61d/yNppwCAAB0dtZZZ+Xd7353zjnnnFx77bXZf//9s9c991p9+3Oe85ycdtppecxjHpMnP/nJSZIdd9wx5557bqfEC085BQAA6OzUU0/NE5/4xOywww5Jksc97nGdE41POWV8y3aec2VlsvyY2fQru8QBAIApqKreEbpSTtlklhx58rzTVyweOQgAAEzcgx/84Bx++OE58sgjc+211+YjH/lInnb403rHGpVyCgAAMMevc+qXjbX//vvnqU99avbbb7/c+c53zoMe9KDRM/SmnAIAAEzAK17xirziFa9Yff37V30/e+y0x+rrxx9//A1+/+qrrx4r2ii26R0AAAAAlFMAAAC6U04BAICtXmutd4Qtyq8zP5VTAABgq7Z48eJcfvnlCuoCaa3l8ssvz+LFN+00HQZEAgAAtmp77rlnLrnkklx6xaX5yeKf9I6z2hUrr8iVi6/sHSPJTc+yePHi7LnnnjfpMZRTAABgq7bddtvlLne5S05YfkKW3WdZ7zirLVu+bDJ5xshit14AAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6G5R7wAAAJO1bOc5V1Ymy4+ZTb+ySxyALZlyCgBs9ZYcefK801csHjkIwFbMbr0AAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHcbXU6r6o5V9ZmquqCqvlpVfzqbfpuq+lRVfXP27603Pi4AAABbooX45vTaJP+ztfZbSQ5M8sdVdfckRyb5dGttrySfnl0HAACAG9noctpa+0Fr7ezZ5auSXJDkDkken+SE2a+dkOQJG/tYAAAAbJmqtbZwd1a1JMnnktwzycWttVvNue3HrbUb7dpbVUckOSJJdtl9lwNedOKLNjrH8hXLc9CSgzb6fhbK1prnTad8Y97pL1n0geuz5NoclEXDlYNevskzrc/W+lxtiDGzWHY23pTyTClLIs+6TClLYruzPlN6vqaUJZFnXaaUJZFnfaaUZ6GyHPXQo85qrS2d77YFK6dVtWOSzyZ5TWvtg1V1xYaU07mWLl3azjzzzI3Osmz5siw7aNlG389C2VrzLDny5Hmnr1j89OuzZGWWZfHsypWbPNP6bK3P1YYYM4tlZ+NNKc+UsiTyrMuUsiS2O+szpedrSlkSedZlSlkSedZnSnkWKktVrbWcLshovVW1XZIPJHlna+2Ds8k/rKrdZ7fvnuS/FuKxAAAA2PIsxGi9leTtSS5orb1xzk0fTnLY7PJhSU7a2McCAABgy7RoAe7jAUmemeT8qjp3Nu0vkxyd5L1V9ewkFyd5ygI8FgAAAFugjS6nrbXTktRabj54Y+8fAACALd+CHHMKAAAAG0M5BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6W9Q7ADANS448+UbTVhx9aIckAABsjZRTthrzla8kWbH46XOurUyWHzNcXHblpg8FAAAksVsvAAAAE6CcAgAA0J3deoG1W7bznCt2eQYAYNPxzSkAAADd+eYUAADY4q11cExnJ5gM35wCAADQnW9OAQCArZcxNibDN6cAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0t6h3AAAANtCynedcWZksP2Y2/coucQAWkm9OAQAA6M43pwAAE7PkyJPnnb5i8chBAEbkm1MAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO4W9Q4AwBZo2c5zrqxMlh8zm35llzgAwPT55hQAAIDulFMAAAC6U04BAADozjGnAPzalhx58rzTVyweOQgAa2ccADYTvjkFAACgO9+cAgCw+fPtIGz2lFMAADYbm83hBMoy3GTKKQAA/Jo2m7IMmwHHnAIAANCdb04BAGAL4FtcNne+OQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoLtFvQMAAADQz5IjT553+oqjDx01h3IKAADAjS3bec6VlcnyY2bTr9wkD2e3XgAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO4WpJxW1T9X1X9V1VfmTLtNVX2qqr45+/fWC/FYAAAAbHkW6pvT45Mcssa0I5N8urW2V5JPz64DAADAjSxIOW2tfS7Jj9aY/PgkJ8wun5DkCQvxWAAAAGx5Fm3C+75da+0HSdJa+0FV3Xa+X6qqI5IckSS77L5Lli1fttEPvHzF8gW5n4Wytea5YtE35p2+LCuvz5Jrr7++iTNNLc+GGHPZmW/+eK423JjP1ZtOmX/+vGTRB67Pk2uzbPnrhisHvXyTZfFcbbwp5ZlSlqT/NjCxHdxQnqtp5JlSlg21NS87G2Jre99erbWFuaOqJUk+2lq75+z6Fa21W825/cettXUed7p06dJ25plnbnSWZcuXZdlByzb6fhbK1ppnyZEnzzt9xeKnX58lK7Msi2dXrtyq8myIMZed+eaP52rD9X6ukj7zZ0pZNtTWuk3eEFPKkmy969UU86yP52oaeaaUZUNtzcvOhtgS37dX1VmttaXz3bYpvzn9YVXtPvvWdPck/7UJH4uZtS5YRx86chIAAIANtylPJfPhJIfNLh+W5KRN+FgAAABsxhbqVDLvSnJ6krtV1SVV9ewkRyd5RFV9M8kjZtcBAADgRhZkt97W2tPWctPBC3H/LIBlO8+5sjJZfsxsev996QG2VA61AIANtymPOQUA5uMDQwC4kU15zCkAAABsEOUUAACA7pRTAAAAulNOAQAA6M6ASJuKwS4AAAA2mG9OAQAA6M43pxtpreewWzxyEAAAgM2Yb04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoblHvAABTt+TIk+edvuLoQ0dOAgCw5fLNKQAAAN0ppwAAAHSnnAIAANCdY04Bfl3Ldp5zZWWy/JjZ9Cu7xAEA2Jz55hQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpb1DsAALD1WXLkyfNOX3H0oSMnAWAqfHMKAABAd745BQCmY9nOc66sTJYfM5t+ZZc4AIzHN6cAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdGe0XgAA1mqt56Rd/PQ514ysDGw835wCAADQnW9OYWqc4w8AgK2Qb04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDunkgEAAJiKrfi0gsopAFu+rfiFHgA2F8opdLLkyJPnnb5i8chBAAAYnfeCN6acArDF8EIPAJsvAyIBAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0N2iTf0AVXVIkr9Psm2St7XWjt7Uj8mG2/eEfeedfv5h54+chM2J5WbdzB8AgJtuk5bTqto2yZuTPCLJJUm+VFUfbq19bVM+LgCwZfGhD8CWb1N/c3rfJN9qrX0nSarq3Uken0Q5BRaMN60AwELz/mJ8m7qc3iHJ9+ZcvyTJ/TbxYwLAZskbIbYElmPY8m2q9bxaaxt1B+u886qnJHlUa+05s+vPTHLf1tqfzPmdI5IckSS77L7LAS868UXrvM83nfKNeae/ZNEHVl9enmtz0KrefdDLN+a/sCCWr1ieg5YclCQ59txj5/2dF+73wi55ejNv1m1K82fK82YK5Fm7KS3HU8+zqc33Grq2189jb7XzvPexpc6bDTHlPL2XZfNm88kzZpab+r7ddufG1vd8bY7z5qiHHnVWa23pfLdt6nJ6/yTLWmuPml1/eZK01l433+8vXbq0nXnmmeu8zyVHnjzv9BWLn7768rKszLIsnl258qYHX2DLli/LsoOWJZnGp4lz8/Q2pSzJtPP0XnamPG+mQJ61m9JyPPU8m9p8r6Fre/3c9y53mvc+ttR5syGmnKf3sjzleTMFU8oz5nJzU9+32+7c2JTyLFSWqlprOd3Uu/V+KcleVXWXJP+Z5PeTPH3df7Jls0sLwHTYJrOlsCwDW4JNWk5ba9dW1YuSfCLDqWT+ubX21U35mAAAAGx+Nvl5TltrH0vysU39OABMn293AFgbrxFs0zsAAAAAbPJvTgEAgOnxTSVT45tTAAAAuvPNKQBwI75RAWBsyilsJrxRBABgS2a3XgAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6W9Q7wE214uhD13LLlddfXL4sOWjZCGkAAABYCL45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpb1DsAANDRsiuvv7x8WXLQsl5JANjK+eYUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKC7Rb0DAADjWHH0ob0jAMBa+eYUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6G6jymlVPaWqvlpV11XV0jVue3lVfauqvl5Vj9q4mAAAAGzJFm3k338lyZOS/OPciVV19yS/n+QeSfZIckpV7d1a+9VGPh4AAABboI365rS1dkFr7evz3PT4JO9urf2itfbdJN9Kct+NeSwAAAC2XJvqmNM7JPnenOuXzKYBAADAjVRrbd2/UHVKktvPc9MrWmsnzX5neZKXtdbOnF1/c5LTW2v/Mrv+9iQfa619YJ77PyLJEUmyy+67HPCiE1/06/9vZpavWJ6Dlhy00fezUORZuyllSeRZlyllSeRZnynlmVKWRJ51mVKWRJ71mVKeKWVJ5FmXMbO86ZRvzDv9JYuurwTLc20OWnWk4UEvHyPWOk3puUqmlWehshz10KPOaq0tnffG1tpG/yRZnmTpnOsvT/LyOdc/keT+67ufAw44oC2EV37mlQtyPwtFnrWbUpbW5FmXKWVpTZ71mVKeKWVpTZ51mVKW1uRZnynlmVKW1uRZlzGz3PkvPjrvT3vlLVf/vPKVN7v++gRM6blqbVp5FipLkjPbWvrgptqt98NJfr+qtq+quyTZK8kXN9FjAQAAsJnb2FPJPLGqLkly/yQnV9UnkqS19tUk703ytSQfT/LHzUi9AAAArMVGnUqmtfahJB9ay22vSfKajbl/AAAAtg6bardeAAAA2GDKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3yikAAADdKacAAAB0p5wCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHSnnAIAANCdcgoAAEB3i3oHAAAAtiLLrrz+8vJlyUHLeiVhYnxzCgAAQHfKKQAAAN0ppwAAAHTnmFMAAGDBrTj60N4R2Mz45hQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA75RQAAIDulFMAAAC6U04BAADoTjkFAACgO+UUAACA7pRTAAAAulNOAQAA6E45BQAAoDvlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKC7aq31zrBaVV2W5KIFuKtdk/z3AtzPQpFn7aaUJZFnXaaUJZFnfaaUZ0pZEnnWZUpZEnnWZ0p5ppQlkWddppQlkWd9ppRnobLcubW223w3TKqcLpSqOrO1trR3jlXkWbspZUnkWZcpZUnkWZ8p5ZlSlkSedZlSlkSe9ZlSnillSeRZlyllSeRZnynlGSOL3XoBAADoTjkFAACguy21nB7XO8Aa5Fm7KWVJ5FmXKWVJ5FmfKeWZUpZEnnWZUpZEnvWZUp4pZUnkWZcpZUnkWZ8p5dnkWbbIY04BAADYvGyp35wCAACwGVFOAQAA6E45BQAAoDvlFAAAgO6U0xFU1f4dH/tRVfXsqlqyxvQ/6hRp1ePfpqpu3TPDXFV1y6o6YEqZpqbncjw1VbXrGtefUVX/p6qOqKrqlWuWxbI8j6ltc+ZTVX89gQzW83Uwf2DhdX6fXFX1e1X1lNnlg2ev5y+sKj2pg81+plfVPlX1b1V1clX9ZlUdX1VXVNUXq+q3OuTZf42fA5J8uKruM/bKV1WvTfKKJPsm+XRV/cmcm180ZpZZnjtV1bur6rIk/5HkS1X1X7NpS0bO8i+rCkZVPSrJV5P8bZJzq+opY2aZk+mOs3lxalX9ZVVtN+e2fx05y2SW41meH1XV22YvGl3L38wnV12oqr9K8swkZyV5RJI3jhlkasvylJ6rKW1zNtBzxnywqa3n61JV53d4zM1m/oxt7gfcVbVnVX169t7rC1W1d4c8U9ruTCbL+livkiRvTvJ7GV7H/78kz09yZpIHJzlmzCBTeh84e8wuHWuzP5VMVX0uyeuT7Jjk6CR/keQ9SR6T5CWttYNHznNdkjOS/GLO5ANn01pr7WEjZjk/yX1aa9dW1a2SnJjk6621l1bVOa21+4yVZZbn9CRvSvL+1tqvZtO2TfKUDM/VgSNmOb+1tu/s8heSPL21tmL2Jv/TrbV7j5VlTqZPJflAhmXl2UkOSPLY1trlYz9fU1qOZ3m+nuQfkjwtyZIk70/yrtbaGWPmmJNn9fNRVWcneVBr7aezF5KzVy1bI2WZ1LI8pedqStucOZl+srabkty8tbZoxCxTW8+ftLabkry1tbbbyHmmNn9+lOSDSd6V5N9bxzdwVXV2a23/2eX3Jvl0kn9K8vgkL+rw3mtK253JZJnlsV6tO8/5rbV9Z6/flybZvbX2y6palOSckV/PJ/M+cJanT8dqrW3WPxkWnFWXv7XGbWd3yPPkJJ9N8rtzpn2307y5YI3r2yZ5e5L3Jflqhzzf/HVu20RZvprklrPLpyXZZu5tnZ6vc9e4/oxZzt8ce1me0nI8e+yz51y+U5I/T3J2ku8keW2HPBcmuU+GF44vr+t5HCHLpJblKT1XU9rmzHnci5Pcbi23fW/kLFNbz69JcnyS/zvPz1Ud8kxt/nw9w15Pn0/yn0n+PsmBnbLMXc/PXeO2czrn6b3dmUyWWQbr1brznDPn8sfXuO3ckbOcu8b1bu8D55k3o3WszX633gyFa5U1d6e72ZhBkqS19v4khyZ5RFW9r6rulKTXp5vfrqqHzMn2q9baszO8wI2+y3OSs6rq2Kq6X1XtMfu5X1Udm+SckbMcleQzs12TPp/kfVX1h1V1fJKPj5xlle2qavGqK621f0nyp0k+kWT3MYNMbDlOhk94kySttYtba/+7DZ/aPzo3/PR1LD/IsL15Q5IfVdXuSVJVuyS5duQsU1uWp/RcTWmbs8o7ktx5LbedOGaQCa7n5yV5Q2vtWWv+JLli7DATnD8/ba39v621ByS5f4aCemxVfaeGw3jGtGcNx+X9Q5Ld5u5+mGS7tf3RJjSl7c6UsiTWq/W5tKp2nGU7ZNXEqrp9kl+OnGUy7wNnunSsLWG33ucleWdr7eo1pt81w64lL+kSbMiwX4b91e/ZRt5tYvb4N0+S1trP57ntDq21/xw5z80y7Kbw+CR3yLABvyTJh5O8vbU26kZ7tow8N8neSRbNsvxra+0TY+aYk+elGT6J+uwa0++T5H+31h7RKdd+6bgczzK8sbX2P3o89k0x22V0+9baz0Z+3Mksy1N6rqa2zZmyiaznD0pyUWvt4nluW9paO7NDrFWPv1/6z59z2jy79VXV3ZL8fmvtqBGzHLbGpA+31n48e0P/4tbaX46VZZZnStudyWRJNpv16h6ttdv2yjGfqrpFklu01v5rxMec1PvAXh1rsy+nU1dVlWSn1trajjPa1I9/pyQ/aa1dUcMAIEuTXNha+0qPPGyeei/HUzf71HXvJN9prV3ROQ6bgapamuSOGb5p/2Zr7cLOkazn69F7/kyt9MBC6L1ezaeqXthaO7Z3jq3VFllOq+rf28gHVM957Mow2EbLcBD8wzJ8an9hhgPPrxsxy5FJnpdhN5I3JHlZht3+DszwrcHYo4pOZt7M8jw0yf+TOW8Qk7yttfatMXOskelRSfbMMJDNijnT/6i19s8j5ti1tfbfc64/I8l9k3wlyT+1kTccVfXGJB9orX1+zMddm6o6trX2wtnlB2bYHfPbSe6a5HmttY+NmGVqz9Wk1vM19Xx9mD3+Q5L8XYbd6Q7IsE2+dYbjwp7ZWvveiFluk+EYxu9nGI/g5Ul+J8kFGY6N+/FYWdam8+v55OdPL1Nbz6vqiUk+21r7UVXtlmEdu0+SryX5n621S0bMMrV5s+Zy/JcZdgvvthxP5b3O7DHX/MCnMqzrr02SMd8rT23ZmWV6VJInZNj7qGVYjk5qrW2yw4Y2+3JaVeetOSnDNxhfT5LW2r1GznNskttm2Bf7J0m2T/KRJL+b5IettT8dMctXM3xTukOSFUl+o7V22WxXhf9ord1zrCyzPFOaN0cnuV2GEQafkOS7Sb6R5IUZNtbvGyvLnEyvS/KADAMnPDbJm1pr/zC7bfXIiCNlmTsS418leVCGAvaYJJe01l46VpZZhsuSXJRktwwjxb2rtdbrmME1589nMrz5ObuqfiPJe1trSztlmcJzNaX1fFKvD7NM5yR55GxbfJckb2ytPbGqHpHkz1prjxwxy8eSnJ/klhnGITg/yXsznBLp3q21x4+VZZZnUs/XBOfPZErGlNbzWZ6vtdbuPrv8ngyjnb4vycOT/MGYu0NOcN5MbTl+bZIHZgLvdWaPeVWSj2UYeGjV8cIvyTDSe0beXX5qy86bMmyD35HhkJhk+FDhDzPs8bNp8rROo2Mt1E+GY4f+Jck+GQaZWJLke7PLd+6Q5/zZv9sluTzJzWbXF626bcQs583+3TbJf+WGo3h+ZSufN+fPubwoyednl2/dY96sypRk0ezyrTJsLI+ZXT9n5CznzLl8dobjLlY9d6M+V3PzJNkryf/K8CJyYZJXJtm7Q565ozGetbZ5t5U+V1Nazyf1+jDLdN6cy9uusSyNOrpyZiNDZnhD9p/z3bY1P18TnD8fy3AO47ckWZ7hdCUPSvKqDN9kjJllMuv57HG/PufymtvkUZ+rCc6bc2f/TmU5nsx7ndlj3inDt5R/m2SH2bTvjJ1josvON9YyvbIJR7zf7Efrba09LsM5gY7L8AnQiiTXtNYuaq1d1CHStbNc1yT5Umvtl7Pr1yb51chZzq6qEzOcF+3TSU6oqj+oqrdn2NVlbFOaN9fNPoVOkj0yG5GsDZ889zpp9qLZvEgbjlt8bJJbVtX7Mv7I0zev4YTYByTZtrX201muazL+c5XMRvJrrX2ztfY3rbV7ZDhp9uIML2xj26eqzqvhXMJ7V9Wtk6Sqtsn4I1VO7bmazHo+wdeHJDmzqt5eVU/P8A338iSpqh1yw5ERx7DNbNm9Y5IdZ+MSrBp1usdo91N7viY1f5Ls0Vr7iwx7+OzVWvuT1tqprbW/ztpHgN5UJrOezyyvqlfVMBDk8qp6QrL68J0rR84ytXkzteV4Su910oYRlZ+c5AtJPlVVTx47wxxTW3ZWVtV955n+20lWbqoHHe1k35tSa+1DVfXJJH9TVc9Jn5VtlUurasfW2tWt/5DUz8kN912/X4aTQn89yZtHzpJMa968Nsk5NZwse58kL5hl2S3Jl0fOssq3q+ohbTZKW2vtV0meXVWvznBs7JguzfXDhv+oqnZvrf2g+pwqJZnnA4PW2nkZhsh/+fhxbnQqpp/O/r1Nkr8eOcuq09ok03iuprSeT+31IRnGAXhuhmMXT0my6viqluRRI2d5XYY9EJLkj5K8bTjkKb+V4RRFo5vY8zW1+bOqZOyUWclora3oVDImtZ5n2N35FZntAp7kpVX10wy7RD5z5CxTmzfzLcctyd3TZzme0nud1VprJ1XVKUmW5fpdWMc2tWXn8CRvqaqdcv08uWOGXY4P31QPutkfc7qmqrp3kvu31t7aO8tc1WFI6s1Fr3kz++b0NzKcWPiKMR97PjWxU//Mp/qdKmXHtsZQ5qxbr+dqbaawDZzq60NPs+WkWmvXVtWiJPtl2PXvB32TTeP5mtL8qaqnZXYcXIZvT1+Q4UONuyc5qrV23NiZ1jSR9XznDN/OXd4rw3x6zpuJLceTf68zNb3Xq1k5Xn06ttbapZvy8Tb73XrX1Fr7cib0/6qqHatq/yTbdShfO1fV0VV1YVX9qKour6oLZtNuNWaWdZnthnib9f7iwj/uj1prZ65ZTKtqn7GzzPL8PMPJzG81y7Gkqp5cVfcce2NdVfMOPNJa+1WPsrOuYtrj+aqqpVX1mar6l6q6Y1V9qqqurKov1XA+stFV1Q12J559Gr1DjyxrqmFY/p/2/nBuCq8PVTX30/CdZ7v4nldVJ1bV7cbOM1unV+1Kdm2S+/YqplV1s5p9NTlzmyS3qKpH98iTTGv+tNbeleEwlDu01j6Q5JAMe44s7VFMq2qb2aEMq567/TN8INajfK1+zWqtXTmFYjp7nXhiVT22qvbptQ2sqnutuRzP3vv0Wo5/vmYxraoXzm4bvZhO+b1yzw4xJ8OdkqxsrZ2V5L+TPLCq7rEpH3Oz3623bjwEdJL8ZVUtTsYdAnqWZ62nmKiqUU8xkWE0tn9PctCqTzlmn34cnmEUu1FP5rsen8xwUPoUdMlSc079U1VzT/1zVFWNfeqfc6rqu0nelWFk3B7HKG+oHs/XsRkGY7pVhuNUXtpae0RVHTy77f5jBanhmKr/L8n2NYwEe0S7fmj+TyYZe+TDeYfl77FNntrrw8xrk6wagv/vMuyW/dgkT0ryjxlGDx/FlJ6rmS8lOSjJj6vqz5I8McMx5f+jqh7cWht1F/4Jzp+01n616oOoWdk4M8mNTim1qdVwTOc/Zhi/4fkZRg7+aYZj8F/QWvvIWFlmJvOaVWs5XVRVjX66qJnJzJtkkuvV2t4rH5aR3ytPrEN0e1+62ZfTDPvLrzkE9LYZjsno4cA5l/8myRPanFNMZNzBW5a01v527oTZind0VT1rxBxJkqr6P2u7KcOb/NFMKcscz8ywe9a8p/7J9ccVjuG8WZ6nJflwDcfuvCvJu+cUn9FM8PnarrX2b0lSVX/bWnt/krTWPj3bgI/pfyd5VGvtqzUM5PCpqnpma+2M9Bnca0rb5Cllmc/S1tp+s8vHVNVhIz/+1ObPtu3606E8NcmDWms/r+HUX2dn/OPLJzV/JvZB1CuT3DvJzTOM0/DbrbWvV9WdMwxqNXY5ndJr1pty49NFPaCG00W9Pclop4uamdK8SSa2XmXt75X/tqr+aOQsU+oQSaf3pZPZ/XUj3CPDQn2LJK9vw/mIftxaO6qNeG6itbhla+3sJGmtfSfjj8R4UVX9+dxdxarqdlX1FxmG5x/bs5J8JclZa/ycmfEP9J5SllV+NdvV5YokP88wjPiq3Z7H1lprX2mtvaK1dtcMA7jcNsmpVfWFDnmm9nytrKpHVtVTkrS6fmTIh2T8EfVu1lr7apLMSvITMozM/cTMRjke2ZS2yVPKssptq+p/VNX/zDBC5dwPEMZ+TZ7a/PlJVa06//Z/ZxiNOxk+SO/xfmVq82fVB1G7ZRjR+FNVterN7OgfRLXWLm2tfTfJxa21VeeivSh9nqspvWZt21q7bHb54sxGUm6tfSrDcXtjm9K8Saa3Xk3tvfIqvTtE0ul96Wb/zWlr7eIkT66qx2fYUB/TOdI+NZxIvJIsqapbt9Z+XH1OMfHUJEcm+exspWtJfpjhXHK/N3KWZNhl6yuttRttDKtq2VacZZVVp/65Ra4/9c/Hkzws45/65wZvdFprX0zyxdkb6gePnCWZ3vP1/AxvFK/LMMLqC6rq+CT/meGFf0zXVNXtV+2ONPsG9eAkH03ymyNnmdQ2eUpZ5vinXP8NwQlJdk1y2Ww3snPHDDLB+fP8JO+sqi9nODf3mVX12ST3yrA79KgmOH9u8EFUVV2Q5IOzXe9G/yCqqrZprV2XYQTYVdO2TZ8Rlqf0mnVmDafs+3SSx6fv6aKSac2bKa5XU3qvPKUOkXR6X7pFjdY7W/GPSnK/1lqPN9CZ7dIy1w9aa7+sql2TPLi19sGR8+yTZM8kZ7Q5g8pU1SGttY+v/S83SZbbZDiouvvooVPKskoNI+jNPfXPfZM8PcMnr28e8xvUqnp6a+3EsR5vfab2fFXVi5N8qMOxQ/NleXiSy9ow2M/c6TsneVFr7TV9kk1jmzzFLHPNjiu6b4YPXz7ZMcck5s+s3Dwyyd4ZPkC/JMknWucR1acwf6rqzCSPaXNGyqyqPTP7IKq1NtpukVX120nOb62tXGP6kiQPbK39y1hZZo87mdesGo4Jfm6G3SG/nOSf23Cs8M2T3LaNfM7eKc2bNU1kvbpfkgtba1fO8hyZYRf5ryZ5bWtttPPkztMhvt9au6Zjh+jyvnSLKqdTVVW7tA4jx83eQP9xkgsyDBv+p621k2a3nd1aG3WgFDZvvZbjKaqqKzMM/vHtDMfuvG/OblzdVdVtm9NWTVJVfbG1dt/Z5edkOD/jhzIUso+01o7umY9167kdnPIHUazb1LbJXs+vV1VfTXLvNpxm57gMr+0fSHLwbPqTugbcCm32x5xW1dlV9VdVNfrua/OpYejpXWeXl1bVd5L8R1VdNDsebUzPTXJAa+0JGUZA/F9V9aeroo6cJVV1+6p6S1W9uap2qaplVXV+Vb23qnYfOcukTucwyzGZZXliy/Gklp2Z72TYI+FvMozG+LWq+nhVHVbDyapHU1W3WeNnlwy7bN169o3zqNZYt25VVW/rtW5NKcscc3fNel6SR8yOs3pkkj8YM8ha1qvzeq1XNZw24VVV9dUaTs10WVWdUVWHj51llme+7eAZvbaDrbVT1iyms+lXjl1Mp7ZNntKyM8Ft8tRez6e2Xd6mzU6zk2GQupe21k6bbZd/o0OeeVXVv/XOMNemzLPZl9Mkt84wWudnquqLVfXSqtqjY55D2/XDub8+yVNnB6A/IsPQ4mPadtWuvG0Yke2gJI+uqjemzyiex2fYR/17ST6T4eDqQ5OcmmTsk6zPPX5p7ukcvpRhePweprQsT2k5Tqa17CTDABPXtdY+2Vp7doZzDx6b4byD3xk5y3/nxoNE3SHD6KZnjpwlueG69YYkl6bfujWlLKtsM3uTukuGvZcuS1YPMHHtuv90wR2fG69Xj0m/9eqdGdafR2XY1e//ZBgt8qFVNfoxp5l/O7hXOm0Hp/QBZqa3TZ7SsjO1bfLUXs+ntl3+Sl1/BosvV9XSJKmqvZNcM2aQqtp/LT8HZNgDclTd8rTWNuufJGfPufygDG8QL82wsTyiQ54LkyyaXT5jjdvOHznLvyfZb41pi5K8I8MIXGPPm3PmXL54jdvO7bjcnNszy1oydV2Wp7QcT23ZWTPPPLfdfOQsL8tw3sx950z77tjzZM5jT2bdmlKWOY+7IsOb6O/O/r39bPqOHebPOXMuT2G9+vIa1780+3ebDMeEjZ1natvB72Z4M39xki8meWmSPcbOYdlZb5apbZOnthxParucZOcMH7Z8O8PpUa6ZbZs/m2G33jGz/CrDe/fPzPPz8w7zpkuezX603rlaa6dmGBr7TzJ8IvTUDMOtj+nNST5Ww3nZPl5Vb0rywQz7rp87cpY/zBqfxLdh14U/rKoen07N/ab+Heu4bQy3reFE0JXZ6RzabE3skOVGJrAsT2k5Tqa17CTD8zGvNgy7PprW2huq6t0ZzpP5vQznH+w5mMCU1q0pZUmStNaWrOWm65I8ccQoyfTWq59W1QNba6dV1WOT/ChJWmvXVVWPvX2mth38cWvtZUleVlUPynDeyrNrGLX3Xa21MV8jLDtrMcFt8tSW40ltl9sw4NHhNRyS8xuZDcTWWvvh2FkyjBHzvNbaN9e8YbYsbRV5toRy+o01J7TWfpXhU6tRR6OdPfY/VNX5SV6Q60cb3DvJvyZ59chZLlnHbZ8fM8vMSVW1Y2vt6tbaX62aWFV3zTzP4yY2mdM5zDGZZXlKy/HMlJadtNZGf8x1ma3rT5m9KftUhhNm9zJ33To+fdetKa7n82rDSNTfHflhJ7VeZdje/NNsd7qvZHaKkqraLcMb7FFNcDu42gQ+wJzasvP8JG+b0LKzapv8uHTeJk9wOZ7kdrm1dlWG0ZV7Wpa1F/Q/GTHHKsvSIc8WMVpvVd03wzFgX6qqu2c47uvC1trHOmS5WZLfzzD88ylV9QdJfifDsRnHtdZG3X99ymoip1CYk+cdrbU/7J1jld7zp4bTEN0hyX+0zqchWlPveTM1a2wD981wbr2ze2wDZ3numuFbwD0z7L3xzQzf7Iw2JP/aTG0976kmdEqk+UxtPZ99W3nfDLtC9tgmv7u19vtjP+58ajj9xgWttZ/UcIqUVaff+FpGPv3GnDxzTwfyF73yzPM+8JlJnpVhBNgu7wO9nm8+JtZp1lzPX57kPtnE69VmX06r6pVJHp3hk6BPJblfhhMePzzDudHGHsHunbMsOyS5IsOJaz+UYfeJaq0dNmaeKakbnkLhuRlOc9PlFApV9eF5Jj8sw771aa09bqwsq0xs/kzqNERTmjdTM8828L4ZjpXptQ18cYZBdT6X5HczfBL+4wxl9YWtteUjZpncej4lNbFTItXETrMzT54/zvBt0+S2O1X1rNba/x3x8dY8/cbPMpwHscvpN6aUZ2rvAyf+et59PZ+SCXaaPutV20QHs471k+T8JNtm2Aj8JMktZ9NvnuS8DnnOm/27KMkPM4yYmwz71o+eZ0o/ueEACl9Kstvs8i0y/mBR5yT5lwwjGD9k9u8PZpcfYv7k/CQ7zi4vyTDC4J+umXNrnDdT+5ngNvD8Odu9HZIsn12+09jLzhTX8yn9zObPNhneFL49yWUZDiE4LMlOPfLMudx9PZ9anvVkvXjkx7tgzuWz17jt3A7//8nkmdr7QK/nm8/PBF/Pu6xX3Qd+WQDXttZ+1Ybjdb7dWvtJsnpQkus65NlmtkvHThkWrp1n07fPDc9vtzWa0ikUDsgwxPsrklzZhm9zft5a+2xr7bMjZ1llSvNnaqchmtK8mZqpbQOT68cz2D6zY4taaxdn/G3gFNfzKWltOqdESqa3nk8qTw3ngpzv5/wkY58fcjKn35hgnqm9D/R6vvmY2ut5l/VqSxgQ6ZdVtcPsiTxg1cSq2jl9nsi3Zxi2e9sMb4jeV8MJjw9M8u4OeaZk5wxvFCtJq6rbt9YuraodM/IGsrV2XYaR9N43+/eH6b8+TGb+JLm0qvZrrZ2bJK21q6vqMUn+Ocm+I2dJpjVvpmZq28C3JflSVZ2R5MFJ/naWZ7fMRtAcy0TX8ym5wbrThmPhPpzkw7Pji8Y2tfV8anlul+E8nj9eY3ol+cLIWZ6T5O+r6q8ynNfz9BpG7/ze7LaxTSnP1N4Hej3ffEzt9bzLerUlHHO6fWvtF/NM3zXJ7q218ztk2iNJWmvfr6pbZdhX/OLW2hfHzrI5mA1ecLvW2tgjVc7NcGiSB7TW/rJXhrXpMX+qas8Mn+BdOs9tD2h9Rnu+kSksO71NdBt4jyS/lWGAiwvHfvy1mfJ63kNV7d0mNvL0fKa2nvfKU1VvT/J/W2unzXPbia21p4+ZZ/a4Uzj9xuTyTOl9oNfzzccUX89njz/qerXZl1MAAAA2f1vCMacAAABs5pRTAAAAulNOAQAA6E45BQAAoLv/H9eXreJCfYc3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1152x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df1= df.head(25)\n",
    "df1.plot(kind='bar', figsize=(16,10))\n",
    "plt.grid(which='major', linestyle='-',linewidth='0.5', color='green')\n",
    "plt.grid(which='minor', linestyle=':',linewidth='0.5', color='black')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "12ea90d0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.09929610244878505"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#We then compare this prediction (output) to the test_y values and Calculate the error difference \n",
    "#between predicted value and actual value\n",
    "np.mean((prediction2-test_y)**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "c4b7f132",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Import metrics library\n",
    "from sklearn import metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "8427199f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.22268310786042972\n"
     ]
    }
   ],
   "source": [
    "#Print results of MAE\n",
    "print(metrics.mean_absolute_error(test_y, prediction2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "4d24e313",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.09929610244878473\n"
     ]
    }
   ],
   "source": [
    "#Print results of MSE\n",
    "print(metrics.mean_squared_error(test_y, prediction2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "591c344c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.315112840818626\n"
     ]
    }
   ],
   "source": [
    "#Print results of RMSE\n",
    "print(np.sqrt(metrics.mean_squared_error(test_y, prediction2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "bdf680cd",
   "metadata": {},
   "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>actual</th>\n",
       "      <th>prediction</th>\n",
       "      <th>diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>37443</th>\n",
       "      <td>-2.288889</td>\n",
       "      <td>-2.287027</td>\n",
       "      <td>-0.001862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86534</th>\n",
       "      <td>8.861111</td>\n",
       "      <td>9.088317</td>\n",
       "      <td>-0.227206</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2082</th>\n",
       "      <td>9.805556</td>\n",
       "      <td>9.541017</td>\n",
       "      <td>0.264538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53130</th>\n",
       "      <td>27.222222</td>\n",
       "      <td>27.298607</td>\n",
       "      <td>-0.076385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45196</th>\n",
       "      <td>17.705556</td>\n",
       "      <td>17.728459</td>\n",
       "      <td>-0.022903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55387</th>\n",
       "      <td>-10.066667</td>\n",
       "      <td>-9.846082</td>\n",
       "      <td>-0.220585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25976</th>\n",
       "      <td>9.972222</td>\n",
       "      <td>9.696124</td>\n",
       "      <td>0.276098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32423</th>\n",
       "      <td>12.777778</td>\n",
       "      <td>13.189386</td>\n",
       "      <td>-0.411608</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26570</th>\n",
       "      <td>15.277778</td>\n",
       "      <td>15.234434</td>\n",
       "      <td>0.043343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45834</th>\n",
       "      <td>2.200000</td>\n",
       "      <td>3.163678</td>\n",
       "      <td>-0.963678</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>19291 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          actual  prediction      diff\n",
       "37443  -2.288889   -2.287027 -0.001862\n",
       "86534   8.861111    9.088317 -0.227206\n",
       "2082    9.805556    9.541017  0.264538\n",
       "53130  27.222222   27.298607 -0.076385\n",
       "45196  17.705556   17.728459 -0.022903\n",
       "...          ...         ...       ...\n",
       "55387 -10.066667   -9.846082 -0.220585\n",
       "25976   9.972222    9.696124  0.276098\n",
       "32423  12.777778   13.189386 -0.411608\n",
       "26570  15.277778   15.234434  0.043343\n",
       "45834   2.200000    3.163678 -0.963678\n",
       "\n",
       "[19291 rows x 3 columns]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Now look at the difference between predicted and actual\n",
    "pd.DataFrame({'actual':test_y,\n",
    "             'prediction':prediction2,\n",
    "             'diff':(test_y-prediction2)})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e0be4a81",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_python3",
   "language": "python",
   "name": "conda_python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}