{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "### **Importing the libraries**" ], "metadata": { "id": "rDFn6pi7D7Jk" } }, { "cell_type": "code", "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "metadata": { "id": "nGZJJWqfEKoy" }, "execution_count": 51, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Importing the dataset" ], "metadata": { "id": "18RFDOyuEhDc" } }, { "cell_type": "code", "source": [ "dataset=pd.read_csv('Bengaluru_House_Data.csv')\n", "dataset.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "o9F-OnzNEk4P", "outputId": "bfb5445e-c3f1-4883-f251-2ff56d1454a8" }, "execution_count": 52, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(13320, 9)" ] }, "metadata": {}, "execution_count": 52 } ] }, { "cell_type": "code", "source": [ "dataset=dataset.drop(['area_type','society','balcony','availability'],axis='columns')\n", "dataset.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "zqiJVjzDFHv0", "outputId": "f0b346b6-85bd-4c5d-888b-b8ffc84f9446" }, "execution_count": 53, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price\n", "0 Electronic City Phase II 2 BHK 1056 2.0 39.07\n", "1 Chikka Tirupathi 4 Bedroom 2600 5.0 120.00\n", "2 Uttarahalli 3 BHK 1440 2.0 62.00\n", "3 Lingadheeranahalli 3 BHK 1521 3.0 95.00\n", "4 Kothanur 2 BHK 1200 2.0 51.00" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathprice
0Electronic City Phase II2 BHK10562.039.07
1Chikka Tirupathi4 Bedroom26005.0120.00
2Uttarahalli3 BHK14402.062.00
3Lingadheeranahalli3 BHK15213.095.00
4Kothanur2 BHK12002.051.00
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 13320,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1305,\n \"samples\": [\n \"Ashok Nagar\",\n \"Maruthi Nagar\",\n \"CQAL Layout\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 31,\n \"samples\": [\n \"8 BHK\",\n \"5 Bedroom\",\n \"19 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2117,\n \"samples\": [\n \"5270\",\n \"832\",\n \"1145\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.3414580781243859,\n \"min\": 1.0,\n \"max\": 40.0,\n \"num_unique_values\": 19,\n \"samples\": [\n 2.0,\n 1.0,\n 14.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 148.97167376967403,\n \"min\": 8.0,\n \"max\": 3600.0,\n \"num_unique_values\": 1994,\n \"samples\": [\n 93.25,\n 33.645,\n 62.55\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 53 } ] }, { "cell_type": "markdown", "source": [ "# Data Preprocessing" ], "metadata": { "id": "31NmI8KSFz5C" } }, { "cell_type": "code", "source": [ "dataset.isnull().sum()\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ax5GQuqrF3IR", "outputId": "2a553a9a-8412-4137-bcb5-3f2d9437aeff" }, "execution_count": 54, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "location 1\n", "size 16\n", "total_sqft 0\n", "bath 73\n", "price 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 54 } ] }, { "cell_type": "code", "source": [ "dataset=dataset.dropna()\n", "dataset.isnull().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "j3HEv734GKiu", "outputId": "285bef86-a0f2-4e78-dd1c-1c0323761dcd" }, "execution_count": 55, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "location 0\n", "size 0\n", "total_sqft 0\n", "bath 0\n", "price 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 55 } ] }, { "cell_type": "code", "source": [ "dataset.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ed3sO0ZLGSOh", "outputId": "7927dd35-3d24-4e0a-91af-c6b3aad35786" }, "execution_count": 56, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(13246, 5)" ] }, "metadata": {}, "execution_count": 56 } ] }, { "cell_type": "code", "source": [ "dataset['size'].unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4VO931jsGggb", "outputId": "e6c8d109-2f1e-424a-9029-c74f4aa11630" }, "execution_count": 57, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['2 BHK', '4 Bedroom', '3 BHK', '4 BHK', '6 Bedroom', '3 Bedroom',\n", " '1 BHK', '1 RK', '1 Bedroom', '8 Bedroom', '2 Bedroom',\n", " '7 Bedroom', '5 BHK', '7 BHK', '6 BHK', '5 Bedroom', '11 BHK',\n", " '9 BHK', '9 Bedroom', '27 BHK', '10 Bedroom', '11 Bedroom',\n", " '10 BHK', '19 BHK', '16 BHK', '43 Bedroom', '14 BHK', '8 BHK',\n", " '12 Bedroom', '13 BHK', '18 Bedroom'], dtype=object)" ] }, "metadata": {}, "execution_count": 57 } ] }, { "cell_type": "code", "source": [ "dataset['bhk'] = dataset['size'].apply(lambda x: int(x.split(' ')[0]))" ], "metadata": { "id": "lFY-MR7hHCfi" }, "execution_count": 58, "outputs": [] }, { "cell_type": "code", "source": [ "dataset.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "a3eSMJ1tHd5k", "outputId": "39ebc2a3-369d-4f63-cdb8-34655391b9fe" }, "execution_count": 59, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk\n", "0 Electronic City Phase II 2 BHK 1056 2.0 39.07 2\n", "1 Chikka Tirupathi 4 Bedroom 2600 5.0 120.00 4\n", "2 Uttarahalli 3 BHK 1440 2.0 62.00 3\n", "3 Lingadheeranahalli 3 BHK 1521 3.0 95.00 3\n", "4 Kothanur 2 BHK 1200 2.0 51.00 2" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhk
0Electronic City Phase II2 BHK10562.039.072
1Chikka Tirupathi4 Bedroom26005.0120.004
2Uttarahalli3 BHK14402.062.003
3Lingadheeranahalli3 BHK15213.095.003
4Kothanur2 BHK12002.051.002
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 13246,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1304,\n \"samples\": [\n \"Gollarahatti\",\n \"Maruthi Nagar\",\n \"Venugopal Reddy Layout\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 31,\n \"samples\": [\n \"8 BHK\",\n \"5 Bedroom\",\n \"19 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2067,\n \"samples\": [\n \"525\",\n \"1093\",\n \"502\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.3415060582158718,\n \"min\": 1.0,\n \"max\": 40.0,\n \"num_unique_values\": 19,\n \"samples\": [\n 2.0,\n 1.0,\n 14.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 149.0765868547877,\n \"min\": 8.0,\n \"max\": 3600.0,\n \"num_unique_values\": 1955,\n \"samples\": [\n 61.36,\n 48.4,\n 64.4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 43,\n \"num_unique_values\": 19,\n \"samples\": [\n 2,\n 8,\n 10\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 59 } ] }, { "cell_type": "code", "source": [ "dataset.total_sqft.unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "lcRCFcHJH07j", "outputId": "3c63a664-210a-442c-aa63-c987a0a523b6" }, "execution_count": 60, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['1056', '2600', '1440', ..., '1133 - 1384', '774', '4689'],\n", " dtype=object)" ] }, "metadata": {}, "execution_count": 60 } ] }, { "cell_type": "code", "source": [ "def is_float(x):\n", " try:\n", " float(x)\n", " except:\n", " return False\n", " return True" ], "metadata": { "id": "FCvXdV_uIFe_" }, "execution_count": 61, "outputs": [] }, { "cell_type": "code", "source": [ "dataset[~dataset['total_sqft'].apply(is_float)].head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "0lgm-z1BIVYF", "outputId": "d91a1ee7-654a-42ef-f21c-f2e01c155d8d" }, "execution_count": 62, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk\n", "30 Yelahanka 4 BHK 2100 - 2850 4.0 186.000 4\n", "122 Hebbal 4 BHK 3067 - 8156 4.0 477.000 4\n", "137 8th Phase JP Nagar 2 BHK 1042 - 1105 2.0 54.005 2\n", "165 Sarjapur 2 BHK 1145 - 1340 2.0 43.490 2\n", "188 KR Puram 2 BHK 1015 - 1540 2.0 56.800 2" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhk
30Yelahanka4 BHK2100 - 28504.0186.0004
122Hebbal4 BHK3067 - 81564.0477.0004
1378th Phase JP Nagar2 BHK1042 - 11052.054.0052
165Sarjapur2 BHK1145 - 13402.043.4902
188KR Puram2 BHK1015 - 15402.056.8002
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataset[~dataset['total_sqft']\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Hebbal\",\n \"KR Puram\",\n \"8th Phase JP Nagar\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"2 BHK\",\n \"4 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"3067 - 8156\",\n \"1015 - 1540\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.0954451150103321,\n \"min\": 2.0,\n \"max\": 4.0,\n \"num_unique_values\": 2,\n \"samples\": [\n 2.0,\n 4.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 184.77346719699773,\n \"min\": 43.49,\n \"max\": 477.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 477.0,\n 56.8\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 2,\n \"max\": 4,\n \"num_unique_values\": 2,\n \"samples\": [\n 2,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 62 } ] }, { "cell_type": "code", "source": [ "def convert_sqft_to_num(x):\n", " tokens = x.split('-')\n", " if len(tokens) == 2:\n", " return (float(tokens[0])+float(tokens[1]))/2\n", " try:\n", " return float(x)\n", " except:\n", " return None" ], "metadata": { "id": "K9J4A5UaIyIH" }, "execution_count": 63, "outputs": [] }, { "cell_type": "code", "source": [ "dataset=dataset.copy()\n", "dataset['total_sqft'] = dataset['total_sqft'].apply(convert_sqft_to_num)\n", "dataset.head(3)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 143 }, "id": "emKsB1EuJRP1", "outputId": "7c85b774-903a-44b7-cabc-03b85d5b52e1" }, "execution_count": 64, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk\n", "0 Electronic City Phase II 2 BHK 1056.0 2.0 39.07 2\n", "1 Chikka Tirupathi 4 Bedroom 2600.0 5.0 120.00 4\n", "2 Uttarahalli 3 BHK 1440.0 2.0 62.00 3" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhk
0Electronic City Phase II2 BHK1056.02.039.072
1Chikka Tirupathi4 Bedroom2600.05.0120.004
2Uttarahalli3 BHK1440.02.062.003
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 13246,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1304,\n \"samples\": [\n \"Gollarahatti\",\n \"Maruthi Nagar\",\n \"Venugopal Reddy Layout\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 31,\n \"samples\": [\n \"8 BHK\",\n \"5 Bedroom\",\n \"19 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1237.3234454015146,\n \"min\": 1.0,\n \"max\": 52272.0,\n \"num_unique_values\": 1972,\n \"samples\": [\n 1041.0,\n 3042.0,\n 616.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.3415060582158718,\n \"min\": 1.0,\n \"max\": 40.0,\n \"num_unique_values\": 19,\n \"samples\": [\n 2.0,\n 1.0,\n 14.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 149.0765868547877,\n \"min\": 8.0,\n \"max\": 3600.0,\n \"num_unique_values\": 1955,\n \"samples\": [\n 61.36,\n 48.4,\n 64.4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 43,\n \"num_unique_values\": 19,\n \"samples\": [\n 2,\n 8,\n 10\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 64 } ] }, { "cell_type": "code", "source": [ "dataset.loc[30]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7crzfpJrJ0zN", "outputId": "34a285bf-a933-4b1f-9c38-5e654606e5cc" }, "execution_count": 65, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "location Yelahanka\n", "size 4 BHK\n", "total_sqft 2475.0\n", "bath 4.0\n", "price 186.0\n", "bhk 4\n", "Name: 30, dtype: object" ] }, "metadata": {}, "execution_count": 65 } ] }, { "cell_type": "code", "source": [ "dataset['price_per_sqft'] = dataset['price']*100000/dataset['total_sqft']\n", "dataset.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "M1B2dcgsLuXu", "outputId": "e2d0271b-4026-4dd8-9719-6fad76c3c931" }, "execution_count": 66, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk \\\n", "0 Electronic City Phase II 2 BHK 1056.0 2.0 39.07 2 \n", "1 Chikka Tirupathi 4 Bedroom 2600.0 5.0 120.00 4 \n", "2 Uttarahalli 3 BHK 1440.0 2.0 62.00 3 \n", "3 Lingadheeranahalli 3 BHK 1521.0 3.0 95.00 3 \n", "4 Kothanur 2 BHK 1200.0 2.0 51.00 2 \n", "\n", " price_per_sqft \n", "0 3699.810606 \n", "1 4615.384615 \n", "2 4305.555556 \n", "3 6245.890861 \n", "4 4250.000000 " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhkprice_per_sqft
0Electronic City Phase II2 BHK1056.02.039.0723699.810606
1Chikka Tirupathi4 Bedroom2600.05.0120.0044615.384615
2Uttarahalli3 BHK1440.02.062.0034305.555556
3Lingadheeranahalli3 BHK1521.03.095.0036245.890861
4Kothanur2 BHK1200.02.051.0024250.000000
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 13246,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1304,\n \"samples\": [\n \"Gollarahatti\",\n \"Maruthi Nagar\",\n \"Venugopal Reddy Layout\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 31,\n \"samples\": [\n \"8 BHK\",\n \"5 Bedroom\",\n \"19 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1237.3234454015146,\n \"min\": 1.0,\n \"max\": 52272.0,\n \"num_unique_values\": 1972,\n \"samples\": [\n 1041.0,\n 3042.0,\n 616.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.3415060582158718,\n \"min\": 1.0,\n \"max\": 40.0,\n \"num_unique_values\": 19,\n \"samples\": [\n 2.0,\n 1.0,\n 14.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 149.0765868547877,\n \"min\": 8.0,\n \"max\": 3600.0,\n \"num_unique_values\": 1955,\n \"samples\": [\n 61.36,\n 48.4,\n 64.4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 43,\n \"num_unique_values\": 19,\n \"samples\": [\n 2,\n 8,\n 10\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_per_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 106727.155209311,\n \"min\": 267.82981328435875,\n \"max\": 12000000.0,\n \"num_unique_values\": 7537,\n \"samples\": [\n 6133.1338818249815,\n 3913.0434782608695,\n 3181.818181818182\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 66 } ] }, { "cell_type": "markdown", "source": [ "## **Feature** **Scaling**" ], "metadata": { "id": "UWkg-SFcLU5H" } }, { "cell_type": "code", "source": [ "dataset.location = dataset.location.apply(lambda x: x.strip())\n", "\n", "location_stats = dataset.groupby('location')['location'].agg('count').sort_values(ascending=False)\n", "location_stats\n", "\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yngAoNWqMpXQ", "outputId": "2263338b-2840-4cc9-b876-f1e243384ea7" }, "execution_count": 67, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "location\n", "Whitefield 535\n", "Sarjapur Road 392\n", "Electronic City 304\n", "Kanakpura Road 266\n", "Thanisandra 236\n", " ... \n", "1 Giri Nagar 1\n", "Kanakapura Road, 1\n", "Kanakapura main Road 1\n", "Karnataka Shabarimala 1\n", "whitefiled 1\n", "Name: location, Length: 1293, dtype: int64" ] }, "metadata": {}, "execution_count": 67 } ] }, { "cell_type": "code", "source": [ "location_stats_less_than_10 = location_stats[location_stats<=10]\n", "location_stats_less_than_10\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xVb_zMTGNSSo", "outputId": "aef5008a-f627-44ff-afb7-63bd041ec0ef" }, "execution_count": 68, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "location\n", "Basapura 10\n", "1st Block Koramangala 10\n", "Gunjur Palya 10\n", "Kalkere 10\n", "Sector 1 HSR Layout 10\n", " ..\n", "1 Giri Nagar 1\n", "Kanakapura Road, 1\n", "Kanakapura main Road 1\n", "Karnataka Shabarimala 1\n", "whitefiled 1\n", "Name: location, Length: 1052, dtype: int64" ] }, "metadata": {}, "execution_count": 68 } ] }, { "cell_type": "code", "source": [ "dataset.location = dataset.location.apply(lambda x: 'other' if x in location_stats_less_than_10 else x)\n", "len(dataset.location.unique())" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IEjwlyu7NtQJ", "outputId": "3c38fb70-a6e0-4563-ec1c-e7e4438b48df" }, "execution_count": 69, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "242" ] }, "metadata": {}, "execution_count": 69 } ] }, { "cell_type": "markdown", "source": [ "## **Outlier** **Removal**" ], "metadata": { "id": "Q9cAmEn4RIn3" } }, { "cell_type": "code", "source": [ "dataset=dataset[~(dataset.total_sqft/dataset.bhk<300)]\n", "dataset.shape\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5b8IXQsGROeS", "outputId": "2fd47e4f-6ae9-4704-c7fd-93eb655d678d" }, "execution_count": 70, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(12502, 7)" ] }, "metadata": {}, "execution_count": 70 } ] }, { "cell_type": "code", "source": [ "dataset.price_per_sqft.describe()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KS5XOdy9R737", "outputId": "fb0cdeae-29bd-40fd-fc03-e296937ed7da" }, "execution_count": 71, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "count 12456.000000\n", "mean 6308.502826\n", "std 4168.127339\n", "min 267.829813\n", "25% 4210.526316\n", "50% 5294.117647\n", "75% 6916.666667\n", "max 176470.588235\n", "Name: price_per_sqft, dtype: float64" ] }, "metadata": {}, "execution_count": 71 } ] }, { "cell_type": "code", "source": [ "def remove_pps_outliers(df):\n", " df_out = pd.DataFrame()\n", " for key, subdf in df.groupby('location'):\n", " m=np.mean(subdf.price_per_sqft)\n", " st=np.std(subdf.price_per_sqft)\n", " reduced_df = subdf[(subdf.price_per_sqft>(m-st)) & (subdf.price_per_sqft<=(m+st))]\n", " df_out = pd.concat([df_out,reduced_df] ,ignore_index=True)\n", " return df_out\n", "\n", "\n", "dataset = remove_pps_outliers(dataset)\n", "dataset.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Rwr9dXvHSGG8", "outputId": "d7a12dc3-1252-42f9-f2de-190d5eb70153" }, "execution_count": 72, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(10241, 7)" ] }, "metadata": {}, "execution_count": 72 } ] }, { "cell_type": "code", "source": [ "def plot_scatter_chart(df,location):\n", " bhk2 = df[(df.location==location) & (df.bhk==2)]\n", " bhk3 = df[(df.location==location) & (df.bhk==3)]\n", " plt.rcParams['figure.figsize'] =(15,10)\n", " plt.scatter(bhk2.total_sqft, bhk2.price,color='blue',label=' 2 BHK',s=50)\n", " plt.scatter(bhk3.total_sqft, bhk3.price,marker='+',color='green',label=' 3 BHK',s=50)\n", " plt.xlabel(\"Total Square Foot Area\")\n", " plt.ylabel(\"Price Per Square Feet\")\n", " plt.title(location)\n", " plt.legend()\n", "\n", "plot_scatter_chart(dataset,'Hebbal')\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 872 }, "id": "qoZDeVi6TfH_", "outputId": "12d4806c-1859-4993-ed22-c841162b2eea" }, "execution_count": 73, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABNYAAANXCAYAAAD5PtJMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB8OUlEQVR4nOzde3jcZZ03/vekaUuZkpQibalUrKJCBZQFF2oBD6AcVJCyqyiP4C7KFgquVFyoB6CuWg884OGhZdX9Ae6q66IcxFUUD9QWKgqKcnAREAWBplWkIUNpc5jfH2PTpsdkmmQmyet1XXPle7hn5jNhjPrmc993oVwulwMAAAAA9ElDrQsAAAAAgKFIsAYAAAAAVRCsAQAAAEAVBGsAAAAAUAXBGgAAAABUQbAGAAAAAFUQrAEAAABAFQRrAAAAAFAFwRoAAAAAVEGwBgAwAr361a/Ofvvtt91xt9xySwqFQr7xjW/023tffPHFKRQK/fZ6AAC1IlgDAKhjV111VQqFQu64444t3u9tQAYAQP8TrAEAAABAFQRrAAAAAFAFwRoAwDDzn//5nznooIMybty4TJw4MSeffHIeffTRLY69884788pXvjLjxo3L9OnTc8UVV2xxXGdnZz7wgQ9kypQpKRaLOf744zd7zaVLl+bv//7v87znPS9jx47NtGnTcu6552bNmjX9/hkBAOpBY60LAABg+1avXp0//elPm11vb2/vcf6xj30sH/7wh/OWt7wl73rXu7Jq1ap8/vOfzxFHHJFf/vKXmTBhQvfYv/zlLznuuOPylre8JW9729vy3//93znzzDMzZsyY/OM//uNmr1soFHL++edn5cqV+cxnPpOjjjoqd911V8aNG5ckueaaa/LMM8/kzDPPzG677Zaf/exn+fznP58//vGPueaaa/r/lwIAUGOCNQCAIeCoo47a6r2XvvSlSZI//OEPueiii/LRj340H/jAB7rvz549OwceeGAWLVrU4/rjjz+e//t//2/mzZuXJPmnf/qnHHLIIZk/f37e8Y53ZPTo0d1jn3zyyfzmN7/JLrvskiT5m7/5m7zlLW/JF7/4xbznPe9Jknzyk5/sDtmS5Iwzzsjee++dD3zgA3nkkUfyvOc9rx9+EwAA9cNUUACAIeDyyy/PzTffvNnjgAMO6B5z7bXXpqurK295y1vypz/9qfsxZcqUvOhFL8qPf/zjHq/Z2NiYf/qnf+o+HzNmTP7pn/4pK1euzJ133tlj7KmnntodqiXJ3/3d32WPPfbId77zne5rG4dqpVIpf/rTn/LKV74y5XI5v/zlL/vtdwEAUC90rAEADAF/+7d/m4MPPniz67vuumv3FNEHHngg5XI5L3rRi7b4Ght3oCXJ1KlTUywWe1x78YtfnCT5/e9/n0MPPbT7+qavWSgUsvfee+f3v/9997VHHnkkF154Yb71rW/lL3/5S4/xq1ev3s4nBAAYegRrAADDRFdXVwqFQr773e9m1KhRm90fP378gL13Z2dnXve61+XJJ5/M+eefn3322SfFYjGPPfZY3vnOd6arq2vA3hsAoFYEawAAw8QLX/jClMvlTJ8+vbvzbFsef/zxlEqlHl1rv/3tb5Mkz3/+83uMfeCBB3qcl8vlPPjgg91TUe++++789re/zdVXX51TTz21e9zNN99c7ccBAKh71lgDABgmZs+enVGjRmXBggUpl8s97pXL5fz5z3/uca2joyP/9m//1n2+bt26/Nu//Vt23333HHTQQT3GfvnLX87TTz/dff6Nb3wjTzzxRI499tgk6e6Q2/h9y+VyPvvZz/bPhwMAqEM61gAAhokXvvCF+ehHP5r58+fn97//fd785jdnl112ycMPP5zrrrsuZ5xxRs4777zu8VOnTs0nP/nJ/P73v8+LX/zifP3rX89dd92VL3zhC5utxzZx4sQcdthh+Yd/+Ie0tLTkM5/5TPbee++8+93vTpLss88+eeELX5jzzjsvjz32WJqamvLNb35zs7XWAACGE8EaAMAwcsEFF+TFL35xLrvssixYsCBJMm3atLz+9a/P8ccf32PsrrvumquvvjrnnHNOvvjFL2by5Mn5f//v/3WHZRv7wAc+kF//+tdZuHBhnn766Rx55JFZtGhRdt555ySVjRFuvPHGvOc978nChQuz00475cQTT8zZZ5+dl73sZQP/wQEAaqBQ3nSeAAAAAACwXdZYAwAAAIAqCNYAAAAAoAqCNQAAAACogmANAAAAAKogWAMAAACAKgjWAAAAAKAKjbUuoB50dXXl8ccfzy677JJCoVDrcgAAAACokXK5nKeffjpTp05NQ8O2e9IEa0kef/zxTJs2rdZlAAAAAFAnHn300ey5557bHCNYS7LLLrskqfzCmpqaalwNAAAAALXS2tqaadOmdedF2yJYS7qnfzY1NQnWAAAAAOjVcmE2LwAAAACAKgjWAAAAAKAKgjUAAAAAqII11nqps7Mz7e3ttS5jRBk1alQaGxt7NacZAAAAYLAJ1nqhra0tf/zjH1Mul2tdyoiz8847Z4899siYMWNqXQoAAABAD4K17ejs7Mwf//jH7Lzzztl99911Tw2ScrmcdevWZdWqVXn44Yfzohe9KA0NZi4DAAAA9UOwth3t7e0pl8vZfffdM27cuFqXM6KMGzcuo0ePzh/+8IesW7cuO+20U61LAgAAAOimBaiXdKrVhi41AAAAoF5JLQAAAACgCoI1AAAAAKiCYA0AAAAAqiBYG0Rr1iQtLZWfg+2WW27JCSeckD322CPFYjEvf/nL85WvfGWbz/n973+fQqHQ/RgzZkz23nvvfPSjH025XO4ed/HFF+flL3/5Vp9/1113bfE8SZ5++um85jWvyYwZM/LHP/6xPz4qAAAAwKAQrA2CZcuS2bOT8eOTKVMqP2fPTm69dfBquO2223LAAQfkm9/8Zn7961/nH/7hH3Lqqafm29/+9naf+4Mf/CBPPPFEHnjggSxYsCAf+9jH8v/9f//fDte0atWqvOY1r0mpVMrSpUuz55577vBrAgAAAAyWxloXMNwtXpzMnZuMGpV0dVWudXUlN96YXH99smhRMmfOwNfxgQ98oMf5P//zP+f73/9+rr322rzxjW/c5nN32223TJkyJUmy11575corr8wvfvGLnH766VXX8+ijj+Z1r3tdnvvc5+aGG27I+PHjq34tAAAAgFrQsTaAli2rhGrlctLR0fNeR0fl+llnDW7n2sZWr16diRMn9uk5d9xxR+68884ccsghVb/v/fffn1mzZmXGjBn5zne+I1QDAAAAhiQdawPo0ksrnWqbhmobGzUqueyyZNaswasrSf77v/87P//5z/Nv//Zv2x37yle+Mg0NDVm3bl3a29tzxhln5NRTT+0x5u67794sINt4HbaNnXrqqZk1a1auueaajBo1qvoPAQAAAFBDgrUBsmZNcsMNG6Z/bk1HR3LddZXx48YNTm0//vGP8w//8A/54he/mJe+9KXbHf/1r389++67b9rb23PPPffknHPOya677ppPfOIT3WNe8pKX5Fvf+laP5z322GN59atfvdnrHX/88bn++utz7bXX5u///u93+PMAAAAA1IJgbYC0tm4/VFuvq6syfjCCtSVLluRNb3pTLrvsss26zrZm2rRp2XvvvZMk++67bx566KF8+MMfzsUXX5yddtopSbp3DN1YY+OWv14f/OAHc8ABB+Ttb397yuVy3vKWt+zAJwIAAACoDcHaAGlqShoaeheuNTRUxg+0W265JW984xvzyU9+MmeccUbVrzNq1Kh0dHRk3bp13cFaX334wx9OQ0NDTjnllJTL5bz1rW+tuh4AAACAWhCsDZBx45ITTqjs/rmtNdYaGyvjBrpb7cc//nHe+MY35p//+Z9z0kknZcWKFUkqnWbb28Dgz3/+c1asWJGOjo7cfffd+exnP5vXvOY1adrBNPCDH/xgRo0alVNOOSVdXV1529vetkOvBwAAADCYBGsDaN685Prrtz2mszM599yBr+Xqq6/OM888k4ULF2bhwoXd11/1qlfllltu2eZzjzrqqCSVTrU99tgjxx13XD72sY/1S10XXHBBGhoa8o53vCPlcjlvf/vb++V1AQAAAAZaoby1rRtHkNbW1jQ3N2f16tWbdWE9++yzefjhhzN9+vSqpj1ecUVy1lmb7w7a2FgJ1RYtSubM2dFPMHzt6O8fAAAAoC+2lRNtqmGQahqx5sxJli6tTPds+Otvu6Ghcr50qVANAAAAYKgyFXQQzJpVeaxZU9n9s6lpcHYABQAAAGDgCNYG0bhxAjUAAACA4cJUUAAAAACogmANAAAAAKogWAMAAACgz0rrSiksKKSwoJDSulKty6kJwRoAAAAAVEGwBgAAAABVsCsoAAAAAL2y8ZTPUvuWj5OkOKY4aDXVkmANAAAAgF4Zv3D8Fq9PvmRyj/PyReXBKKfmTAUdIe6///685jWvyeTJk7PTTjvlBS94QT70oQ+lvb19q8/5/e9/n0Kh0P0YM2ZM9t5773z0ox9NubzhPyAXX3xxXv7yl2/1+XfdddcWz5Pk6aefzmte85rMmDEjf/zjH/vr4wIAAAAMOB1rg6S0rtSd6rbNbxv0lsjRo0fn1FNPzd/8zd9kwoQJ+dWvfpV3v/vd6erqysc//vFtPvcHP/hBXvrSl2bt2rVZtmxZ3vWud2WPPfbI6aefvkM1rVq1Kscee2waGhqydOnS7Lbbbjv0egAAAMDAapvf1n1cai91d6q1nNeS4uiRMf1zY4K1EeIFL3hBXvCCF3Sf77XXXrnllluydOnS7T53t912y5QpU7qfd+WVV+YXv/jFDgVrjz76aF73utfluc99bm644YaMH7/lVlIAAACgfmytUag4ujhi1lXbmKmgI9SDDz6Ym266Ka961av69Lw77rgjd955Zw455JCq3/v+++/PrFmzMmPGjHznO98RqgEAAABDko61AVSPO2W88pWvzC9+8YusXbs2Z5xxRj7ykY/06jkNDQ1Zt25d2tvbc8YZZ+TUU0/tMebuu+/eLCDbeB22jZ166qmZNWtWrrnmmowaNar6DwMAAABQQ4K1AVSPO2V8/etfz9NPP51f/epXef/7359LLrkk//Iv/7Ld5+y7775pb2/PPffck3POOSe77rprPvGJT3SPeclLXpJvfetbPZ732GOP5dWvfvVmr3f88cfn+uuvz7XXXpu///u/75fPBQAAAAyu4pjiiNn9c2sEayPMtGnTkiQzZsxIZ2dnzjjjjLzvfe/bZufYtGnTsvfeeydJ9t133zz00EP58Ic/nIsvvjg77bRTknTvGLqxxsYtf70++MEP5oADDsjb3/72lMvlvOUtb+mPjwYAAAAwqARrA6jed8ro6upKe3t7urq6+jQlc9SoUeno6Mi6deu6g7W++vCHP5yGhoaccsopKZfLeetb31rV6wAAAADUimBtANXTThlf+cpXMnr06Oy///4ZO3Zs7rjjjsyfPz9vfetbM3r06G0+989//nNWrFiRjo6O3H333fnsZz+b17zmNWlqatqhmj74wQ9m1KhROeWUU9LV1ZW3ve1tO/R6AAAAAINJsDZCNDY25pOf/GR++9vfplwuZ6+99srZZ5+dc889d7vPPeqoo5JUOtX22GOPHHfccfnYxz7WL3VdcMEFaWhoyDve8Y6Uy+W8/e1v75fXBQAAABhohfLWtm4cQVpbW9Pc3JzVq1dv1oX17LPP5uGHH8706dOrnvaYVHYIXb+ZQdv8tkHvWBuq+uv3DwAAANAb28qJNqVjbZDYKQMAAABgeGmodQEAAAAAMBQJ1gAAAACgCoI1AAAAAKiCYK2X7PFQG37vAAAAQL0SrG3HqFGjkiTr1q2rcSUj0zPPPJMkGT16dI0rAQAAAOjJrqDb0djYmJ133jmrVq3K6NGj09AgixwM5XI5zzzzTFauXJkJEyZ0B5wAAAAA9UKwth2FQiF77LFHHn744fzhD3+odTkjzoQJEzJlypRalwEAAACwGcFaL4wZMyYvetGLTAcdZKNHj9apBgAAANQtwVovNTQ0ZKeddqp1GQAAAADUCQuGAQAAAEAVBGsAAAAAUAXBGgAAAABUQbAGAAAAAFUQrAEAAABAFQRrAAAAAFAFwRoAAAAAVEGwBgAAAABVEKwBAAAAQBUEawAAAABQBcEaAAAAAFRBsAYAAAAAVRCsAQAAAEAVBGsAAAAAUAXBGgAAAABUQbAGAAAAAFUQrAEAAABAFQRrAAAAAFAFwRoAAAAAVEGwBgAAAABVEKwBAAAAQBUEawAAAABQBcEaAAAAAFRBsAYAAAAAVRCsAQAAAEAVahqsLV68OAcccECamprS1NSUmTNn5rvf/W73/WeffTZz587NbrvtlvHjx+ekk05KS0tLj9d45JFH8oY3vCE777xzJk2alPe///3p6OgY7I8CAAAAwAhT02Btzz33zCc+8YnceeedueOOO/La1742J5xwQu69994kybnnnpsbb7wx11xzTZYsWZLHH388s2fP7n5+Z2dn3vCGN2TdunW57bbbcvXVV+eqq67KhRdeWKuPBAAAAMAIUSiXy+VaF7GxiRMn5tOf/nT+7u/+Lrvvvnu++tWv5u/+7u+SJP/7v/+bfffdN8uXL8+hhx6a7373u3njG9+Yxx9/PJMnT06SXHHFFTn//POzatWqjBkzplfv2dramubm5qxevTpNTU0D9tkAAAAAqG99yYnqZo21zs7O/Nd//VdKpVJmzpyZO++8M+3t7TnqqKO6x+yzzz553vOel+XLlydJli9fnv333787VEuSo48+Oq2trd1db1uydu3atLa29ngAAAAAQF/UPFi7++67M378+IwdOzZz5szJddddlxkzZmTFihUZM2ZMJkyY0GP85MmTs2LFiiTJihUreoRq6++vv7c1CxcuTHNzc/dj2rRp/fuhAAAAABj2ah6sveQlL8ldd92V22+/PWeeeWZOO+203HfffQP6nvPnz8/q1au7H48++uiAvh8AAAAAw09jrQsYM2ZM9t577yTJQQcdlJ///Of57Gc/m7e+9a1Zt25dnnrqqR5day0tLZkyZUqSZMqUKfnZz37W4/XW7xq6fsyWjB07NmPHju3nTwIAAADASFLzjrVNdXV1Ze3atTnooIMyevTo/PCHP+y+d//99+eRRx7JzJkzkyQz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AACg7hTK5XK5mic+8sgjueeee9LW1pYDDzwwL3rRi/q7tkHT2tqa5ubmrF69Ok1NTbUuBwAAAIAa6UtO1Fjtm0yZMiVr1qzJC1/4wjQ2Vv0yAAAAADAk9Xkq6DPPPJPTTz89O++8c1760pfmkUceSZKcc845+cQnPtHvBQIAAABAPepzsDZ//vz86le/yi233JKddtqp+/pRRx2Vr3/96/1aHAAAAADUqz7P4bz++uvz9a9/PYceemgKhUL39Ze+9KV56KGH+rU4AAAAAKhXfe5YW7VqVSZNmrTZ9VKp1CNoAwAAAIDhrM/B2sEHH5z/+Z//6T5fH6Z96UtfysyZM/uvMgAAAACoY32eCvrxj388xx57bO677750dHTks5/9bO67777cdtttWbJkyUDUCAAAAAB1p88da4cddljuuuuudHR0ZP/998/3v//9TJo0KcuXL89BBx00EDUCAAAAQN3pdbD2ox/9KB0dHUmSF77whfniF7+Yn/3sZ7nvvvvyn//5n9l///37/OYLFy7MK17xiuyyyy6ZNGlS3vzmN+f+++/vMebZZ5/N3Llzs9tuu2X8+PE56aST0tLS0mPMI488kje84Q3ZeeedM2nSpLz//e/vrhUAAAAABkKvg7XXve51efLJJ7vPDz300Dz22GM79OZLlizJ3Llz89Of/jQ333xz2tvb8/rXvz6lUql7zLnnnpsbb7wx11xzTZYsWZLHH388s2fP7r7f2dmZN7zhDVm3bl1uu+22XH311bnqqqty4YUX7lBtAADA8FFaV0phQSGFBYWU1pW2/4RBei0AhrZer7FWLpd7nN97771Zu3btDr35TTfd1OP8qquuyqRJk3LnnXfmiCOOyOrVq/Pv//7v+epXv5rXvva1SZIrr7wy++67b37605/m0EMPzfe///3cd999+cEPfpDJkyfn5S9/ef71X/81559/fi6++OKMGTNmh2oEAAAAgC3p8xprA2n16tVJkokTJyZJ7rzzzrS3t+eoo47qHrPPPvvkec97XpYvX54kWb58efbff/9Mnjy5e8zRRx+d1tbW3HvvvVt8n7Vr16a1tbXHAwAAAAD6otcda4VCIYVCYavnO6qrqyvvfe97M2vWrOy3335JkhUrVmTMmDGZMGFCj7GTJ0/OihUrusdsHKqtv7/+3pYsXLgwCxYs6LfaAQCA+rPxNM1S+5aPk6Q4pjiorwXA8NGnqaBHHnlkGhsrT3nmmWfypje9abOplr/4xS+qKmTu3Lm55557smzZsqqe3xfz58/PvHnzus9bW1szbdq0AX9fAABg8IxfOH6L1ydf0vNfzJcvKm9x3EC9FgDDR6+DtYsuuqjH+QknnNBvRZx99tn59re/nZ/85CfZc889u69PmTIl69aty1NPPdWja62lpSVTpkzpHvOzn/2sx+ut3zV0/ZhNjR07NmPHju23+gEAAAAYeaoO1vpDuVzOOeeck+uuuy633HJLpk+f3uP+QQcdlNGjR+eHP/xhTjrppCTJ/fffn0ceeSQzZ85MksycOTMf+9jHsnLlykyaNClJcvPNN6epqSkzZszo95oBAIChoW1+W/dxqb3U3V3Wcl5LiqP7NmWzP18LgOGj18HaQJg7d26++tWv5oYbbsguu+zSvSZac3Nzxo0bl+bm5px++umZN29eJk6cmKamppxzzjmZOXNmDj300CTJ61//+syYMSPveMc78qlPfSorVqzIhz70ocydO1dXGgAAjGBbW++sOLrY57XQ+vO1ABg+ahqsLV68OEny6le/usf1K6+8Mu985zuTJJdddlkaGhpy0kknZe3atTn66KOzaNGi7rGjRo3Kt7/97Zx55pmZOXNmisViTjvttHzkIx8ZrI8BAAAAwAhU02CtXN7+wp477bRTLr/88lx++eVbHbPXXnvlO9/5Tn+WBgAAAADbVNNgDQAA6L3SulL37pRt89tMQeyD0rpSj+Md+d0VxxTt/glAkqRhR5787LPP9lcdAAAAADCk9DlY6+rqyr/+67/muc99bsaPH5/f/e53SZIPf/jD+fd///d+LxAAAAAA6lGfg7WPfvSjueqqq/KpT30qY8aM6b6+33775Utf+lK/FgcAACNdaV1pw6N9o+mM7aUe99jcyraV3Y9Vz6zqvr7qmVU97gFAtQrl3uwgsJG99947//Zv/5Yjjzwyu+yyS371q1/lBS94Qf73f/83M2fOzF/+8peBqnXAtLa2prm5OatXr05TU1OtywEAgG6FBYVejbPm1+b87gCoRl9yoj53rD322GPZe++9N7ve1dWV9vb2vr4cAAAAAAxJfd4VdMaMGVm6dGn22muvHte/8Y1v5MADD+y3wgAAgMrun+uV2kuZfMnkJEnLeS0pjrYr6La0vK+l+3jVM6uy3+L9kiT3nHlPdt9591qVBcAw0udg7cILL8xpp52Wxx57LF1dXbn22mtz//3358tf/nK+/e1vD0SNAAAwYhXHbDk8K44ubvUeFZPGT9ri9d133n2r9wCgL/o8FfSEE07IjTfemB/84AcpFou58MIL85vf/CY33nhjXve61w1EjQAAAABQd/rUsdbR0ZGPf/zj+cd//MfcfPPNA1UTAAAAANS9Pu8KOn78+Nxzzz15/vOfP0AlDT67ggIAAACQDPCuoEceeWSWLFlSdXEAAAAAMBz0efOCY489NhdccEHuvvvuHHTQQSkWey6Yevzxx/dbcQAAAABQr/o8FbShYetNboVCIZ2dnTtc1GAzFRQAAACApG85UZ871rq6uqouDAAAAACGiz6vsQYAwPaV1pVSWFBIYUEhpXWlWpcDAMAA6HPHWpKUSqUsWbIkjzzySNatW9fj3nve855+KQwAAAAA6lmfg7Vf/vKXOe644/LMM8+kVCpl4sSJ+dOf/pSdd945kyZNEqwBAAAAMCL0eSroueeemze96U35y1/+knHjxuWnP/1p/vCHP+Sggw7KJZdcMhA1AgAMCaV1pQ2P9g3TP0vtpR73AAAYHvq8K+iECRNy++235yUveUkmTJiQ5cuXZ999983tt9+e0047Lf/7v/87ULUOGLuCAgD9obCg0Ktx5Yv69D+/AAAYRH3JifrcsTZ69Og0NFSeNmnSpDzyyCNJkubm5jz66KNVlAsAAAAAQ0+f11g78MAD8/Of/zwvetGL8qpXvSoXXnhh/vSnP+U//uM/st9++w1EjQAAQ0Lb/Lbu41J7KZMvmZwkaTmvJcXRxVqVBQDAAOlzx9rHP/7x7LHHHkmSj33sY9l1111z5plnZtWqVfnCF77Q7wUCAAwVxTHFDY+NgrTi6GKPewAADA997lg7+OCDu48nTZqUm266qV8LAgAAAIChoM8dawAAAABAFR1r06dPT6Gw9R2vfve73+1QQQAAw0FxTNHunwAAw1yfg7X3vve9Pc7b29vzy1/+MjfddFPe//7391ddAAAAAFDX+hys/fM///MWr19++eW54447drggAAAAABgK+m2NtWOPPTbf/OY3++vlAAAAAKCu9Vuw9o1vfCMTJ07sr5cDAAAAgLrW56mgBx54YI/NC8rlclasWJFVq1Zl0aJF/VocAAAAANSrPgdrb37zm3ucNzQ0ZPfdd8+rX/3q7LPPPv1VFwAAAADUtUK5XB7x+8C3tramubk5q1evTlNTU63LAQAAAKBG+pIT9bljrbW1tddjhVQAAAAADFd9DtYmTJjQY421LSmXyykUCuns7Ky6MAAAAACoZ30O1q688spccMEFeec735mZM2cmSZYvX56rr746CxcuzPOf//z+rhEAAAAA6k6fg7Uvf/nLufTSS/O2t72t+9rxxx+f/fffP1/4whdyyy239Gd9AAAAAFCXGvr6hOXLl+fggw/e7PrBBx+cn/3sZ/1SFAAAAADUuz4Ha9OmTcsXv/jFza5/6UtfyrRp0/qlKAAAYPtK60opLCiksKCQ0rpSrcsBgBGnz1NBL7vsspx00kn57ne/m0MOOSRJ8rOf/SwPPPBAvvnNb/Z7gQAAAABQj/rcsXbcccflgQceyPHHH58nn3wyTz75ZN70pjflt7/9bY477riBqBEAAAAA6k6fO9aSZM8998zHPvax/q4FAADYjo2nfJbat3ycJMUxxUGrCQBGql4Ha3/6059SKpWy1157dV+79957c8kll6RUKuXNb35z3v72tw9IkQAAQMX4heO3eH3yJZN7nJcvKg9GOQAwovV6Kug555yTz33uc93nK1euzOGHH56f//znWbt2bd75znfmP/7jPwakSAAAAACoN73uWPvpT3+aq666qvv8y1/+ciZOnJi77rorjY2NueSSS3L55ZfnHe94x0DUCQAAJGmb39Z9XGovdXeqtZzXkuJo0z8BYDD1umNtxYoVef7zn999/qMf/SizZ89OY2Mlmzv++OPzwAMP9HuBAADABsUxxQ2PjYK04uhij3sAwMDrdbDW1NSUp556qvv8Zz/7WQ455JDu80KhkLVr1/ZrcQAAAABQr3odrB166KH53Oc+l66urnzjG9/I008/nde+9rXd93/7299m2rRpA1IkAAAAANSbXq+x9q//+q858sgj85//+Z/p6OjIBz7wgey6667d9//rv/4rr3rVqwakSAAAYHPFMUW7fwJADfU6WDvggAPym9/8JrfeemumTJnSYxpokpx88smZMWNGvxcIAAAAAPWoUC6XR/y/4mptbU1zc3NWr16dpqamWpcDAAAAQI30JSfq9RprAAAMTaV1pRQWFFJYUEhpXanW5QAADBuCNQAAAACogmANAAAAAKrQp2Cto6MjX/7yl9PS0jJQ9QAA0A9K60obHu0bpn+W2ks97gEAUL0+b16w88475ze/+U322muvgapp0Nm8AAAYbgoLCr0aV75oxO9jBQDQw4BuXvC3f/u3ueuuu6qtDQAAAACGhca+PuGss87KvHnz8uijj+aggw5KsVjscf+AAw7ot+IAAKhO2/y27uNSeymTL5mcJGk5ryXF0cWtPQ0AgD7oc7B28sknJ0ne8573dF8rFAopl8spFArp7Ozsv+oAAKhKccyWw7Pi6OJW7wEA0Dd9DtYefvjhgagDAAAAAIaUPgdrw2nTAgAAAACoVp83L0iS//iP/8isWbMyderU/OEPf0iSfOYzn8kNN9zQr8UBALDjimOKKV9UTvmismmgAAD9qM/B2uLFizNv3rwcd9xxeeqpp7rXVJswYUI+85nP9Hd9AAAAAFCX+hysff7zn88Xv/jFfPCDH8yoUaO6rx988MG5++67+7U4AAAAAKhXfQ7WHn744Rx44IGbXR87dmxKpVK/FAUAAAAA9a7Pwdr06dNz1113bXb9pptuyr777tsfNQEAAABA3evzrqDz5s3L3Llz8+yzz6ZcLudnP/tZvva1r2XhwoX50pe+NBA1AgAAAEDd6XOw9q53vSvjxo3Lhz70oTzzzDN5+9vfnqlTp+azn/1sTj755IGoEQAAAADqTqFcLpf78oS1a9emo6MjxWIxzzzzTNra2jJp0qSBqm9QtLa2prm5OatXr05TU1OtywEAAACgRvqSE/V6jbVVq1bl2GOPzfjx49PU1JRDDz00TzzxxJAP1QAAAACgGr0O1s4///zcdddd+chHPpJLLrkkTz31VN71rncNZG0AAAAAULd6vcbazTffnKuuuipHH310kuSNb3xj9t1336xduzZjx44dsAIBAAAAoB71umPt8ccfz8te9rLu8xe96EUZO3ZsnnjiiQEpDAAAAADqWa+DtSQZNWrUZud93PsAAAAAAIaFXk8FLZfLefGLX5xCodB9ra2tLQceeGAaGjbkc08++WT/VggAAAAAdajXwdqVV145kHUAAAAAwJDS62DttNNOG8g6AACGldK6UsYvHJ8kaZvfluKYYo0rAgCgv/VpjTUAAAAAoEKwBgAAAABV6PVUUAAAtq20rrThuH3Lx0lMCwUAGCYEawAA/WT9mmqbmnzJ5B7n5YvKg1EOAAADrOqpoOvWrcv999+fjo6O/qwHAAAAAIaEPnesPfPMMznnnHNy9dVXJ0l++9vf5gUveEHOOeecPPe5z80FF1zQ70UCAAwFbfPbuo9L7aXuTrWW81pSHG36JwDAcNPnjrX58+fnV7/6VW655ZbstNNO3dePOuqofP3rX+/X4gAAhpLimOKGx0ZBWnF0scc9AACGhz53rF1//fX5+te/nkMPPTSFQqH7+ktf+tI89NBD/VocAAAAANSrPnesrVq1KpMmTdrseqlU6hG0AQAAAMBw1udg7eCDD87//M//dJ+vD9O+9KUvZebMmf1XGQDAEFYcU0z5onLKF5VN/wQAGKb6PBX04x//eI499tjcd9996ejoyGc/+9ncd999ue2227JkyZKBqBEAAAAA6k6fO9YOO+yw3HXXXeno6Mj++++f73//+5k0aVKWL1+egw46aCBqBAAAAIC6UyiXy+VaF1Frra2taW5uzurVq9PU1FTrcgAAAACokb7kRH3uWPvOd76T733ve5td/973vpfvfve7fX05AAAAABiS+hysXXDBBens7NzserlczgUXXNAvRQEAAABAvetzsPbAAw9kxowZm13fZ5998uCDD/ZLUQAAAABQ7/ocrDU3N+d3v/vdZtcffPDBFIu2kgcAAABgZOhzsHbCCSfkve99bx566KHuaw8++GDe97735fjjj+/X4gAAAACgXvU5WPvUpz6VYrGYffbZJ9OnT8/06dOz7777Zrfddssll1wyEDUCAAAAQN1p7OsTmpubc9ttt+Xmm2/Or371q4wbNy4HHHBAjjjiiIGoDwAAAADqUqFcLpdrXUSttba2prm5OatXr05TU1OtywEAAACgRvqSE/WqY+1zn/tczjjjjOy000753Oc+t82x73nPe3pfKQAAAAAMUb3qWJs+fXruuOOO7Lbbbpk+ffrWX6xQ2OKOofVOxxoAAAAAyQB0rD388MNbPAYAAACAkapPu4K2t7fnhS98YX7zm98MVD0AMCKU1pVSWFBIYUEhpXWlWpcDAABUoU/B2ujRo/Pss88OVC0AAAAAMGT0KVhLkrlz5+aTn/xkOjo6BqIeAAAAABgSerXG2sZ+/vOf54c//GG+//3vZ//990+xWOxx/9prr+234gBgONl4ymepfcvHSVIc0/O/WwEAgPrU52BtwoQJOemkkwaiFgAY1sYvHL/F65MvmdzjvHzRdjfsBgAA6kCfg7Urr7xyIOoAAAAAgCGl18FaV1dXPv3pT+db3/pW1q1blyOPPDIXXXRRxo0bN5D1AcCw0Ta/rfu41F7q7lRrOa8lxdGmfwIAwFDT680LPvaxj+UDH/hAxo8fn+c+97n57Gc/m7lz5w5kbQAwrBTHFDc8NgrSiqOLPe4BAABDQ6+DtS9/+ctZtGhRvve97+X666/PjTfemK985Svp6uoayPoAAAAAoC71Olh75JFHctxxx3WfH3XUUSkUCnn88ccHpDAAAAAAqGe9XmOto6MjO+20U49ro0ePTnt7e78XBQDDXXFM0e6fAAAwxPU6WCuXy3nnO9+ZsWPHdl979tlnM2fOnBSLG9aDufbaa/u3QgAAAACoQ70O1k477bTNrv2f//N/+rUYAAAAABgqeh2sXXnllQNZBwDAoCmtK2X8wvFJkrb5bXZjBQCgKr3evGAg/OQnP8mb3vSmTJ06NYVCIddff32P++985ztTKBR6PI455pgeY5588smccsopaWpqyoQJE3L66aenra1tED8FAAAAACNRTYO1UqmUl73sZbn88su3OuaYY47JE0880f342te+1uP+KaecknvvvTc333xzvv3tb+cnP/lJzjjjjIEuHQAAAIARrtdTQQfCsccem2OPPXabY8aOHZspU6Zs8d5vfvOb3HTTTfn5z3+egw8+OEny+c9/Pscdd1wuueSSTJ06td9rBgCGptK60obj9i0fJzEtFACAXqtpsNYbt9xySyZNmpRdd901r33ta/PRj340u+22W5Jk+fLlmTBhQneoliRHHXVUGhoacvvtt+fEE0/c4muuXbs2a9eu7T5vbW0d2A8BANTc+jXVNjX5ksk9zssXlQejHAAAhoGaTgXdnmOOOSZf/vKX88Mf/jCf/OQns2TJkhx77LHp7OxMkqxYsSKTJk3q8ZzGxsZMnDgxK1as2OrrLly4MM3Nzd2PadOmDejnAAAAAGD4qeuOtZNPPrn7eP/9988BBxyQF77whbnlllty5JFHVv268+fPz7x587rPW1tbhWsAMMy1zd+wuVGpvdTdqdZyXkuKo03/BACg7+o6WNvUC17wgjznOc/Jgw8+mCOPPDJTpkzJypUre4zp6OjIk08+udV12ZLKum1jx44d6HIBgDqytbXTiqOL1lUDAKAqdT0VdFN//OMf8+c//zl7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6qqcH354csUVm48/++xk5cqe11euTObO3Xz8QHvwweTaays/AQAA2LKaBmulUikve9nLcvnll2/x/qc+9al87nOfyxVXXJHbb789xWIxRx99dJ599tnuMaecckruvffe3Hzzzfn2t7+dn/zkJznjjDMG6yMAbGbZskoYVi4nHR0973V0VK6fddaGzrW+jh9Ib31rZffRF70oOemkys+GhuRtbxv49wYAABhqCuVyuVzrIpKkUCjkuuuuy5vf/OYklW61qVOn5n3ve1/OO++8JMnq1aszefLkXHXVVTn55JPzm9/8JjNmzMjPf/7zHHzwwUmSm266Kccdd1z++Mc/ZurUqb1679bW1jQ3N2f16tVpamoakM8HjByzZ1c60zYNyTbW2FjZDfQb3+j7+IGy117JI49s/f7znpf84Q8D9/4AAAD1oC85Ud2usfbwww9nxYoVOeqoo7qvNTc355BDDsny5cuTJMuXL8+ECRO6Q7UkOeqoo9LQ0JDbb799q6+9du3atLa29ngA9Ic1a5Ibbth2SJZU7l93XfLkk70ff+21yfe+lzz2WP/Vu95b37rtUC2p3Ne5BgAAsEHdBmsrVqxIkkyePLnH9cmTJ3ffW7FiRSZtstJ3Y2NjJk6c2D1mSxYuXJjm5ubux7Rp0/q5emCkam3dsKba9nR1JY8/3vvx5XJyzDHJnnsmO+2U/LWZt19cc03vxv33f/ffewIAAAx1dRusDaT58+dn9erV3Y9HH3201iUBw0RTU2VNst5oaEimTu39+I2tXZv83/+bvOIVfX/uph58sBLa9UZXlw0NAAAA1qvbYG3KlClJkpaWlh7XW1pauu9NmTIlKzfZQq+joyNPPvlk95gtGTt2bJqamno8APrDuHGVtdAaG7c9rrExOfHEZOLE3o3fmjvu2PHOtV//emDHAwAADFd1G6xNnz49U6ZMyQ9/+MPua62trbn99tszc+bMJMnMmTPz1FNP5c477+we86Mf/ShdXV055JBDBr1mgCSZNy/p7Nz2mM7O5Nxzez9+Wz73ueqfmyQHHDCw4wEAAIarmgZrbW1tueuuu3LXXXclqWxYcNddd+WRRx5JoVDIe9/73nz0ox/Nt771rdx999059dRTM3Xq1O6dQ/fdd98cc8wxefe7352f/exnufXWW3P22Wfn5JNP7vWOoAD97bDDKpsBbMvJJyez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\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "def remove_bhk_outliers(df):\n", " exclude_indices = np.array([])\n", " for location, location_df in df.groupby('location'):\n", " bhk_stats={}\n", " for bhk , bhk_df in location_df.groupby('bhk'):\n", " bhk_stats[bhk] ={\n", " 'mean': np.mean(bhk_df.price_per_sqft),\n", " 'std':np.std(bhk_df.price_per_sqft),\n", " 'count': bhk_df.shape[0]\n", " }\n", " for bhk , bhk_df in location_df.groupby('bhk'):\n", " stats = bhk_stats.get(bhk-1)\n", " if stats and stats['count']>5:\n", " exclude_indices = np.append(exclude_indices, bhk_df[bhk_df.price_per_sqft<(stats['mean'])].index.values)\n", " return df.drop(exclude_indices,axis='index')\n", "\n", "\n", "dataset = remove_bhk_outliers(dataset)\n", "dataset.shape\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TwvlwWcXVc0e", "outputId": "5f785fd8-5e73-4fb3-a4bc-aa46bd55b732" }, "execution_count": 74, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(7329, 7)" ] }, "metadata": {}, "execution_count": 74 } ] }, { "cell_type": "code", "source": [ "plot_scatter_chart(dataset,'Hebbal')\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 872 }, "id": "ExexZnoeXeCv", "outputId": "0a7f1a1a-4ac2-43d7-c6c2-ac040ce193a6" }, "execution_count": 75, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABNYAAANXCAYAAAD5PtJMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB4xklEQVR4nOzde3ycZZ03/s+kaUtJSUqRNlQKVkChAsqCD9QCHkBOKkjZVZBHcBdlCwVXKi7UAwdXrbo8oO5Di4f9Ae56WpCD8CiKB2oLFQWpcnARWAQEmlaRhqalzWF+f4ydNvSUTJPMJHm/X695Ze77vuae72TH6H76va6rUCwWiwEAAAAAeqWu2gUAAAAAwGAkWAMAAACACgjWAAAAAKACgjUAAAAAqIBgDQAAAAAqIFgDAAAAgAoI1gAAAACgAoI1AAAAAKiAYA0AAAAAKiBYAwAYht70pjdl33333eq4O+64I4VCIddff32fvfcll1ySQqHQZ/cDAKgWwRoAQA275pprUigUcs8992zyek8DMgAA+p5gDQAAAAAqIFgDAAAAgAoI1gAAhpj//M//zIEHHpgxY8Zk/PjxOfnkk/PUU09tcuy9996bN7zhDRkzZkymTJmSq666apPjOjs789GPfjTNzc1paGjI8ccfv9E9Fy5cmL/7u7/LbrvtltGjR2fy5Mk577zzsnr16j7/jAAAtaC+2gUAALB1K1asyJ/+9KeNzre3t3c7/vSnP51PfOITede73pX3v//9Wb58ef7t3/4thx9+eO67776MGzeuPPYvf/lLjjvuuLzrXe/KKaeckv/6r//KWWedlVGjRuUf/uEfNrpvoVDIBRdckGXLluULX/hCjjzyyCxZsiRjxoxJklx33XVZtWpVzjrrrOy000755S9/mX/7t3/LH//4x1x33XV9/0sBAKgywRoAwCBw5JFHbvbaa17zmiTJE088kYsvvjif+tSn8tGPfrR8fcaMGTnggAMyb968buefeeaZ/J//838ye/bsJMk//uM/5uCDD86cOXPy3ve+NyNHjiyPfe655/K73/0uO+ywQ5Lkb/7mb/Kud70rX/3qV/PBD34wSfK5z32uHLIlyZlnnpk999wzH/3oR/Pkk09mt91264PfBABA7TAVFABgELjyyitz++23b/TYf//9y2NuuOGGdHV15V3velf+9Kc/lR/Nzc3Za6+98rOf/azbPevr6/OP//iP5eNRo0blH//xH7Ns2bLce++93caedtpp5VAtSf72b/82u+yyS77//e+Xz20YqrW1teVPf/pT3vCGN6RYLOa+++7rs98FAECt0LEGADAI/K//9b9y0EEHbXR+xx13LE8RfeSRR1IsFrPXXntt8h4bdqAlyaRJk9LQ0NDt3Kte9aokyR/+8Icccsgh5fMvvWehUMiee+6ZP/zhD+VzTz75ZC666KJ873vfy1/+8pdu41esWLGVTwgAMPgI1gAAhoiurq4UCoX84Ac/yIgRIza6Pnbs2H57787Ozrz1rW/Nc889lwsuuCB77713Ghoa8vTTT+d973tfurq6+u29AQCqRbAGADBE7LHHHikWi5kyZUq582xLnnnmmbS1tXXrWvv973+fJHnFK17RbewjjzzS7bhYLObRRx8tT0W9//778/vf/z7XXnttTjvttPK422+/vdKPAwBQ86yxBgAwRMyYMSMjRozIpZdemmKx2O1asVjMn//8527nOjo68uUvf7l8vHbt2nz5y1/OzjvvnAMPPLDb2K9//et54YUXysfXX399nn322Rx77LFJUu6Q2/B9i8VivvjFL/bNhwMAqEE61gAAhog99tgjn/rUpzJnzpz84Q9/yDvf+c7ssMMOefzxx3PjjTfmzDPPzPnnn18eP2nSpHzuc5/LH/7wh7zqVa/Kd77znSxZsiRf+cpXNlqPbfz48Tn00EPz93//92lpackXvvCF7LnnnvnABz6QJNl7772zxx575Pzzz8/TTz+dxsbGfPe7391orTUAgKFEsAYAMIRceOGFedWrXpUrrrgil156aZJk8uTJOeqoo3L88cd3G7vjjjvm2muvzbnnnpuvfvWrmThxYv7v//2/5bBsQx/96Efz29/+NnPnzs0LL7yQI444IvPmzcv222+fpLQxwi233JIPfvCDmTt3brbbbruceOKJOeecc/La1762/z84AEAVFIovnScAAAAAAGyVNdYAAAAAoAKCNQAAAACogGANAAAAACogWAMAAACACgjWAAAAAKACgjUAAAAAqEB9tQuoBV1dXXnmmWeyww47pFAoVLscAAAAAKqkWCzmhRdeyKRJk1JXt+WeNMFakmeeeSaTJ0+udhkAAAAA1Iinnnoqu+666xbHCNaS7LDDDklKv7DGxsYqVwMAAABAtbS2tmby5MnlvGhLBGtJefpnY2OjYA0AAACAHi0XZvMCAAAAAKiAYA0AAAAAKiBYAwAAAIAKWGOthzo7O9Pe3l7tMoaVESNGpL6+vkdzmgEAAAAGmmCtB1auXJk//vGPKRaL1S5l2Nl+++2zyy67ZNSoUdUuBQAAAKAbwdpWdHZ25o9//GO233777LzzzrqnBkixWMzatWuzfPnyPP7449lrr71SV2fmMgAAAFA7BGtb0d7enmKxmJ133jljxoypdjnDypgxYzJy5Mg88cQTWbt2bbbbbrtqlwQAAABQpgWoh3SqVYcuNQAAAKBWSS0AAAAAoAKCNQAAAACogGANAAAAACogWBtAq1cnLS2lnwPtjjvuyAknnJBddtklDQ0Ned3rXpdvfOMbW3zNH/7whxQKhfJj1KhR2XPPPfOpT30qxWKxPO6SSy7J6173us2+fsmSJZs8TpIXXnghb37zmzN16tT88Y9/7IuPCgAAADAgBGsDYNGiZMaMZOzYpLm59HPGjOTOOweuhrvuuiv7779/vvvd7+a3v/1t/v7v/z6nnXZabr311q2+9sc//nGeffbZPPLII7n00kvz6U9/Ov/f//f/bXNNy5cvz5vf/Oa0tbVl4cKF2XXXXbf5ngAAAAADpb7aBQx18+cns2YlI0YkXV2lc11dyS23JDfdlMybl8yc2f91fPSjH+12/E//9E/50Y9+lBtuuCFvf/vbt/janXbaKc3NzUmS3XffPVdffXV+/etf54wzzqi4nqeeeipvfetb8/KXvzw333xzxo4dW/G9AAAAAKpBx1o/WrSoFKoVi0lHR/drHR2l82efPbCdaxtasWJFxo8f36vX3HPPPbn33ntz8MEHV/y+Dz/8cKZPn56pU6fm+9//vlANAAAAGJR0rPWjyy8vdaq9NFTb0IgRyRVXJNOnD1xdSfJf//Vf+dWvfpUvf/nLWx37hje8IXV1dVm7dm3a29tz5pln5rTTTus25v77798oINtwHbYNnXbaaZk+fXquu+66jBgxovIPAQAAAFBFgrV+snp1cvPN66d/bk5HR3LjjaXxY8YMTG0/+9nP8vd///f56le/mte85jVbHf+d73wn++yzT9rb2/PAAw/k3HPPzY477pjPfvaz5TGvfvWr873vfa/b655++um86U1v2uh+xx9/fG666abccMMN+bu/+7tt/jwAAAAA1SBY6yetrVsP1dbp6iqNH4hgbcGCBXnHO96RK664YqOus82ZPHly9txzzyTJPvvsk8ceeyyf+MQncskll2S77bZLkvKOoRuqr9/01+tjH/tY9t9//7znPe9JsVjMu971rm34RAAAAADVIVjrJ42NSV1dz8K1urrS+P52xx135O1vf3s+97nP5cwzz6z4PiNGjEhHR0fWrl1bDtZ66xOf+ETq6upy6qmnplgs5t3vfnfF9QAAAABUg2Ctn4wZk5xwQmn3zy2tsVZfXxrX391qP/vZz/L2t789//RP/5STTjopS5cuTVLqNNvaBgZ//vOfs3Tp0nR0dOT+++/PF7/4xbz5zW9O4zamgR/72McyYsSInHrqqenq6sopp5yyTfcDAAAAGEiCtX40e3Zy001bHtPZmZx3Xv/Xcu2112bVqlWZO3du5s6dWz7/xje+MXfccccWX3vkkUcmKXWq7bLLLjnuuOPy6U9/uk/quvDCC1NXV5f3vve9KRaLec973tMn9wUAAADob4Xi5rZuHEZaW1vT1NSUFStWbNSF9eKLL+bxxx/PlClTKpr2eNVVydlnb7w7aH19KVSbNy+ZOXNbP8HQta2/fwAAAIDe2FJO9FJ1A1TTsDVzZrJwYWm6Z91ff9t1daXjhQuFagAAAACDlamgA2D69NJj9erS7p+NjQOzAygAAAAA/UewNoDGjBGoAQAAAAwVpoICAAAAQAUEawAAAABQAcEaAAAAAL3WtrYthUsLKVxaSNvatmqXUxWCNQAAAACogGANAAAAACpgV1AAAAAAemTDKZ9t7Zt+niQNoxoGrKZqEqwBAAAA0CNj547d5PmJl03sdly8uDgQ5VSdqaDDxMMPP5w3v/nNmThxYrbbbru88pWvzMc//vG0t7dv9jV/+MMfUigUyo9Ro0Zlzz33zKc+9akUi+v/A3LJJZfkda973WZfv2TJkk0eJ8kLL7yQN7/5zZk6dWr++Mc/9tXHBQAAAOh3OtYGSNvatnKqu3LOygFviRw5cmROO+20/M3f/E3GjRuX3/zmN/nABz6Qrq6ufOYzn9nia3/84x/nNa95TdasWZNFixbl/e9/f3bZZZecccYZ21TT8uXLc+yxx6auri4LFy7MTjvttE33AwAAAPrXyjkry8/b2tvKnWot57ekYeTwmP65IcHaMPHKV74yr3zlK8vHu+++e+64444sXLhwq6/daaed0tzcXH7d1VdfnV//+tfbFKw99dRTeetb35qXv/zlufnmmzN27KZbSQEAAIDasblGoYaRDcNmXbUNmQo6TD366KO57bbb8sY3vrFXr7vnnnty77335uCDD674vR9++OFMnz49U6dOzfe//32hGgAAADAo6VjrR7W4U8Yb3vCG/PrXv86aNWty5pln5pOf/GSPXlNXV5e1a9emvb09Z555Zk477bRuY+6///6NArIN12Hb0GmnnZbp06fnuuuuy4gRIyr/MAAAAABVJFjrR7W4U8Z3vvOdvPDCC/nNb36Tj3zkI7nsssvyz//8z1t9zT777JP29vY88MADOffcc7Pjjjvms5/9bHnMq1/96nzve9/r9rqnn346b3rTmza63/HHH5+bbropN9xwQ/7u7/6uTz4XAAAAMLAaRjUMm90/N0ewNsxMnjw5STJ16tR0dnbmzDPPzIc//OEtdo5Nnjw5e+65Z5Jkn332yWOPPZZPfOITueSSS7LddtslSXnH0A3V12/66/Wxj30s+++/f97znvekWCzmXe96V198NAAAAIABJVjrR7W+U0ZXV1fa29vT1dXVqymZI0aMSEdHR9auXVsO1nrrE5/4ROrq6nLqqaemWCzm3e9+d0X3AQAAAKgWwVo/qqWdMr7xjW9k5MiR2W+//TJ69Ojcc889mTNnTt797ndn5MiRW3ztn//85yxdujQdHR25//7788UvfjFvfvOb09jYuE01fexjH8uIESNy6qmnpqurK6eccso23Q8AAABgIAnWhon6+vp87nOfy+9///sUi8XsvvvuOeecc3Leeedt9bVHHnlkklKn2i677JLjjjsun/70p/ukrgsvvDB1dXV573vfm2KxmPe85z19cl8AAACA/lYobm7rxmGktbU1TU1NWbFixUZdWC+++GIef/zxTJkypeJpj0lph9B1mxmsnLNywDvWBqu++v0DAAAA9MSWcqKX0rE2QOyUAQAAADC01FW7AAAAAAAYjARrAAAAAFABwRoAAAAAVECw1kP2eKgOv3cAAACgVgnWtmLEiBFJkrVr11a5kuFp1apVSZKRI0dWuRIAAACA7uwKuhX19fXZfvvts3z58owcOTJ1dbLIgVAsFrNq1aosW7Ys48aNKwecAAAAALVCsLYVhUIhu+yySx5//PE88cQT1S5n2Bk3blya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WKzkhU8++WQeeOCBrFy5MgcccED22muvvq5twLS2tqapqSkrVqxIY2NjtcsBAAAAoEp6kxPVV/omzc3NWb16dfbYY4/U11d8GwAAAAAYlHo9FXTVqlU544wzsv322+c1r3lNnnzyySTJueeem89+9rN9XiAAAAAA1KJeB2tz5szJb37zm9xxxx3ZbrvtyuePPPLIfOc73+nT4gAAAACgVvV6DudNN92U73znOznkkENSKBTK51/zmtfkscce69PiAAAAAKBW9bpjbfny5ZkwYcJG59va2roFbQAAAAAwlPU6WDvooIPy//7f/ysfrwvTvva1r2XatGl9VxkAAAAA1LBeTwX9zGc+k2OPPTYPPfRQOjo68sUvfjEPPfRQ7rrrrixYsKA/agQAAACAmtPrjrVDDz00S5YsSUdHR/bbb7/86Ec/yoQJE7J48eIceOCB/VEjAAAAANScHgdrP/3pT9PR0ZEk2WOPPfLVr341v/zlL/PQQw/lP//zP7Pffvv1+s3nzp2b17/+9dlhhx0yYcKEvPOd78zDDz/cbcyLL76YWbNmZaeddsrYsWNz0kknpaWlpduYJ598Mm9729uy/fbbZ8KECfnIRz5SrhUAAAAA+kOPg7W3vvWtee6558rHhxxySJ5++ultevMFCxZk1qxZ+cUvfpHbb7897e3tOeqoo9LW1lYec9555+WWW27JddddlwULFuSZZ57JjBkzytc7Ozvztre9LWvXrs1dd92Va6+9Ntdcc00uuuiibaoNAAAYOtrWtqVwaSGFSwtpW9u29RcM0L0AGNx6vMZasVjsdvzggw9mzZo12/Tmt912W7fja665JhMmTMi9996bww8/PCtWrMi///u/55vf/Gbe8pa3JEmuvvrq7LPPPvnFL36RQw45JD/60Y/y0EMP5cc//nEmTpyY173udfmXf/mXXHDBBbnkkksyatSobaoRAAAAADal12us9acVK1YkScaPH58kuffee9Pe3p4jjzyyPGbvvffObrvtlsWLFydJFi9enP322y8TJ04sjzn66KPT2tqaBx98cJPvs2bNmrS2tnZ7AAAAAEBv9LhjrVAopFAobPZ4W3V1deVDH/pQpk+fnn333TdJsnTp0owaNSrjxo3rNnbixIlZunRpecyGodq66+uubcrcuXNz6aWX9lntAABA7dlwmmZb+6afJ0nDqIYBvRcAQ0evpoIeccQRqa8vvWTVqlV5xzvesdFUy1//+tcVFTJr1qw88MADWbRoUUWv7405c+Zk9uzZ5ePW1tZMnjy5398XAAAYOGPnjt3k+YmXdf+H+eLFxU2O6697ATB09DhYu/jii7sdn3DCCX1WxDnnnJNbb701P//5z7PrrruWzzc3N2ft2rV5/vnnu3WttbS0pLm5uTzml7/8Zbf7rds1dN2Ylxo9enRGjx7dZ/UDAAAAMPxUHKz1hWKxmHPPPTc33nhj7rjjjkyZMqXb9QMPPDAjR47MT37yk5x00klJkocffjhPPvlkpk2bliSZNm1aPv3pT2fZsmWZMGFCkuT2229PY2Njpk6d2uc1AwAAg8PKOSvLz9va28rdZS3nt6RhZO+mbPblvQAYOnocrPWHWbNm5Zvf/GZuvvnm7LDDDuU10ZqamjJmzJg0NTXljDPOyOzZszN+/Pg0Njbm3HPPzbRp03LIIYckSY466qhMnTo1733ve/P5z38+S5cuzcc//vHMmjVLVxoAAAxjm1vvrGFkQ6/XQuvLewEwdFQ1WJs/f36S5E1velO381dffXXe9773JUmuuOKK1NXV5aSTTsqaNWty9NFHZ968eeWxI0aMyK233pqzzjor06ZNS0NDQ04//fR88pOfHKiPAQAAAMAwVNVgrVjc+sKe2223Xa688spceeWVmx2z++675/vf/35flgYAAAAAW1TVYA0AAOi5trVt5d0pV85ZaQpiL7Stbev2fFt+dw2jGuz+CUCSpG5bXvziiy/2VR0AAAAAMKj0Oljr6urKv/zLv+TlL395xo4dm//5n/9JknziE5/Iv//7v/d5gQAAAABQi3odrH3qU5/KNddck89//vMZNWpU+fy+++6br33ta31aHAAADHdta9vWP9o3mM7Y3tbtGhtbtnJZ+bF81fLy+eWrlne7BgCVKhR7soPABvbcc898+ctfzhFHHJEddtghv/nNb/LKV74y//3f/51p06blL3/5S3/V2m9aW1vT1NSUFStWpLGxsdrlAABAWeHSQo/GWfNrY353AFSiNzlRrzvWnn766ey5554bne/q6kp7e3tvbwcAAAAAg1KvdwWdOnVqFi5cmN13373b+euvvz4HHHBAnxUGAACUdv9cp629LRMvm5gkaTm/JQ0j7Qq6JS0fbik/X75qefadv2+S5IGzHsjO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4q1u2A0AANSAXgdrV199dX/UAQAAAACDSo+Dta6urvzrv/5rvve972Xt2rU54ogjcvHFF2fMmDH9WR8ADBkr56wsP29rbyt3qrWc35KGkaZ/AgDAYNPjzQs+/elP56Mf/WjGjh2bl7/85fniF7+YWbNm9WdtADCkNIxqWP/YIEhrGNnQ7RoAADA49DhY+/rXv5558+blhz/8YW666abccsst+cY3vpGurq7+rA8AAAAAalKPg7Unn3wyxx13XPn4yCOPTKFQyDPPPNMvhQEAAABALevxGmsdHR3Zbrvtup0bOXJk2tvb+7woABjqGkY12P0TAAAGuR4Ha8ViMe973/syevTo8rkXX3wxM2fOTEPD+vVgbrjhhr6tEAAAAABqUI+DtdNPP32jc//7f//vPi0GAAAAAAaLHgdrV199dX/WAQAwYNrWtmXs3LFJkpVzVtqNFQCAivR484L+8POf/zzveMc7MmnSpBQKhdx0003drr/vfe9LoVDo9jjmmGO6jXnuuedy6qmnprGxMePGjcsZZ5yRlStXDuCnAAAAAGA4qmqw1tbWlte+9rW58sorNzvmmGOOybPPPlt+fOtb3+p2/dRTT82DDz6Y22+/Pbfeemt+/vOf58wzz+zv0gEAAAAY5no8FbQ/HHvssTn22GO3OGb06NFpbm7e5LXf/e53ue222/KrX/0qBx10UJLk3/7t33Lcccflsssuy6RJk/q8ZgBgcGpb27b+efumnycxLRQAgB6rarDWE3fccUcmTJiQHXfcMW95y1vyqU99KjvttFOSZPHixRk3blw5VEuSI488MnV1dbn77rtz4oknbvKea9asyZo1a8rHra2t/fshAICqW7em2ktNvGxit+PixcWBKAcAgCGgqlNBt+aYY47J17/+9fzkJz/J5z73uSxYsCDHHntsOjs7kyRLly7NhAkTur2mvr4+48ePz9KlSzd737lz56apqan8mDx5cr9+DgAAAACGnpruWDv55JPLz/fbb7/sv//+2WOPPXLHHXfkiCOOqPi+c+bMyezZs8vHra2twjUAGOJWzlm/uVFbe1u5U63l/JY0jDT9EwCA3qvpYO2lXvnKV+ZlL3tZHn300RxxxBFpbm7OsmXLuo3p6OjIc889t9l12ZLSum2jR4/u73IBgBqyubXTGkY2WFcNAICK1PRU0Jf64x//mD//+c/Z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UAHBGgAAAABUQLAGAAAAABUQrAEAAABABQRrAAAAAFABwRoAAAAAVECwBgAAAAAVEKwBAAAAQAUEawAAAABQAcEaAAAAAFRAsAYAAAAAFRCsAQAAAEAF6qtdQC0oFotJktbW1ipXAgAAAEA1rcuH1uVFWyJYS/LCCy8kSSZPnlzlSgAAAACoBS+88EKampq2OKZQ7En8NsR1dXXlmWeeyQ477JBCoVDtcmAjra2tmTx5cp566qk0NjZWuxzoN77rDAe+5wwXvusMB77nDBfD7bteLBbzwgsvZNKkSamr2/IqajrWktTV1WXXXXetdhmwVY2NjcPijxj4rjMc+J4zXPiuMxz4njNcDKfv+tY61daxeQEAAAAAVECwBgAAAAAVEKzBIDB69OhcfPHFGT16dLVLgX7lu85w4HvOcOG7znDge85w4bu+eTYvAAAAAIAK6FgDAAAAgAoI1gAAAACgAoI1AAAAAKiAYA0AAAAAKiBYgwHy85//PO94xzsyadKkFAqF3HTTTd2uF4vFXHTRRdlll10yZsyYHHnkkXnkkUe6jXnuuedy6qmnprGxMePGjcsZZ5yRlStXdhvz29/+Nocddli22267TJ48OZ///Of7+6NBN1v7rr/vfe9LoVDo9jjmmGO6jfFdp9bNnTs3r3/967PDDjtkwoQJeec735mHH36425gXX3wxs2bNyk477ZSxY8fmpJNOSktLS7cxTz75ZN72trdl++23z4QJE/KRj3wkHR0d3cbccccd+Zu/+ZuMHj06e+65Z6655pr+/niQpGff8ze96U0b/U2fOXNmtzG+59S6+fPnZ//9909jY2MaGxszbdq0/OAHPyhf9/ecoWBr33N/zysnWIMB0tbWlte+9rW58sorN3n985//fL70pS/lqquuyt13352GhoYcffTRefHFF8tjTj311Dz44IO5/fbbc+utt+bnP/95zjzzzPL11tbWHHXUUdl9991z77335l//9V9zySWX5Ctf+Uq/fz5YZ2vf9SQ55phj8uyzz5Yf3/rWt7pd912n1i1YsCCzZs3KL37xi9x+++1pb2/PUUcdlba2tvKY8847L7fcckuuu+66LFiwIM8880xmzJhRvt7Z2Zm3ve1tWbt2be66665ce+21ueaaa3LRRReVxzz++ON529velje/+c1ZsmRJPvShD+X9739/fvjDHw7o52V46sn3PEk+8IEPdPubvuE/dPieMxjsuuuu+exnP5t7770399xzT97ylrfkhBNOyIMPPpjE33OGhq19zxN/zytWBAZckuKNN95YPu7q6io2NzcX//Vf/7V87vnnny+OHj26+K1vfatYLBaLDz30UDFJ8Ve/+lV5zA9+8INioVAoPv3008VisVicN29ecccddyyuWbOmPOaCCy4ovvrVr+7nTwSb9tLverFYLJ5++unFE044YbOv8V1nMFq2bFkxSXHBggXFYrH0N3zkyJHF6667rjzmd7/7XTFJcfHixcVisVj8/ve/X6yrqysuXbq0PGb+/PnFxsbG8nf7n//5n4uvec1rur3Xu9/97uLRRx/d3x8JNvLS73mxWCy+8Y1vLP7TP/3TZl/je85gteOOOxa/9rWv+XvOkLbue14s+nu+LXSsQQ14/PHHs3Tp0hx55JHlc01NTTn44IOzePHiJMnixYszbty4HHTQQeUxRx55ZOrq6nL33XeXxxx++OEZNWpUeczRRx+dhx9+OH/5y18G6NPA1t1xxx2ZMGFCXv3qV+ess87Kn//85/I133UGoxUrViRJxo8fnyS59957097e3u3v+t57753ddtut29/1/fbbLxMnTiyPOfroo9Pa2lr+1+PFixd3u8e6MevuAQPppd/zdb7xjW/kZS97Wfbdd9/MmTMnq1atKl/zPWew6ezszLe//e20tbVl2rRp/p4zJL30e76Ov+eVqa92AUCydOnSJOn2R2rd8bprS5cuzYQJE7pdr6+vz/jx47uNmTJlykb3WHdtxx137Jf6oTeOOeaYzJgxI1OmTMljjz2Wj370ozn22GOzePHijBgxwnedQaerqysf+tCHMn369Oy7775JSt/DUaNGZdy4cd3GvvTv+qb+7q+7tqUxra2tWb16dcaMGdMfHwk2sqnveZK85z3vye67755Jkyblt7/9bS644II8/PDDueGGG5L4njN43H///Zk2bVpefPHFjB07NjfeeGOmTp2aJUuW+HvOkLG573ni7/m2EKwBMKBOPvnk8vP99tsv+++/f/bYY4/ccccdOeKII6pYGVRm1qxZeeCBB7Jo0aJqlwL9ZnPf8w3Xv9xvv/2yyy675Igjjshjjz2WPfbYY6DLhIq9+tWvzpIlS7JixYpcf/31Of3007NgwYJqlwV9anPf86lTp/p7vg1M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\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "dataset.bath.unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wyLqg5X7XnJv", "outputId": "3a591eb4-8124-44b2-ea06-54e54a12d393" }, "execution_count": 76, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([ 4., 3., 2., 5., 8., 1., 6., 7., 9., 12., 16., 13.])" ] }, "metadata": {}, "execution_count": 76 } ] }, { "cell_type": "code", "source": [ "dataset[dataset.bath>10]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "1VS_EWxBYLHv", "outputId": "d801f8ac-38ab-4ec0-d917-84db681d38e8" }, "execution_count": 77, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk price_per_sqft\n", "5277 Neeladri Nagar 10 BHK 4000.0 12.0 160.0 10 4000.000000\n", "8486 other 10 BHK 12000.0 12.0 525.0 10 4375.000000\n", "8575 other 16 BHK 10000.0 16.0 550.0 16 5500.000000\n", "9308 other 11 BHK 6000.0 12.0 150.0 11 2500.000000\n", "9639 other 13 BHK 5425.0 13.0 275.0 13 5069.124424" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhkprice_per_sqft
5277Neeladri Nagar10 BHK4000.012.0160.0104000.000000
8486other10 BHK12000.012.0525.0104375.000000
8575other16 BHK10000.016.0550.0165500.000000
9308other11 BHK6000.012.0150.0112500.000000
9639other13 BHK5425.013.0275.0135069.124424
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataset[dataset\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"other\",\n \"Neeladri Nagar\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"16 BHK\",\n \"13 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3365.430878802891,\n \"min\": 4000.0,\n \"max\": 12000.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 12000.0,\n 5425.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.7320508075688772,\n \"min\": 12.0,\n \"max\": 16.0,\n \"num_unique_values\": 3,\n \"samples\": [\n 12.0,\n 16.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 194.1198083658646,\n \"min\": 150.0,\n \"max\": 550.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 525.0,\n 275.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 10,\n \"max\": 16,\n \"num_unique_values\": 4,\n \"samples\": [\n 16,\n 13\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_per_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1158.2910864218384,\n \"min\": 2500.0,\n \"max\": 5500.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 4375.0,\n 5069.124423963133\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 77 } ] }, { "cell_type": "code", "source": [ "dataset[dataset.bath>dataset.bhk+2]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 175 }, "id": "PH2OpQmEYOEH", "outputId": "5d0e858f-64ca-41cb-9582-1a1b5152714b" }, "execution_count": 78, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location size total_sqft bath price bhk price_per_sqft\n", "1626 Chikkabanavar 4 Bedroom 2460.0 7.0 80.0 4 3252.032520\n", "5238 Nagasandra 4 Bedroom 7000.0 8.0 450.0 4 6428.571429\n", "6711 Thanisandra 3 BHK 1806.0 6.0 116.0 3 6423.034330\n", "8411 other 6 BHK 11338.0 9.0 1000.0 6 8819.897689" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationsizetotal_sqftbathpricebhkprice_per_sqft
1626Chikkabanavar4 Bedroom2460.07.080.043252.032520
5238Nagasandra4 Bedroom7000.08.0450.046428.571429
6711Thanisandra3 BHK1806.06.0116.036423.034330
8411other6 BHK11338.09.01000.068819.897689
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataset[dataset\",\n \"rows\": 4,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"Nagasandra\",\n \"other\",\n \"Chikkabanavar\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"size\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"4 Bedroom\",\n \"3 BHK\",\n \"6 BHK\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4439.529854988401,\n \"min\": 1806.0,\n \"max\": 11338.0,\n \"num_unique_values\": 4,\n \"samples\": [\n 7000.0,\n 11338.0,\n 2460.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.2909944487358056,\n \"min\": 6.0,\n \"max\": 9.0,\n \"num_unique_values\": 4,\n \"samples\": [\n 8.0,\n 9.0,\n 7.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 426.234286122863,\n \"min\": 80.0,\n \"max\": 1000.0,\n \"num_unique_values\": 4,\n \"samples\": [\n 450.0,\n 1000.0,\n 80.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 3,\n \"max\": 6,\n \"num_unique_values\": 3,\n \"samples\": [\n 4,\n 3,\n 6\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_per_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2284.1884109019225,\n \"min\": 3252.032520325203,\n \"max\": 8819.897689186806,\n \"num_unique_values\": 4,\n \"samples\": [\n 6428.571428571428,\n 8819.897689186806,\n 3252.032520325203\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 78 } ] }, { "cell_type": "code", "source": [ "dataset = dataset[dataset.bath\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationtotal_sqftbathpricebhk
01st Block Jayanagar2850.04.0428.04
11st Block Jayanagar1630.03.0194.03
21st Block Jayanagar1875.02.0235.03
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", " \n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 7251,\n \"fields\": [\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 242,\n \"samples\": [\n \"BTM 2nd Stage\",\n \"6th Phase JP Nagar\",\n \"Kudlu\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_sqft\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 815.0184231766327,\n \"min\": 300.0,\n \"max\": 30000.0,\n \"num_unique_values\": 1501,\n \"samples\": [\n 661.0,\n 6000.0,\n 1435.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bath\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.9385187010307673,\n \"min\": 1.0,\n \"max\": 16.0,\n \"num_unique_values\": 12,\n \"samples\": [\n 12.0,\n 16.0,\n 4.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 87.67472475827064,\n \"min\": 10.0,\n \"max\": 2200.0,\n \"num_unique_values\": 1238,\n \"samples\": [\n 137.0,\n 26.85,\n 332.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"bhk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 16,\n \"num_unique_values\": 13,\n \"samples\": [\n 10,\n 11,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 80 } ] }, { "cell_type": "markdown", "source": [ "## **Model** **Building**" ], "metadata": { "id": "-Hvda5b-ZPpk" } }, { "cell_type": "code", "source": [ "dummies = pd.get_dummies(dataset.location)\n", "dummies.head(3)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 245 }, "id": "g44JZw6JZXXL", "outputId": "fa11a343-fdd9-47be-ac44-929eb4d01bae" }, "execution_count": 81, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 1st Block Jayanagar 1st Phase JP Nagar 2nd Phase Judicial Layout \\\n", "0 True False False \n", "1 True False False \n", "2 True False False \n", "\n", " 2nd Stage Nagarbhavi 5th Block Hbr Layout 5th Phase JP Nagar \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "\n", " 6th Phase JP Nagar 7th Phase JP Nagar 8th Phase JP Nagar \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "\n", " 9th Phase JP Nagar ... Vishveshwarya Layout Vishwapriya Layout \\\n", "0 False ... False False \n", "1 False ... False False \n", "2 False ... False False \n", "\n", " Vittasandra Whitefield Yelachenahalli Yelahanka Yelahanka New Town \\\n", "0 False False False False False \n", "1 False False False False False \n", "2 False False False False False \n", "\n", " Yelenahalli Yeshwanthpur other \n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "\n", "[3 rows x 242 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
1st Block Jayanagar1st Phase JP Nagar2nd Phase Judicial Layout2nd Stage Nagarbhavi5th Block Hbr Layout5th Phase JP Nagar6th Phase JP Nagar7th Phase JP Nagar8th Phase JP Nagar9th Phase JP Nagar...Vishveshwarya LayoutVishwapriya LayoutVittasandraWhitefieldYelachenahalliYelahankaYelahanka New TownYelenahalliYeshwanthpurother
0TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
1TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
2TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", "

3 rows × 242 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dummies" } }, "metadata": {}, "execution_count": 81 } ] }, { "cell_type": "code", "source": [ "dataset = pd.concat([dataset,dummies.drop('other',axis='columns')],axis='columns')\n", "dataset.head(3)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "CW6tYp03Zn5W", "outputId": "09f1530e-efc4-455b-ebed-9657b0a524e6" }, "execution_count": 82, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " location total_sqft bath price bhk 1st Block Jayanagar \\\n", "0 1st Block Jayanagar 2850.0 4.0 428.0 4 True \n", "1 1st Block Jayanagar 1630.0 3.0 194.0 3 True \n", "2 1st Block Jayanagar 1875.0 2.0 235.0 3 True \n", "\n", " 1st Phase JP Nagar 2nd Phase Judicial Layout 2nd Stage Nagarbhavi \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "\n", " 5th Block Hbr Layout ... Vijayanagar Vishveshwarya Layout \\\n", "0 False ... False False \n", "1 False ... False False \n", "2 False ... False False \n", "\n", " Vishwapriya Layout Vittasandra Whitefield Yelachenahalli Yelahanka \\\n", "0 False False False False False \n", "1 False False False False False \n", "2 False False False False False \n", "\n", " Yelahanka New Town Yelenahalli Yeshwanthpur \n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "\n", "[3 rows x 246 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
locationtotal_sqftbathpricebhk1st Block Jayanagar1st Phase JP Nagar2nd Phase Judicial Layout2nd Stage Nagarbhavi5th Block Hbr Layout...VijayanagarVishveshwarya LayoutVishwapriya LayoutVittasandraWhitefieldYelachenahalliYelahankaYelahanka New TownYelenahalliYeshwanthpur
01st Block Jayanagar2850.04.0428.04TrueFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11st Block Jayanagar1630.03.0194.03TrueFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
21st Block Jayanagar1875.02.0235.03TrueFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", "

3 rows × 246 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset" } }, "metadata": {}, "execution_count": 82 } ] }, { "cell_type": "code", "source": [ "dataset = dataset.drop('location',axis='columns')\n", "dataset.head(2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 214 }, "id": "1Fl8QNUeaI2A", "outputId": "8ff5df88-3d1d-4895-fd02-f8f5bbdfe950" }, "execution_count": 83, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " total_sqft bath price bhk 1st Block Jayanagar 1st Phase JP Nagar \\\n", "0 2850.0 4.0 428.0 4 True False \n", "1 1630.0 3.0 194.0 3 True False \n", "\n", " 2nd Phase Judicial Layout 2nd Stage Nagarbhavi 5th Block Hbr Layout \\\n", "0 False False False \n", "1 False False False \n", "\n", " 5th Phase JP Nagar ... Vijayanagar Vishveshwarya Layout \\\n", "0 False ... False False \n", "1 False ... False False \n", "\n", " Vishwapriya Layout Vittasandra Whitefield Yelachenahalli Yelahanka \\\n", "0 False False False False False \n", "1 False False False False False \n", "\n", " Yelahanka New Town Yelenahalli Yeshwanthpur \n", "0 False False False \n", "1 False False False \n", "\n", "[2 rows x 245 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
total_sqftbathpricebhk1st Block Jayanagar1st Phase JP Nagar2nd Phase Judicial Layout2nd Stage Nagarbhavi5th Block Hbr Layout5th Phase JP Nagar...VijayanagarVishveshwarya LayoutVishwapriya LayoutVittasandraWhitefieldYelachenahalliYelahankaYelahanka New TownYelenahalliYeshwanthpur
02850.04.0428.04TrueFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11630.03.0194.03TrueFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", "

