{ "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+00HQZEAgAAtmp77rlnLrnkklx6xaX5yeKf9I6z2hUr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\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 }