2 rows × 245 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "dataset" } }, "metadata": {}, "execution_count": 83 } ] }, { "cell_type": "code", "source": [ "dataset.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-icPo_qDaSv7", "outputId": "30d4bf62-ccd8-461c-9b21-26e16cffef6d" }, "execution_count": 84, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(7251, 245)" ] }, "metadata": {}, "execution_count": 84 } ] }, { "cell_type": "code", "source": [ "X=dataset.drop('price',axis='columns')\n", "X.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 308 }, "id": "ZfjUY-u3aYNW", "outputId": "04affa01-b2c2-4806-dfa9-bde5d620c83f" }, "execution_count": 85, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " total_sqft bath bhk 1st Block Jayanagar 1st Phase JP Nagar \\\n", "0 2850.0 4.0 4 True False \n", "1 1630.0 3.0 3 True False \n", "2 1875.0 2.0 3 True False \n", "3 1200.0 2.0 3 True False \n", "4 1235.0 2.0 2 True False \n", "\n", " 2nd Phase Judicial Layout 2nd Stage Nagarbhavi 5th Block Hbr Layout \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "3 False False False \n", "4 False False False \n", "\n", " 5th Phase JP Nagar 6th Phase JP Nagar ... Vijayanagar \\\n", "0 False False ... False \n", "1 False False ... False \n", "2 False False ... False \n", "3 False False ... False \n", "4 False False ... False \n", "\n", " Vishveshwarya Layout Vishwapriya Layout Vittasandra Whitefield \\\n", "0 False False False False \n", "1 False False False False \n", "2 False False False False \n", "3 False False False False \n", "4 False False False False \n", "\n", " Yelachenahalli Yelahanka Yelahanka New Town Yelenahalli Yeshwanthpur \n", "0 False False False False False \n", "1 False False False False False \n", "2 False False False False False \n", "3 False False False False False \n", "4 False False False False False \n", "\n", "[5 rows x 244 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
total_sqftbathbhk1st Block Jayanagar1st Phase JP Nagar2nd Phase Judicial Layout2nd Stage Nagarbhavi5th Block Hbr Layout5th Phase JP Nagar6th Phase JP Nagar...VijayanagarVishveshwarya LayoutVishwapriya LayoutVittasandraWhitefieldYelachenahalliYelahankaYelahanka New TownYelenahalliYeshwanthpur
02850.04.04TrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11630.03.03TrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
21875.02.03TrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
31200.02.03TrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
41235.02.02TrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", "

5 rows × 244 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "X" } }, "metadata": {}, "execution_count": 85 } ] }, { "cell_type": "code", "source": [ "y= dataset.price\n", "y.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kvFZ6tNpatU3", "outputId": "179167ac-2063-4a62-8850-2856b21063f9" }, "execution_count": 86, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0 428.0\n", "1 194.0\n", "2 235.0\n", "3 130.0\n", "4 148.0\n", "Name: price, dtype: float64" ] }, "metadata": {}, "execution_count": 86 } ] }, { "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split\n", "X_train,X_test,y_train,y_test = train_test_split(X,y, test_size=0.2,random_state=10)" ], "metadata": { "id": "8Oazppuha2P6" }, "execution_count": 87, "outputs": [] }, { "cell_type": "code", "source": [ "from sklearn.linear_model import LinearRegression\n", "lr_clf =LinearRegression()\n", "lr_clf.fit(X_train,y_train)\n", "lr_clf.score(X_test,y_test)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7fYoIYfxbIpk", "outputId": "5223ac53-6c7b-47aa-b9df-595630266952" }, "execution_count": 88, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.8452277697874376" ] }, "metadata": {}, "execution_count": 88 } ] }, { "cell_type": "code", "source": [ "from sklearn.model_selection import ShuffleSplit\n", "from sklearn.model_selection import cross_val_score\n", "\n", "cv = ShuffleSplit(n_splits=5, test_size=0.2,random_state=0)\n", "\n", "cross_val_score(LinearRegression(),X,y,cv=cv)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yWFIEnivbd2s", "outputId": "7ad72eac-952a-469e-ddd4-abc0af0cede2" }, "execution_count": 90, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0.82430186, 0.77166234, 0.85089567, 0.80837764, 0.83653286])" ] }, "metadata": {}, "execution_count": 90 } ] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "from sklearn.model_selection import GridSearchCV, ShuffleSplit\n", "from sklearn.linear_model import LinearRegression, Lasso\n", "from sklearn.tree import DecisionTreeRegressor\n", "\n", "def find_best_model_using_gridsearchcv(X, y):\n", " algos = {\n", " 'linear_regression' : {\n", " 'model': LinearRegression(),\n", " 'params': {\n", " 'fit_intercept': [True, False],\n", " 'positive': [True, False]\n", " }\n", " },\n", " 'lasso': {\n", " 'model': Lasso(),\n", " 'params': {\n", " 'alpha': [1, 2],\n", " 'selection': ['random', 'cyclic']\n", " }\n", " },\n", " 'decision_tree': {\n", " 'model': DecisionTreeRegressor(),\n", " 'params': {\n", " 'criterion': ['squared_error', 'friedman_mse'],\n", " 'splitter': ['best', 'random']\n", " }\n", " }\n", " }\n", " scores = []\n", " cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)\n", " for algo_name, config in algos.items():\n", " gs = GridSearchCV(config['model'], config['params'], cv=cv, return_train_score=False)\n", " gs.fit(X, y)\n", " scores.append({\n", " 'model': algo_name,\n", " 'best_score': gs.best_score_,\n", " 'best_params': gs.best_params_\n", " })\n", "\n", " return pd.DataFrame(scores, columns=['model', 'best_score', 'best_params'])\n", "\n", "\n", "find_best_model_using_gridsearchcv(X,y)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 143 }, "id": "Aj_4nJe6cVms", "outputId": "70b4b163-455b-4be3-d8bf-64feb157edcc" }, "execution_count": 97, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " model best_score \\\n", "0 linear_regression 0.819001 \n", "1 lasso 0.687435 \n", "2 decision_tree 0.727427 \n", "\n", " best_params \n", "0 {'fit_intercept': False, 'positive': False} \n", "1 {'alpha': 1, 'selection': 'random'} \n", "2 {'criterion': 'squared_error', 'splitter': 'be... " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelbest_scorebest_params
0linear_regression0.819001{'fit_intercept': False, 'positive': False}
1lasso0.687435{'alpha': 1, 'selection': 'random'}
2decision_tree0.727427{'criterion': 'squared_error', 'splitter': 'be...
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"find_best_model_using_gridsearchcv(X,y)\",\n \"rows\": 3,\n \"fields\": [\n {\n \"column\": \"model\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"linear_regression\",\n \"lasso\",\n \"decision_tree\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"best_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.06744755911762175,\n \"min\": 0.6874345229925464,\n \"max\": 0.8190012023138117,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.8190012023138117,\n 0.6874345229925464,\n 0.7274268494498024\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"best_params\",\n \"properties\": {\n \"dtype\": \"object\",\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 97 } ] }, { "cell_type": "code", "source": [ "def predict_price(location,sqft,bath,bhk):\n", " loc_index = np.where(X.columns==location)[0][0]\n", "\n", " x = np.zeros(len(X.columns))\n", " x[0] = sqft\n", " x[1] = bath\n", " x[2] = bhk\n", " if loc_index >= 0:\n", " x[loc_index] = 1\n", "\n", " return lr_clf.predict([x])[0]" ], "metadata": { "id": "OPbolFxwfCIa" }, "execution_count": 98, "outputs": [] }, { "cell_type": "code", "source": [ "\n", "\n", "predict_price('1st Phase JP Nagar',1000, 2, 2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7ar6aML7fzLp", "outputId": "ac7a79cf-795d-44b1-e70a-aa92aa369144" }, "execution_count": 99, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/sklearn/base.py:439: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n", " warnings.warn(\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "83.49904677206221" ] }, "metadata": {}, "execution_count": 99 } ] }, { "cell_type": "markdown", "source": [ "## Export the tested model to a pickle file" ], "metadata": { "id": "R3htTqBXgLt1" } }, { "cell_type": "code", "source": [ "import pickle\n", "with open('banglore_home_prices_model.pickle','wb') as f:\n", " pickle.dump(lr_clf,f)" ], "metadata": { "id": "1VUSmWkLgO1b" }, "execution_count": 100, "outputs": [] }, { "cell_type": "code", "source": [ "import json\n", "columns = {\n", " 'data_columns' : [col.lower() for col in X.columns]\n", "}\n", "with open(\"columns.json\",\"w\") as f:\n", " f.write(json.dumps(columns))" ], "metadata": { "id": "WrTG7RTcgTYY" }, "execution_count": 101, "outputs": [] } ] }