{
"cells": [
{
"cell_type": "code",
"execution_count": 303,
"id": "b1466a2b-7ebf-46cf-8e7b-6ddcd6e3943f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"setup completed\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"print(\"setup completed\")"
]
},
{
"cell_type": "code",
"execution_count": 304,
"id": "73dd5430-3d6e-42fb-a065-4f89c09e33a6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" area_type \n",
" availability \n",
" location \n",
" size \n",
" society \n",
" total_sqft \n",
" bath \n",
" balcony \n",
" price \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Super built-up Area \n",
" 19-Dec \n",
" Electronic City Phase II \n",
" 2 BHK \n",
" Coomee \n",
" 1056 \n",
" 2.0 \n",
" 1.0 \n",
" 39.07 \n",
" \n",
" \n",
" 1 \n",
" Plot Area \n",
" Ready To Move \n",
" Chikka Tirupathi \n",
" 4 Bedroom \n",
" Theanmp \n",
" 2600 \n",
" 5.0 \n",
" 3.0 \n",
" 120.00 \n",
" \n",
" \n",
" 2 \n",
" Built-up Area \n",
" Ready To Move \n",
" Uttarahalli \n",
" 3 BHK \n",
" NaN \n",
" 1440 \n",
" 2.0 \n",
" 3.0 \n",
" 62.00 \n",
" \n",
" \n",
" 3 \n",
" Super built-up Area \n",
" Ready To Move \n",
" Lingadheeranahalli \n",
" 3 BHK \n",
" Soiewre \n",
" 1521 \n",
" 3.0 \n",
" 1.0 \n",
" 95.00 \n",
" \n",
" \n",
" 4 \n",
" Super built-up Area \n",
" Ready To Move \n",
" Kothanur \n",
" 2 BHK \n",
" NaN \n",
" 1200 \n",
" 2.0 \n",
" 1.0 \n",
" 51.00 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" area_type availability location size \\\n",
"0 Super built-up Area 19-Dec Electronic City Phase II 2 BHK \n",
"1 Plot Area Ready To Move Chikka Tirupathi 4 Bedroom \n",
"2 Built-up Area Ready To Move Uttarahalli 3 BHK \n",
"3 Super built-up Area Ready To Move Lingadheeranahalli 3 BHK \n",
"4 Super built-up Area Ready To Move Kothanur 2 BHK \n",
"\n",
" society total_sqft bath balcony price \n",
"0 Coomee 1056 2.0 1.0 39.07 \n",
"1 Theanmp 2600 5.0 3.0 120.00 \n",
"2 NaN 1440 2.0 3.0 62.00 \n",
"3 Soiewre 1521 3.0 1.0 95.00 \n",
"4 NaN 1200 2.0 1.0 51.00 "
]
},
"execution_count": 304,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1=pd.read_csv(r\"C:\\Users\\Suleman\\Downloads\\bengaluru_house_prices.csv\")\n",
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 305,
"id": "8b9e62d5-1da9-4b6d-b44d-f7895cbc3299",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['area_type',\n",
" 'availability',\n",
" 'location',\n",
" 'size',\n",
" 'society',\n",
" 'total_sqft',\n",
" 'bath',\n",
" 'balcony',\n",
" 'price']"
]
},
"execution_count": 305,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(df1.columns)"
]
},
{
"cell_type": "code",
"execution_count": 306,
"id": "4c71ab60-c27e-4f18-a2dc-fb99f5966f65",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 13320 entries, 0 to 13319\n",
"Data columns (total 9 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 area_type 13320 non-null object \n",
" 1 availability 13320 non-null object \n",
" 2 location 13319 non-null object \n",
" 3 size 13304 non-null object \n",
" 4 society 7818 non-null object \n",
" 5 total_sqft 13320 non-null object \n",
" 6 bath 13247 non-null float64\n",
" 7 balcony 12711 non-null float64\n",
" 8 price 13320 non-null float64\n",
"dtypes: float64(3), object(6)\n",
"memory usage: 936.7+ KB\n"
]
}
],
"source": [
"df1.info()"
]
},
{
"cell_type": "code",
"execution_count": 307,
"id": "7fdba158-bbd4-4c56-bfb1-5dee3dd3afc2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(13320, 9)"
]
},
"execution_count": 307,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.shape"
]
},
{
"cell_type": "markdown",
"id": "c20c75ec-5a29-4b8d-94b1-a86e0739578e",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
},
"source": [
"# data cleaning"
]
},
{
"cell_type": "code",
"execution_count": 308,
"id": "77246aca-87a4-429b-9aef-16b8cd5512b1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"area_type\n",
"Built-up Area 2418\n",
"Carpet Area 87\n",
"Plot Area 2025\n",
"Super built-up Area 8790\n",
"Name: area_type, dtype: int64"
]
},
"execution_count": 308,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# anlayzing columns wise\n",
"df1.groupby('area_type')['area_type'].count()"
]
},
{
"cell_type": "code",
"execution_count": 309,
"id": "54aba039-8995-4edf-b60f-5c377db08ff1",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" size \n",
" total_sqft \n",
" bath \n",
" price \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 2 BHK \n",
" 1056 \n",
" 2.0 \n",
" 39.07 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 4 Bedroom \n",
" 2600 \n",
" 5.0 \n",
" 120.00 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 3 BHK \n",
" 1440 \n",
" 2.0 \n",
" 62.00 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 3 BHK \n",
" 1521 \n",
" 3.0 \n",
" 95.00 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 2 BHK \n",
" 1200 \n",
" 2.0 \n",
" 51.00 \n",
" \n",
" \n",
"
\n",
"
"
],
"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"
]
},
"execution_count": 309,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2=df1.drop(['area_type','availability','society','balcony'],axis=1)\n",
"df2.head()"
]
},
{
"cell_type": "code",
"execution_count": 310,
"id": "fb5c0dc8-8526-4d1d-af25-b8bd0c2be7a5",
"metadata": {},
"outputs": [],
"source": [
"# data cleaning"
]
},
{
"cell_type": "code",
"execution_count": 311,
"id": "162d29e9-cebe-4816-a9db-e5aa5c4a858c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"location 1\n",
"size 16\n",
"total_sqft 0\n",
"bath 73\n",
"price 0\n",
"dtype: int64"
]
},
"execution_count": 311,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 312,
"id": "5e121802-493a-44b8-be09-cc56e898fe5d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" size \n",
" total_sqft \n",
" bath \n",
" price \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 2 BHK \n",
" 1056 \n",
" 2.0 \n",
" 39.07 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 4 Bedroom \n",
" 2600 \n",
" 5.0 \n",
" 120.00 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 3 BHK \n",
" 1440 \n",
" 2.0 \n",
" 62.00 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 3 BHK \n",
" 1521 \n",
" 3.0 \n",
" 95.00 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 2 BHK \n",
" 1200 \n",
" 2.0 \n",
" 51.00 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 13315 \n",
" Whitefield \n",
" 5 Bedroom \n",
" 3453 \n",
" 4.0 \n",
" 231.00 \n",
" \n",
" \n",
" 13316 \n",
" Richards Town \n",
" 4 BHK \n",
" 3600 \n",
" 5.0 \n",
" 400.00 \n",
" \n",
" \n",
" 13317 \n",
" Raja Rajeshwari Nagar \n",
" 2 BHK \n",
" 1141 \n",
" 2.0 \n",
" 60.00 \n",
" \n",
" \n",
" 13318 \n",
" Padmanabhanagar \n",
" 4 BHK \n",
" 4689 \n",
" 4.0 \n",
" 488.00 \n",
" \n",
" \n",
" 13319 \n",
" Doddathoguru \n",
" 1 BHK \n",
" 550 \n",
" 1.0 \n",
" 17.00 \n",
" \n",
" \n",
"
\n",
"
13246 rows × 5 columns
\n",
"
"
],
"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\n",
"... ... ... ... ... ...\n",
"13315 Whitefield 5 Bedroom 3453 4.0 231.00\n",
"13316 Richards Town 4 BHK 3600 5.0 400.00\n",
"13317 Raja Rajeshwari Nagar 2 BHK 1141 2.0 60.00\n",
"13318 Padmanabhanagar 4 BHK 4689 4.0 488.00\n",
"13319 Doddathoguru 1 BHK 550 1.0 17.00\n",
"\n",
"[13246 rows x 5 columns]"
]
},
"execution_count": 312,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3=df2.dropna()\n",
"df3"
]
},
{
"cell_type": "code",
"execution_count": 313,
"id": "a0ff32c5-c120-42e1-b037-0f7c67da153c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"location 0\n",
"size 0\n",
"total_sqft 0\n",
"bath 0\n",
"price 0\n",
"dtype: int64"
]
},
"execution_count": 313,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 314,
"id": "e7c8a42d-a9e2-4f96-849d-2c15ffb6f4a1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 13246\n",
"unique 31\n",
"top 2 BHK\n",
"freq 5198\n",
"Name: size, dtype: object"
]
},
"execution_count": 314,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3['size'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 315,
"id": "e6bab21c-8351-446c-b437-977fb636731b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"size\n",
"2 BHK 5198\n",
"3 BHK 4286\n",
"4 Bedroom 818\n",
"4 BHK 577\n",
"3 Bedroom 546\n",
"1 BHK 531\n",
"2 Bedroom 329\n",
"5 Bedroom 296\n",
"6 Bedroom 191\n",
"1 Bedroom 105\n",
"8 Bedroom 84\n",
"7 Bedroom 83\n",
"5 BHK 57\n",
"9 Bedroom 46\n",
"6 BHK 30\n",
"7 BHK 17\n",
"1 RK 13\n",
"10 Bedroom 12\n",
"9 BHK 8\n",
"8 BHK 5\n",
"11 BHK 2\n",
"11 Bedroom 2\n",
"10 BHK 2\n",
"14 BHK 1\n",
"13 BHK 1\n",
"12 Bedroom 1\n",
"27 BHK 1\n",
"43 Bedroom 1\n",
"16 BHK 1\n",
"19 BHK 1\n",
"18 Bedroom 1\n",
"Name: count, dtype: int64"
]
},
"execution_count": 315,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3['size'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 316,
"id": "d5d33cdc-117f-40e8-8b7a-c9c1ebbbf17f",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\AppData\\Local\\Temp\\ipykernel_18472\\4200255786.py:1: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df3['bhk']=df3['size'].apply(lambda x:int(x.split(' ')[0]))\n"
]
}
],
"source": [
"df3['bhk']=df3['size'].apply(lambda x:int(x.split(' ')[0]))"
]
},
{
"cell_type": "code",
"execution_count": 317,
"id": "b7389051-c124-4d4a-bc93-16f04e80fc3f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" size \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 2 BHK \n",
" 1056 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 4 Bedroom \n",
" 2600 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 3 BHK \n",
" 1440 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 3 BHK \n",
" 1521 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 2 BHK \n",
" 1200 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"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"
]
},
"execution_count": 317,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3.head()"
]
},
{
"cell_type": "code",
"execution_count": 318,
"id": "0db65d7e-b769-4e97-ad38-e64f6aceb844",
"metadata": {},
"outputs": [],
"source": [
"del(df3['size'])"
]
},
{
"cell_type": "code",
"execution_count": 319,
"id": "7ba08a59-e000-4299-918e-63b8afa4bf4d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 Electronic City Phase II 1056 2.0 39.07 2\n",
"1 Chikka Tirupathi 2600 5.0 120.00 4\n",
"2 Uttarahalli 1440 2.0 62.00 3\n",
"3 Lingadheeranahalli 1521 3.0 95.00 3\n",
"4 Kothanur 1200 2.0 51.00 2"
]
},
"execution_count": 319,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3.head()"
]
},
{
"cell_type": "code",
"execution_count": 320,
"id": "2e54d639-6d44-477b-b58e-5640a5a1c23a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 27, 43]"
]
},
"execution_count": 320,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(df3['bhk'].unique())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "415c0599-884c-46ef-a2b9-c12aa4d1811d",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "05866e64-d02a-4cc9-b784-1bffbbc31c52",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 321,
"id": "81c910a7-83b9-4764-9c7a-d891c03f84c7",
"metadata": {},
"outputs": [],
"source": [
"# next column TOTAL SQUAREFEET"
]
},
{
"cell_type": "code",
"execution_count": 322,
"id": "debc6643-e2d3-45ed-a780-e2d5b301a8d4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['1056', '2600', '1440', ..., '1133 - 1384', '774', '4689'],\n",
" dtype=object)"
]
},
"execution_count": 322,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3['total_sqft'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 323,
"id": "9da7f13e-dcb6-434e-87fa-4624417569b0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 Electronic City Phase II 1056 2.0 39.07 2\n",
"1 Chikka Tirupathi 2600 5.0 120.00 4\n",
"2 Uttarahalli 1440 2.0 62.00 3\n",
"3 Lingadheeranahalli 1521 3.0 95.00 3\n",
"4 Kothanur 1200 2.0 51.00 2"
]
},
"execution_count": 323,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df3.head()"
]
},
{
"cell_type": "code",
"execution_count": 324,
"id": "587c0371-2d9d-4d2f-8db9-bd3f5dabe5bb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"lets contvert the object type of 'total_sqft' into float,\\nso the concept is , any number having non numeric \\nor special characters won't be conveted in float\""
]
},
"execution_count": 324,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# some values are not in format eg:'1133 - 1384' etc\n",
"'''lets contvert the object type of 'total_sqft' into float,\n",
"so the concept is , any number having non numeric \n",
"or special characters won't be conveted in float'''"
]
},
{
"cell_type": "code",
"execution_count": 325,
"id": "4da1dd73-48de-4872-a174-381b57259117",
"metadata": {},
"outputs": [],
"source": [
"# create a function for above case\n",
"def is_float(val):\n",
" try:\n",
" float(val)\n",
" except:\n",
" return False\n",
" # we will return TRUE if the try executes\n",
" return True\n",
" "
]
},
{
"cell_type": "raw",
"id": "48aae4d5-ab50-4317-a71a-a849b05a9474",
"metadata": {},
"source": [
"# NOTE ::: ~(NEGATION) it will return opposite of retrived output"
]
},
{
"cell_type": "code",
"execution_count": 326,
"id": "59e7b8b9-4ee7-4d50-b4ca-4d661124dfb0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 30 \n",
" Yelahanka \n",
" 2100 - 2850 \n",
" 4.0 \n",
" 186.000 \n",
" 4 \n",
" \n",
" \n",
" 122 \n",
" Hebbal \n",
" 3067 - 8156 \n",
" 4.0 \n",
" 477.000 \n",
" 4 \n",
" \n",
" \n",
" 137 \n",
" 8th Phase JP Nagar \n",
" 1042 - 1105 \n",
" 2.0 \n",
" 54.005 \n",
" 2 \n",
" \n",
" \n",
" 165 \n",
" Sarjapur \n",
" 1145 - 1340 \n",
" 2.0 \n",
" 43.490 \n",
" 2 \n",
" \n",
" \n",
" 188 \n",
" KR Puram \n",
" 1015 - 1540 \n",
" 2.0 \n",
" 56.800 \n",
" 2 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 12975 \n",
" Whitefield \n",
" 850 - 1060 \n",
" 2.0 \n",
" 38.190 \n",
" 2 \n",
" \n",
" \n",
" 12990 \n",
" Talaghattapura \n",
" 1804 - 2273 \n",
" 3.0 \n",
" 122.000 \n",
" 3 \n",
" \n",
" \n",
" 13059 \n",
" Harlur \n",
" 1200 - 1470 \n",
" 2.0 \n",
" 72.760 \n",
" 2 \n",
" \n",
" \n",
" 13265 \n",
" Hoodi \n",
" 1133 - 1384 \n",
" 2.0 \n",
" 59.135 \n",
" 2 \n",
" \n",
" \n",
" 13299 \n",
" Whitefield \n",
" 2830 - 2882 \n",
" 5.0 \n",
" 154.500 \n",
" 4 \n",
" \n",
" \n",
"
\n",
"
190 rows × 5 columns
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"30 Yelahanka 2100 - 2850 4.0 186.000 4\n",
"122 Hebbal 3067 - 8156 4.0 477.000 4\n",
"137 8th Phase JP Nagar 1042 - 1105 2.0 54.005 2\n",
"165 Sarjapur 1145 - 1340 2.0 43.490 2\n",
"188 KR Puram 1015 - 1540 2.0 56.800 2\n",
"... ... ... ... ... ...\n",
"12975 Whitefield 850 - 1060 2.0 38.190 2\n",
"12990 Talaghattapura 1804 - 2273 3.0 122.000 3\n",
"13059 Harlur 1200 - 1470 2.0 72.760 2\n",
"13265 Hoodi 1133 - 1384 2.0 59.135 2\n",
"13299 Whitefield 2830 - 2882 5.0 154.500 4\n",
"\n",
"[190 rows x 5 columns]"
]
},
"execution_count": 326,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sqft_str=df3[~df3['total_sqft'].apply(is_float)]\n",
"sqft_str"
]
},
{
"cell_type": "code",
"execution_count": 327,
"id": "1a34e01e-e388-40d2-a010-708b22e907b8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['2100 - 2850',\n",
" '3067 - 8156',\n",
" '1042 - 1105',\n",
" '1145 - 1340',\n",
" '1015 - 1540',\n",
" '34.46Sq. Meter',\n",
" '1195 - 1440',\n",
" '4125Perch',\n",
" '1120 - 1145',\n",
" '3090 - 5002',\n",
" '1160 - 1195',\n",
" '1000Sq. Meter',\n",
" '1115 - 1130',\n",
" '1100Sq. Yards',\n",
" '520 - 645',\n",
" '1000 - 1285',\n",
" '650 - 665',\n",
" '633 - 666',\n",
" '5.31Acres',\n",
" '30Acres',\n",
" '1445 - 1455',\n",
" '884 - 1116',\n",
" '850 - 1093',\n",
" '716Sq. Meter',\n",
" '547.34 - 827.31',\n",
" '580 - 650',\n",
" '3425 - 3435',\n",
" '1804 - 2273',\n",
" '3630 - 3800',\n",
" '4000 - 5249',\n",
" '1500Sq. Meter',\n",
" '142.61Sq. Meter',\n",
" '1574Sq. Yards',\n",
" '1250 - 1305',\n",
" '670 - 980',\n",
" '1005.03 - 1252.49',\n",
" '1004 - 1204',\n",
" '361.33Sq. Yards',\n",
" '645 - 936',\n",
" '2710 - 3360',\n",
" '2830 - 2882',\n",
" '596 - 804',\n",
" '1255 - 1863',\n",
" '1300 - 1405',\n",
" '117Sq. Yards',\n",
" '934 - 1437',\n",
" '980 - 1030',\n",
" '2249.81 - 4112.19',\n",
" '1070 - 1315',\n",
" '3040Sq. Meter',\n",
" '500Sq. Yards',\n",
" '2806 - 3019',\n",
" '613 - 648',\n",
" '704 - 730',\n",
" '1210 - 1477',\n",
" '3369 - 3464',\n",
" '1125 - 1500',\n",
" '167Sq. Meter',\n",
" '1076 - 1199',\n",
" '381 - 535',\n",
" '524 - 894',\n",
" '540 - 670',\n",
" '315Sq. Yards',\n",
" '2725 - 3250',\n",
" '888 - 1290',\n",
" '660 - 700',\n",
" '385 - 440',\n",
" '770 - 841',\n",
" '3Cents',\n",
" '188.89Sq. Yards',\n",
" '1469 - 1766',\n",
" '204Sq. Meter',\n",
" '1255 - 1350',\n",
" '870 - 1080',\n",
" '45Sq. Yards',\n",
" '133.3Sq. Yards',\n",
" '2580 - 2591',\n",
" '2563 - 2733',\n",
" '605 - 624',\n",
" '1349 - 3324',\n",
" '78.03Sq. Meter',\n",
" '3300 - 3335',\n",
" '1180 - 1630',\n",
" '1365 - 1700',\n",
" '122Sq. Yards',\n",
" '84.53Sq. Meter',\n",
" '2.09Acres',\n",
" '981 - 1249',\n",
" '1565 - 1595',\n",
" '24Guntha',\n",
" '1270 - 1275',\n",
" '840 - 1010',\n",
" '697Sq. Meter',\n",
" '655 - 742',\n",
" '1408 - 1455',\n",
" '942 - 1117',\n",
" '598 - 958',\n",
" '1500Cents',\n",
" '132Sq. Yards',\n",
" '1010 - 1300',\n",
" '2Acres',\n",
" '1450 - 1950',\n",
" '1100Sq. Meter',\n",
" '15Acres',\n",
" '763 - 805',\n",
" '3307 - 3464',\n",
" '1.26Acres',\n",
" '620 - 934',\n",
" '2462 - 2467',\n",
" '540 - 740',\n",
" '3508 - 4201',\n",
" '4900 - 4940',\n",
" '755 - 770',\n",
" '664 - 722',\n",
" '151.11Sq. Yards',\n",
" '596 - 861',\n",
" '615 - 985',\n",
" '540 - 565',\n",
" '750 - 800',\n",
" '1660 - 1805',\n",
" '1079 - 1183',\n",
" '2800 - 2870',\n",
" '1230 - 1290',\n",
" '943 - 1220',\n",
" '2041 - 2090',\n",
" '527 - 639',\n",
" '1Grounds',\n",
" '1160 - 1315',\n",
" '706 - 716',\n",
" '2940Sq. Yards',\n",
" '45.06Sq. Meter',\n",
" '799 - 803',\n",
" '2470 - 2790',\n",
" '783 - 943',\n",
" '4500 - 5540',\n",
" '1255 - 1375',\n",
" '610 - 615',\n",
" '854 - 960',\n",
" '2650 - 2990',\n",
" '1.25Acres',\n",
" '86.72Sq. Meter',\n",
" '1230 - 1490',\n",
" '660 - 780',\n",
" '1150 - 1194',\n",
" '684 - 810',\n",
" '1510 - 1670',\n",
" '1550 - 1590',\n",
" '1235 - 1410',\n",
" '38Guntha',\n",
" '929 - 1078',\n",
" '2150 - 2225',\n",
" '1520 - 1759',\n",
" '629 - 1026',\n",
" '1215 - 1495',\n",
" '6Acres',\n",
" '1140 - 1250',\n",
" '2400 - 2600',\n",
" '1052 - 1322',\n",
" '5666 - 5669',\n",
" '712 - 938',\n",
" '1783 - 1878',\n",
" '120Sq. Yards',\n",
" '24Sq. Meter',\n",
" '2528 - 3188',\n",
" '650 - 760',\n",
" '1400 - 1421',\n",
" '4000 - 4450',\n",
" '142.84Sq. Meter',\n",
" '300Sq. Yards',\n",
" '1437 - 1629',\n",
" '850 - 1060',\n",
" '1200 - 1470',\n",
" '1133 - 1384']"
]
},
"execution_count": 327,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(sqft_str['total_sqft'].unique())"
]
},
{
"cell_type": "code",
"execution_count": 328,
"id": "e4243996-a554-4e85-b119-bff6eb093032",
"metadata": {},
"outputs": [],
"source": [
"''' convert ' - ' separateds range sqftarea values in a average '''\n",
"def convert_rangesqft_to_avg(x):\n",
" token=x.split('-')\n",
" if len(token)==2:\n",
" return (float(token[0])+float(token[1])) / 2\n",
" try :\n",
" return float(x)\n",
" except:\n",
" return None\n"
]
},
{
"cell_type": "raw",
"id": "22e122d4-3c27-4bb2-bac2-312b12186011",
"metadata": {},
"source": [
"'''it can also be done using lamda funcion '''\n",
"df3['total_sqft'].apply(lambda x:(float(x.split('-')[0])+ float(x.split('-')[1]))/2 )"
]
},
{
"cell_type": "code",
"execution_count": 329,
"id": "21f87e4d-0804-47c4-b397-302a48838b65",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1258.5"
]
},
"execution_count": 329,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"convert_rangesqft_to_avg('1133 - 1384')"
]
},
{
"cell_type": "code",
"execution_count": 330,
"id": "b317c3a5-567a-4f61-a5f1-28940bff8116",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056.0 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600.0 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440.0 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521.0 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200.0 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 Electronic City Phase II 1056.0 2.0 39.07 2\n",
"1 Chikka Tirupathi 2600.0 5.0 120.00 4\n",
"2 Uttarahalli 1440.0 2.0 62.00 3\n",
"3 Lingadheeranahalli 1521.0 3.0 95.00 3\n",
"4 Kothanur 1200.0 2.0 51.00 2"
]
},
"execution_count": 330,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df4=df3.copy()\n",
"df4['total_sqft']=df4['total_sqft'].apply(convert_rangesqft_to_avg)\n",
"df4.head()"
]
},
{
"cell_type": "code",
"execution_count": 331,
"id": "a09ed299-1f50-4acf-8c61-fb5814f29ef9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1056. , 2600. , 1440. , ..., 1258.5, 774. , 4689. ])"
]
},
"execution_count": 331,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df4['total_sqft'].unique()\n"
]
},
{
"cell_type": "code",
"execution_count": 332,
"id": "2adee661-e098-454d-9232-986a12e47852",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056.0 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600.0 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440.0 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 Electronic City Phase II 1056.0 2.0 39.07 2\n",
"1 Chikka Tirupathi 2600.0 5.0 120.00 4\n",
"2 Uttarahalli 1440.0 2.0 62.00 3"
]
},
"execution_count": 332,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df4.head(3)"
]
},
{
"cell_type": "markdown",
"id": "f3bdbea5-0d19-4bc2-a4e0-85ae23899e78",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
},
"source": [
"# feature engineering`"
]
},
{
"cell_type": "code",
"execution_count": 333,
"id": "393bacbb-2904-4380-a979-a314c716265a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056.0 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600.0 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440.0 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521.0 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200.0 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 Electronic City Phase II 1056.0 2.0 39.07 2\n",
"1 Chikka Tirupathi 2600.0 5.0 120.00 4\n",
"2 Uttarahalli 1440.0 2.0 62.00 3\n",
"3 Lingadheeranahalli 1521.0 3.0 95.00 3\n",
"4 Kothanur 1200.0 2.0 51.00 2"
]
},
"execution_count": 333,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df5=df4.copy()\n",
"df5.head()"
]
},
{
"cell_type": "code",
"execution_count": 334,
"id": "5bd9e70e-dcda-444c-b7b7-7ffb605633f2",
"metadata": {},
"outputs": [],
"source": [
"# now let's create a new column for per_sqft_price"
]
},
{
"cell_type": "code",
"execution_count": 335,
"id": "d90046fd-7bb8-4423-99dc-87e61d422979",
"metadata": {},
"outputs": [],
"source": [
"df5['price_per_sqft']=df5['price']*100000/df5['total_sqft']"
]
},
{
"cell_type": "code",
"execution_count": 336,
"id": "4ad4f875-f73a-477c-936d-a8ec36684fa2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056.0 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" 3699.810606 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600.0 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" 4615.384615 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440.0 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" 4305.555556 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521.0 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" 6245.890861 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200.0 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" 4250.000000 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 13315 \n",
" Whitefield \n",
" 3453.0 \n",
" 4.0 \n",
" 231.00 \n",
" 5 \n",
" 6689.834926 \n",
" \n",
" \n",
" 13316 \n",
" Richards Town \n",
" 3600.0 \n",
" 5.0 \n",
" 400.00 \n",
" 4 \n",
" 11111.111111 \n",
" \n",
" \n",
" 13317 \n",
" Raja Rajeshwari Nagar \n",
" 1141.0 \n",
" 2.0 \n",
" 60.00 \n",
" 2 \n",
" 5258.545136 \n",
" \n",
" \n",
" 13318 \n",
" Padmanabhanagar \n",
" 4689.0 \n",
" 4.0 \n",
" 488.00 \n",
" 4 \n",
" 10407.336319 \n",
" \n",
" \n",
" 13319 \n",
" Doddathoguru \n",
" 550.0 \n",
" 1.0 \n",
" 17.00 \n",
" 1 \n",
" 3090.909091 \n",
" \n",
" \n",
"
\n",
"
13246 rows × 6 columns
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk price_per_sqft\n",
"0 Electronic City Phase II 1056.0 2.0 39.07 2 3699.810606\n",
"1 Chikka Tirupathi 2600.0 5.0 120.00 4 4615.384615\n",
"2 Uttarahalli 1440.0 2.0 62.00 3 4305.555556\n",
"3 Lingadheeranahalli 1521.0 3.0 95.00 3 6245.890861\n",
"4 Kothanur 1200.0 2.0 51.00 2 4250.000000\n",
"... ... ... ... ... ... ...\n",
"13315 Whitefield 3453.0 4.0 231.00 5 6689.834926\n",
"13316 Richards Town 3600.0 5.0 400.00 4 11111.111111\n",
"13317 Raja Rajeshwari Nagar 1141.0 2.0 60.00 2 5258.545136\n",
"13318 Padmanabhanagar 4689.0 4.0 488.00 4 10407.336319\n",
"13319 Doddathoguru 550.0 1.0 17.00 1 3090.909091\n",
"\n",
"[13246 rows x 6 columns]"
]
},
"execution_count": 336,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df5"
]
},
{
"cell_type": "code",
"execution_count": 337,
"id": "3a38acb7-3bc9-47ff-b398-36b37a451928",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1304"
]
},
"execution_count": 337,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df5.location.unique())"
]
},
{
"cell_type": "code",
"execution_count": 338,
"id": "72675c51-61e5-4bcd-9b7c-12ce4ef5991b",
"metadata": {},
"outputs": [
{
"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"
]
},
"execution_count": 338,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# trimming trailing spaces for better accuracy\n",
"df5.location=df5.location.apply(lambda x:x.strip())\n",
"location_stats=df5.groupby('location')['location'].agg('count').sort_values(ascending=False)\n",
"location_stats"
]
},
{
"cell_type": "code",
"execution_count": 339,
"id": "b14b70d7-ff5a-48b4-b76b-43d517d2ab7b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1052"
]
},
"execution_count": 339,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(location_stats[location_stats<=10])"
]
},
{
"cell_type": "code",
"execution_count": 340,
"id": "af863070-0040-46a7-a1c9-0fe3cd310360",
"metadata": {},
"outputs": [
{
"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"
]
},
"execution_count": 340,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"location_stats_lessthan_10=location_stats[location_stats<=10]\n",
"location_stats_lessthan_10"
]
},
{
"cell_type": "code",
"execution_count": 341,
"id": "8a122e9d-9e5d-411e-9506-1be9f20ccbc5",
"metadata": {},
"outputs": [],
"source": [
"# lets consider this 1052 multiple location with <10 occurance as 'others'"
]
},
{
"cell_type": "code",
"execution_count": 342,
"id": "244b6d06-1ed8-4f2a-baff-af43328c90f2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1293"
]
},
"execution_count": 342,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#cheak out \n",
"len(df5.location.unique())"
]
},
{
"cell_type": "code",
"execution_count": 343,
"id": "485630ec-bc8c-4a61-8f56-a5a965d4c53a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"242"
]
},
"execution_count": 343,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df5.location=df5.location.apply(lambda x : 'other' if x in location_stats_lessthan_10 else x)\n",
"np.sort(df5.location.unique())\n",
"len(df5.location.unique())"
]
},
{
"cell_type": "code",
"execution_count": 344,
"id": "85a273b8-9758-422b-8a51-57784fc9ebae",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" 11776 \n",
" Kambipura \n",
" 883.0 \n",
" 2.0 \n",
" 49.0 \n",
" 2 \n",
" 5549.263873 \n",
" \n",
" \n",
" 1888 \n",
" other \n",
" 1188.0 \n",
" 2.0 \n",
" 73.0 \n",
" 2 \n",
" 6144.781145 \n",
" \n",
" \n",
" 2091 \n",
" Whitefield \n",
" 1485.0 \n",
" 2.0 \n",
" 90.0 \n",
" 2 \n",
" 6060.606061 \n",
" \n",
" \n",
" 4635 \n",
" Whitefield \n",
" 2928.0 \n",
" 4.0 \n",
" 198.0 \n",
" 4 \n",
" 6762.295082 \n",
" \n",
" \n",
" 11501 \n",
" Kanakpura Road \n",
" 1100.0 \n",
" 3.0 \n",
" 53.0 \n",
" 3 \n",
" 4818.181818 \n",
" \n",
" \n",
" 2176 \n",
" KR Puram \n",
" 750.0 \n",
" 2.0 \n",
" 25.0 \n",
" 2 \n",
" 3333.333333 \n",
" \n",
" \n",
" 2994 \n",
" Ramamurthy Nagar \n",
" 1330.0 \n",
" 4.0 \n",
" 140.0 \n",
" 3 \n",
" 10526.315789 \n",
" \n",
" \n",
" 1407 \n",
" Nagasandra \n",
" 4050.0 \n",
" 5.0 \n",
" 140.0 \n",
" 5 \n",
" 3456.790123 \n",
" \n",
" \n",
" 10882 \n",
" Marathahalli \n",
" 1170.0 \n",
" 2.0 \n",
" 85.0 \n",
" 2 \n",
" 7264.957265 \n",
" \n",
" \n",
" 3062 \n",
" Rajaji Nagar \n",
" 1800.0 \n",
" 3.0 \n",
" 260.0 \n",
" 3 \n",
" 14444.444444 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk price_per_sqft\n",
"11776 Kambipura 883.0 2.0 49.0 2 5549.263873\n",
"1888 other 1188.0 2.0 73.0 2 6144.781145\n",
"2091 Whitefield 1485.0 2.0 90.0 2 6060.606061\n",
"4635 Whitefield 2928.0 4.0 198.0 4 6762.295082\n",
"11501 Kanakpura Road 1100.0 3.0 53.0 3 4818.181818\n",
"2176 KR Puram 750.0 2.0 25.0 2 3333.333333\n",
"2994 Ramamurthy Nagar 1330.0 4.0 140.0 3 10526.315789\n",
"1407 Nagasandra 4050.0 5.0 140.0 5 3456.790123\n",
"10882 Marathahalli 1170.0 2.0 85.0 2 7264.957265\n",
"3062 Rajaji Nagar 1800.0 3.0 260.0 3 14444.444444"
]
},
"execution_count": 344,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df5.sample(10)"
]
},
{
"cell_type": "markdown",
"id": "a7dcd423-07de-4cfb-b507-461b0037cf65",
"metadata": {},
"source": [
"# OUTLIER DETECTION AND REMOVAL"
]
},
{
"cell_type": "raw",
"id": "f762e08a-f88b-44ae-93aa-ef58244f1135",
"metadata": {},
"source": [
"''' lets say for instance ,\n",
"every 1 bhk takes some x sqft to build \n",
"and there might be some property which has more bhks in less than minimum space or thrshold\n",
"note: it may be error or wrong entry'''"
]
},
{
"cell_type": "raw",
"id": "385021e0-438c-4028-af9a-27c63eab78bb",
"metadata": {},
"source": [
"# tip: around 300 sqft for 1bhk (rough estimate)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b41262ed-745d-4415-975a-f33cb150041e",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 345,
"id": "996d1339-b024-46c1-bdc8-c22a4bebbe63",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 13200.000000 \n",
" 13246.000000 \n",
" 13246.000000 \n",
" 13246.000000 \n",
" 1.320000e+04 \n",
" \n",
" \n",
" mean \n",
" 1555.302783 \n",
" 2.692586 \n",
" 112.389392 \n",
" 2.801902 \n",
" 7.920759e+03 \n",
" \n",
" \n",
" std \n",
" 1237.323445 \n",
" 1.341506 \n",
" 149.076587 \n",
" 1.295758 \n",
" 1.067272e+05 \n",
" \n",
" \n",
" min \n",
" 1.000000 \n",
" 1.000000 \n",
" 8.000000 \n",
" 1.000000 \n",
" 2.678298e+02 \n",
" \n",
" \n",
" 25% \n",
" 1100.000000 \n",
" 2.000000 \n",
" 50.000000 \n",
" 2.000000 \n",
" 4.267701e+03 \n",
" \n",
" \n",
" 50% \n",
" 1275.000000 \n",
" 2.000000 \n",
" 72.000000 \n",
" 3.000000 \n",
" 5.438331e+03 \n",
" \n",
" \n",
" 75% \n",
" 1672.000000 \n",
" 3.000000 \n",
" 120.000000 \n",
" 3.000000 \n",
" 7.317073e+03 \n",
" \n",
" \n",
" max \n",
" 52272.000000 \n",
" 40.000000 \n",
" 3600.000000 \n",
" 43.000000 \n",
" 1.200000e+07 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" total_sqft bath price bhk price_per_sqft\n",
"count 13200.000000 13246.000000 13246.000000 13246.000000 1.320000e+04\n",
"mean 1555.302783 2.692586 112.389392 2.801902 7.920759e+03\n",
"std 1237.323445 1.341506 149.076587 1.295758 1.067272e+05\n",
"min 1.000000 1.000000 8.000000 1.000000 2.678298e+02\n",
"25% 1100.000000 2.000000 50.000000 2.000000 4.267701e+03\n",
"50% 1275.000000 2.000000 72.000000 3.000000 5.438331e+03\n",
"75% 1672.000000 3.000000 120.000000 3.000000 7.317073e+03\n",
"max 52272.000000 40.000000 3600.000000 43.000000 1.200000e+07"
]
},
"execution_count": 345,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# outlier exist only in numerical columns\n",
"df5.describe()\n",
"# these are the columns 'total_sqft', 'bath', 'price', 'bhk', 'price_per_sqft' having outliers"
]
},
{
"cell_type": "code",
"execution_count": 346,
"id": "2c1eeeef-4f2c-42b7-98d1-6ad3213eca30",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"600.000000 531\n",
"500.000000 336\n",
"550.000000 260\n",
"400.000000 255\n",
"450.000000 194\n",
" ... \n",
"1193.333333 1\n",
"615.250000 1\n",
"137.500000 1\n",
"718.500000 1\n",
"1172.250000 1\n",
"Name: count, Length: 2107, dtype: int64"
]
},
"execution_count": 346,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"min_sqft=df5['total_sqft']/df5['bhk']\n",
"counts=(min_sqft.value_counts())\n",
"counts"
]
},
{
"cell_type": "code",
"execution_count": 347,
"id": "18337aa6-fb2a-4439-bf5d-cbc87834372d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 13200.000000\n",
"mean 573.847262\n",
"std 388.079980\n",
"min 0.250000\n",
"25% 473.000000\n",
"50% 552.000000\n",
"75% 625.000000\n",
"max 26136.000000\n",
"dtype: float64"
]
},
"execution_count": 347,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"min_sqft.describe()"
]
},
{
"cell_type": "code",
"execution_count": 348,
"id": "b303b726-912a-4a14-92ed-6b51079a74ec",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9 170.000000\n",
"45 75.000000\n",
"58 234.500000\n",
"68 168.750000\n",
"70 166.666667\n",
" ... \n",
"13277 200.000000\n",
"13279 200.000000\n",
"13281 275.000000\n",
"13303 154.800000\n",
"13311 214.285714\n",
"Length: 744, dtype: float64"
]
},
"execution_count": 348,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# properties with 1bhk in less than 300 sqft are abnormal\n",
"min_sqft.loc[(min_sqft<300)]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0615a1e5-9311-415e-9a2a-466b7264cadd",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 349,
"id": "7cf2944f-4094-4502-9612-52cc56513752",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Electronic City Phase II \n",
" 1056.0 \n",
" 2.0 \n",
" 39.07 \n",
" 2 \n",
" 3699.810606 \n",
" \n",
" \n",
" 1 \n",
" Chikka Tirupathi \n",
" 2600.0 \n",
" 5.0 \n",
" 120.00 \n",
" 4 \n",
" 4615.384615 \n",
" \n",
" \n",
" 2 \n",
" Uttarahalli \n",
" 1440.0 \n",
" 2.0 \n",
" 62.00 \n",
" 3 \n",
" 4305.555556 \n",
" \n",
" \n",
" 3 \n",
" Lingadheeranahalli \n",
" 1521.0 \n",
" 3.0 \n",
" 95.00 \n",
" 3 \n",
" 6245.890861 \n",
" \n",
" \n",
" 4 \n",
" Kothanur \n",
" 1200.0 \n",
" 2.0 \n",
" 51.00 \n",
" 2 \n",
" 4250.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk price_per_sqft\n",
"0 Electronic City Phase II 1056.0 2.0 39.07 2 3699.810606\n",
"1 Chikka Tirupathi 2600.0 5.0 120.00 4 4615.384615\n",
"2 Uttarahalli 1440.0 2.0 62.00 3 4305.555556\n",
"3 Lingadheeranahalli 1521.0 3.0 95.00 3 6245.890861\n",
"4 Kothanur 1200.0 2.0 51.00 2 4250.000000"
]
},
"execution_count": 349,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"df6=df5[~(df5.total_sqft/df5.bhk<300)]\n",
"df6.head()\n",
"#df6 dataframe has all properties with not less 300 sqft ( ~ )"
]
},
{
"cell_type": "code",
"execution_count": 350,
"id": "d718a827-36d9-4f16-82a6-93ed3533212b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"13246"
]
},
"execution_count": 350,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df5.shape[0]"
]
},
{
"cell_type": "code",
"execution_count": 351,
"id": "5125c73b-ad76-4613-a4aa-77fa193d39a0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"12502"
]
},
"execution_count": 351,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df6.shape[0]\n",
"# seem we have remove outliers to some extent ie 744 entries"
]
},
{
"cell_type": "code",
"execution_count": 352,
"id": "ccc39d4d-bd52-42d6-9850-775edc155d9b",
"metadata": {},
"outputs": [],
"source": [
"# for per_sqft columns"
]
},
{
"cell_type": "code",
"execution_count": 353,
"id": "72ffc9dc-76db-43f8-9efc-9ba84009c0ce",
"metadata": {},
"outputs": [
{
"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"
]
},
"execution_count": 353,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df6.price_per_sqft.describe()\n",
"# min and max per_sqft price is 267 rupees and 176k rupees per sqft , thats possibly abnormal"
]
},
{
"cell_type": "code",
"execution_count": 354,
"id": "ef2b7425-ad90-4a5b-8533-e19dbf97d255",
"metadata": {},
"outputs": [],
"source": [
"# for above stats lets filterout based on locations std deviation"
]
},
{
"cell_type": "code",
"execution_count": 355,
"id": "d9e4d72e-309e-48c8-8090-19e7c964850c",
"metadata": {},
"outputs": [],
"source": [
"def remove_pps_outliers(df):\n",
" df_out=pd.DataFrame()\n",
" for key,subdf in df.groupby('location'):\n",
" # key=location ,subdf= corresponding columns next to each location \n",
" # this loop will iterate rows for each location to location \n",
" meann=np.mean(subdf.price_per_sqft)\n",
" stdd=np.std(subdf.price_per_sqft)\n",
" in_deviation_range=subdf[(subdf.price_per_sqft>(meann-stdd)) & (subdf.price_per_sqft<=(meann+stdd))]\n",
" df_out=pd.concat([df_out,in_deviation_range],ignore_index=True)\n",
" return df_out\n"
]
},
{
"cell_type": "code",
"execution_count": 356,
"id": "20f035cb-68d8-44dd-b4dc-87de5aadf957",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(10241, 6)"
]
},
"execution_count": 356,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df7=remove_pps_outliers(df6)\n",
"df7.shape"
]
},
{
"cell_type": "code",
"execution_count": 357,
"id": "cd096c35-1ce0-422b-b1d4-814a5a163814",
"metadata": {},
"outputs": [],
"source": [
"# cheak whether price of 3bhk is less than 2bhk "
]
},
{
"cell_type": "markdown",
"id": "30807534-0899-4973-892d-3179029f497d",
"metadata": {},
"source": [
" # visualize it"
]
},
{
"cell_type": "code",
"execution_count": 358,
"id": "c0100bab-3454-496c-b2f3-8208ca4044bc",
"metadata": {},
"outputs": [],
"source": [
"def scatt_plot(df,location):\n",
" bhk2=df[(df.location==location) & (df.bhk==2)]\n",
" bhk3=df[(df.location==location) & (df.bhk==3)]\n",
" sns.scatterplot(data=bhk2,x='total_sqft',y='price',label='2bhk')\n",
" sns.scatterplot(data=bhk3,x='total_sqft',y='price',label='3bhk')\n",
" plt.title(location)\n",
" plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 359,
"id": "f5f475f3-c5d3-4616-a78f-1b35417b1e83",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHFCAYAAAAT5Oa6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNRElEQVR4nO3de3gTVcI/8G9om16T0Db0Elq5FhRLkQVeKbIFKVdFBOoLC6xSYV0V6SsCKzd3xcvSgiIi7uKusrDqCqhcVUAQKEUBhQpbUJCKIJe2lGCbtKVt0vb8/sivkTTphTbpJJnv53nyrJlzZnJmnm7yZc45cxRCCAEiIiIiGWsjdQOIiIiIpMZARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BERPVat24dFAqF9eXr64vo6Gj87ne/Q25ubrOP27FjR6Smpjpl3wsXLkChUGDdunUN7ldbT6FQYMOGDXblixcvhkKhgF6vb1a7iMiz+UrdACJyf2vXrsXtt9+OiooKfPXVV/jrX/+K/fv348yZMwgNDb3l423ZsgVqtbpZbam7b3R0NA4fPowuXbo0+RiLFi1CSkoK/Pz8mtUGIvI+vENERI2Kj49H//79MXjwYCxatAjz589HYWEhtm7d2qzj9e7d+5YCTEP7+vv7o3///mjXrl2T9h81ahR++uknvPXWW836fCnduHFD6iYQeS0GIiK6ZX379gUAXL161bqtoqICc+bMwV133QWNRoOwsDAkJiZi27ZtdvvX7fZqyb5N7TKrNWTIEIwYMQIvvfQSSkpKGqy7Z88ePPjgg4iJiUFAQAC6du2Kxx9/3GG32rZt25CQkAB/f3907twZK1eutHbD3exvf/sbkpKSEBERgeDgYPTs2RPLli2D2Wy2qTd48GDEx8cjKysLAwYMQFBQEKZNm9akcySiW8cuMyK6ZefPnwcAdOvWzbqtsrISv/zyC+bOnYv27dvDZDLhiy++wPjx47F27Vo88sgj9R6vJfs2x9KlS9G7d2+88sorePHFF+utd+7cOSQmJuIPf/gDNBoNLly4gNdeew0DBw7EyZMnrV1uu3btwvjx45GUlISNGzeiqqoKr776qk1gvPmYkydPRqdOnaBUKvHf//4Xf/3rX3HmzBn861//sqmbn5+P3//+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CzAQERERuYonrQ/mSW11AQYiIiIiV/Gk9cE8qa0uwEBERETkKk1ZH6y8CNCfBS4fA/S50o3V4VpmRERE5BKNrQ9mKgc+mga82Q94Jxl4sy/w8XTLbC93a6uXT73nk6rBJ1UTEZGL2TzbR/3r3ZaPpjkeyNwl2bKmmBQhxFFb3TQMOfP3m88hIiIicjVH64PpzzY+q0uKICLTtczYZUZERCQFmc/qcje8Q0RERCQFV83qkunSGy3FQERERCSF2lld5/balzV3VpeMl95oKXaZERERScHZs7pkvvRGS/EOERERkVQ07S2zyZwxq6spS2+w66xeDERERERSctasLg7SbhF2mREREXkDmS+90VIMRERERN5A5ktvtBQDERERkTeQ+dIbLcUxRERERN7CmYO0ZYaBiIiIyJvIdOmNlmKXGREREcke7xARERG5GpfTcHsMRERERK7E5TQ8ArvMiIiIXIXLaXgMBiIiIiJXacpyGuQWGIiIiIhchctpeAwGIiIiIlfhchoeg4GIiIjIVbichsdgICIiInIVLqfhMTjtnoiIyJW4nIZHYCAiIiJyNS6n4fbYZUZERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyJ2kgWr16NRISEqBWq6FWq5GYmIidO3day4UQWLx4MXQ6HQIDAzF48GB89913NseorKxEWloatFotgoODMWbMGFy+fLm1T4WIiIg8mKSBKCYmBhkZGTh27BiOHTuGIUOG4MEHH7SGnmXLluG1117Dm2++iaNHjyIqKgrDhg1DSUmJ9RizZs3Cli1bsGHDBnz55ZcoLS3F6NGjUV1dLdVpERERkYdRCCGE1I24WVhYGF555RVMmzYNOp0Os2bNwrx58wBY7gZFRkZi6dKlePzxx2EwGNCuXTu89957mDhxIgAgLy8PsbGx2LFjB0aMGNGkzzQajdBoNDAYDFCr1S47NyIiInIeZ/5+u80YourqamzYsAFlZWVITEzE+fPnUVBQgOHDh1vr+Pv7Y9CgQTh06BAAIDs7G2az2aaOTqdDfHy8tY4jlZWVMBqNNi8iIiKSL8kD0cmTJxESEgJ/f3888cQT2LJlC3r06IGCggIAQGRkpE39yMhIa1lBQQGUSiVCQ0PrreNIeno6NBqN9RUbG+vksyIiIiJPInkg6t69O06cOIEjR47gySefxNSpU/H9999byxUKhU19IYTdtroaq7NgwQIYDAbr69KlSy07CSIiIvJokgcipVKJrl27om/fvkhPT0evXr2wcuVKREVFAYDdnZ7CwkLrXaOoqCiYTCYUFRXVW8cRf39/68y22hcRERHJl+SBqC4hBCorK9GpUydERUVhz5491jKTyYQDBw5gwIABAIA+ffrAz8/Ppk5+fj5OnTplrUNERETUGF8pP3zhwoUYNWoUYmNjUVJSgg0bNiAzMxO7du2CQqHArFmzsGTJEsTFxSEuLg5LlixBUFAQJk+eDADQaDSYPn065syZg/DwcISFhWHu3Lno2bMnhg4dKuWpERERkQeRNBBdvXoVDz/8MPLz86HRaJCQkIBdu3Zh2LBhAIBnn30W5eXlmDFjBoqKinD33Xdj9+7dUKlU1mOsWLECvr6+mDBhAsrLy5GcnIx169bBx8dHqtMiIiIiD+N2zyGSAp9DRERE5Hm88jlERERERFJhICIiIiLZk3QMERF5BsMNE/SlJhgrzFAH+kEbrIQmSCl1s4iInIaBiIgalFdcjnmbcnAwV2/dlhSnRUZKAnRtAyVsGRGR87DLjIjqZbhhsgtDAJCVq8f8TTkw3DBJ1DIiIudiICKieulLTXZhqFZWrh76UgYiIvIOzQ5E7733Hu655x7odDr8/PPPAIDXX38d27Ztc1rjiEhaxgpzg+UljZQTEXmKZgWi1atXY/bs2bjvvvtQXFyM6upqAEDbtm3x+uuvO7N9RCQhdYBfg+WqRsqJiDxFswLRqlWr8Pbbb2PRokU2T4Tu27cvTp486bTGEZG0tCFKJMVpHZYlxWmhDeFMMyLyDs0KROfPn0fv3r3ttvv7+6OsrKzFjSIi96AJUiIjJcEuFCXFabE0JYFT74nIazRr2n2nTp1w4sQJdOjQwWb7zp070aNHD6c0jIjcg65tIFZN6g19qQklFWaoAvygDeFziIjIuzQrEP3pT3/CU089hYqKCggh8M0332D9+vVIT0/HO++84+w2EpHENEEMQETk3ZoViB599FFUVVXh2WefxY0bNzB58mS0b98eK1euxO9+9ztnt5GIiIjIpVq82r1er0dNTQ0iIiKc1aZWx9XuiYiIPI8zf7+bdYfo/PnzqKqqQlxcHLTaXwdb5ubmws/PDx07dmxRo4iIiIhaU7NmmaWmpuLQoUN227/++mukpqa2tE1ERERErapZgej48eO455577Lb3798fJ06caGmbiIiIiFpVs7rMFAoFSkpK7LYbDAbrU6uJyHsYbpigLzXBWGGGOtAP2mDOOiMi79KsQPTb3/4W6enpWL9+vfVJ1dXV1UhPT8fAgQOd2kAiklZecbndivdJcVpkpCRA1zZQwpYRETlPs2aZff/990hKSkLbtm3x29/+FgBw8OBBGI1G7Nu3D/Hx8U5vqCtxlhmRY4YbJsxcf9zhivdJcVqsmtSbd4qISDLO/P1u1hiiHj16ICcnBxMmTEBhYSFKSkrwyCOP4MyZMx4XhoiofvpSk8MwBABZuXroS02t3CIiItdoVpcZAOh0OixZssSZbSEiN2OsMDdYXtJIORGRp2hyIMrJyUF8fDzatGmDnJycBusmJCS0uGFEJD11gF+D5apGyomIPEWTA9Fdd92FgoICRERE4K677oJCoYCj4UcKhYIzzYi8hDZEiaQ4LbLqGUOkDeH4ISLyDk0OROfPn0e7du2s/01E3k8TpERGSgLmb8qxCUVJcVosTUnggGoi8hq3PMvMbDbjj3/8I/785z+jc+fOrmpXq+IsM/Jo5UVA2TWgwggEaIBgLRAY6tSPqH0OUUmFGaoAP2hD+BwiIpKeM3+/mzXtvm3btvj2228ZiIikZrgCbJsJ/LTv121dkoExqwBNe+naRUTUCiSfdj9u3Dhs3bq1RR9MRC1UXmQfhgDg3F5ge5qlnIiImqRZ0+67du2Kl156CYcOHUKfPn0QHBxsU/5///d/TmkcETWg7Jp9GKp1bq+l3MldZ0RE3qpZgeidd95B27ZtkZ2djezsbJsyhULBQETUGiqMLSsnIiKrZgWim2eZ1Q5BUigUzmkRETVNQCP95Y2VExGRVbPGEAHAmjVrEB8fj4CAAAQEBCA+Ph7vvPOOM9tGRA0JbmcZQO1Il2RLORERNUmz7hD9+c9/xooVK5CWlobExEQAwOHDh/HMM8/gwoULePnll53aSCJyIDDUMptse5plzFCt2llmbjJ+qHbKvrHCDHWgH7TBnLJPRO6nWdPutVotVq1ahUmTJtlsX79+PdLS0qDXO14M0l1x2j15LEMe8OMeQBUJVFUCvv5AyVWg6zBAo5O6dcgrLse8TTk2C8QmxWmRkZIAXdtACVtGRN7Amb/fzbpDVF1djb59+9pt79OnD6qqqlrUICJqovIiYNtTjmeadUkGHloj6V0iww2TXRgCgKxcPeZvysGqSb0d3ylqhQdNEhHV1awxRL///e+xevVqu+3//Oc/MWXKlBY3ioiaoCnT7iWkLzXZhaFaWbl66EtN9gWGK8BH04A3+wHvJANv9gU+nm7ZTkTkQs26QwRYBlXv3r0b/fv3BwAcOXIEly5dwiOPPILZs2db67322mstbyUR2XPzaffGCnOD5SV1yxt70KTEd7yIyLs1KxCdOnUKv/nNbwAA586dAwC0a9cO7dq1w6lTp6z1OBWfyIXcfNq9OsCvwXJV3XI+aJKIJNSsQLR//35nt4OIblXttPubZ5jVcoNp99oQJZLitMhy0G2WFKeFNqTO+CE3v+NFRN6t2c8hIiKJ1U67r/ssIjeZdq8JUiIjJQFJcVqb7UlxWixNSbAfUO3md7yIyLs1ewwREbkBTXvL2BrrrCy15c6Qm3Qt6doGYtWk3tCXmlBSYYYqwA/akHqeQ+Tmd7yIyLsxEBF5usBQtwlAjmiCmvggRg950CQReScGIiJyH25+x4uIvBcDERG5Fze/40VE3omBiMjT8cnOREQtJukss/T0dPTr1w8qlQoREREYO3YsfvjhB5s6qampUCgUNq/ah0HWqqysRFpaGrRaLYKDgzFmzBhcvny5NU+FSBre+GTn8iJAfxa4fAzQ51reExG5mKSB6MCBA3jqqadw5MgR7NmzB1VVVRg+fDjKysps6o0cORL5+fnW144dO2zKZ82ahS1btmDDhg348ssvUVpaitGjR6O6uro1T4eodTX2ZGdPDBLeGPCIyCNI2mW2a9cum/dr165FREQEsrOzkZSUZN3u7++PqKgoh8cwGAxYs2YN3nvvPQwdOhQA8P777yM2NhZffPEFRowY4boTIJKStz3ZmUt3EJGE3OrBjAaDAQAQFhZmsz0zMxMRERHo1q0bHnvsMRQWFlrLsrOzYTabMXz4cOs2nU6H+Ph4HDp0yOHnVFZWwmg02ryIPI63PdnZzRerJSLv5jaBSAiB2bNnY+DAgYiPj7duHzVqFP7zn/9g3759WL58OY4ePYohQ4agsrISAFBQUAClUonQUNt/OUZGRqKgoMDhZ6Wnp0Oj0VhfsbGxrjsxIlfxtic7e1vAIyKP4jazzGbOnImcnBx8+eWXNtsnTpxo/e/4+Hj07dsXHTp0wGeffYbx48fXezwhRL2Lyy5YsACzZ8+2vjcajQxF5Hm87cnO3hbwiMijuEUgSktLw/bt25GVlYWYmJgG60ZHR6NDhw7Izc0FAERFRcFkMqGoqMjmLlFhYSEGDBjg8Bj+/v7w9/d33gkQSSEwFBjzJvDjHkAVCVRVAr4BQEkB0HWY54238baAR0QeRdIuMyEEZs6cic2bN2Pfvn3o1KlTo/tcv34dly5dQnR0NACgT58+8PPzw549e6x18vPzcerUqXoDEZH3EMB3W4EPJgIfPgJ8MAH4fptlu6dx88Vqici7KYQQkn1zzpgxAx988AG2bduG7t27W7drNBoEBgaitLQUixcvRkpKCqKjo3HhwgUsXLgQFy9exOnTp6FSqQAATz75JD799FOsW7cOYWFhmDt3Lq5fv47s7Gz4+Pg02g6j0QiNRgODwQC1mrflyUOUF1mmqDsaiNwl2XNnZdk8aJJLdxBR/Zz5+y1pl9nq1asBAIMHD7bZvnbtWqSmpsLHxwcnT57Eu+++i+LiYkRHR+Pee+/Fxo0brWEIAFasWAFfX19MmDAB5eXlSE5Oxrp165oUhog8lrdNu6/FpTuISAKS3iFyF7xDRB7p8jHLwwvr84e9QEzf1msPEVEr85o7RETUAh4yK8twwwR9qQnGCjPUgX7QBiuhCVLWvwPXZiOp8W9QlhiIiDyVvxroPBj4KdO+rPNgS7nE8orLMW9TDg7m6q3bkuK0yEhJgK5toP0Ohiv2T6uuHVStad8KLSbZ49+gbLnNgxmJ6BZVlgB3P2EJPzfrPNiyvbJEilZZGW6Y7MIQAGTl6jF/Uw4MN0y2O3jj2mzkWfg3KGu8Q0TkqSoMwKbpQP8nLa+qSsDXH7h81LL9ke2SNk9farILQ7WycvXQl5psu868dZA4eQ7+DcoaAxGRpwpQA6YyIOvV+sslZKwwN1heUrecS3eQ1Pg3KGvsMiPyVLVPdnbEDZ7srA7wa7BcVbfcQwaJkxfj36CsMRAReSo3f7KzNkSJpDitw7KkOC20IXVmmrl5wCMZ4N+grPE5ROBziMjDufGTnfOKyzF/Uw6y6swyW5qSgOj6ZpltT7Ndz4wzfKg18W/Qozjz95uBCAxERK5U+xyikgozVAF+0IbcynOI3CvgkUzwb9Bj8MGMROQxNEGNBKC6uHQHSY1/g7LEMUREREQkewxEREREJHvsMiPydFx3iYioxRiIiDwZ110iInIKdpkReSquu0RE5DQMRESequRqw+sulVxt3fYQEXkwBiIiT1VR3LJyIiKy4hgialDtQ/WMFWaoA/2gDb7FZ8qQ6yiDW1ZORERWDERUr7zicszblIODdZZdyEhJgM7RsgvUupTBQOfBwE+Z9mWdBzs/EHE2GxF5MQYicshww2QXhgAgK1eP+ZtysGpSb94pklpgKPDbP1n+++ZQ1HkwkPQn54YVzmYjIi/HQEQO6UtNdmGoVlauHvpSEwOR1AJDgbAuQNKzwNAXgMoSwF8FmMqA0M7OC0SNzWZ7aA3vFBGRx2MgIoeMFeYGy0saKafWUgNkver4zo2zlF1reDZb2TUGIiLyeJxlRg6pA/waLFc1Uk6toLWeQ1RhbFk5EZEH4B0ickgbokRSnBZZDrrNkuK00Iawu0xyZdeAqyeBSRsAVbSlyyxADRjzLIHIWXduAtQtKyci8gAMROSQJkiJjJQEzN+UYxOKkuK0WJqSwPFD7sB0A5j6CbBrvv2g6qmfWMqdIbidpRvu3F77si7JlnIiIg+nEEIIqRshNaPRCI1GA4PBALWa/9q9We1ziEoqzFAF+EEbwucQuY2iC8AnT9c/7f6BlUBoR+d8luGK5a7TzaGIs8yISGLO/P3mHSJqkCaIAchtVZY5DkOAZXtlmfM+S9PeMpvM+hwiteXOEAdTE5GXYCAi8lSVhpaV36rAUAYgIvJanGVG5KkCNC0rJyIiKwYiIk8VFG4ZK+RI58GWciIiahIGIiJPpYoCRr9uH4o6DwZGr7SUExFRk3AMEZEnC+sEjPsHcOM6UGGwdJMFhTMMERHdIgYiIk+nimIAIiJqIXaZERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7EkaiNLT09GvXz+oVCpERERg7Nix+OGHH2zqCCGwePFi6HQ6BAYGYvDgwfjuu+9s6lRWViItLQ1arRbBwcEYM2YMLl++3Jqn4hSGGyacKyzF8YtFOHetFIYbJqmbRHJTXgTozwKXjwH6XMv75tQhIvIwkq52f+DAATz11FPo168fqqqqsGjRIgwfPhzff/89goODAQDLli3Da6+9hnXr1qFbt254+eWXMWzYMPzwww9QqVQAgFmzZuGTTz7Bhg0bEB4ejjlz5mD06NHIzs6Gj4+PlKfYZHnF5Zi3KQcHc/XWbUlxWmSkJEDXNlDClpFsGK4A22YCP+37dVuXZGDMKkDTvul1iIg8kEIIIaRuRK1r164hIiICBw4cQFJSEoQQ0Ol0mDVrFubNmwfAcjcoMjISS5cuxeOPPw6DwYB27drhvffew8SJEwEAeXl5iI2NxY4dOzBixIhGP9doNEKj0cBgMECtVrv0HB0x3DBh5vrjNmGoVlKcFqsm9YYmSNnq7SIZKS8CPppmG3RqdUkGHlpj+e/G6gSGuradREQ3cebvt1uNITIYDACAsLAwAMD58+dRUFCA4cOHW+v4+/tj0KBBOHToEAAgOzsbZrPZpo5Op0N8fLy1Tl2VlZUwGo02LynpS00OwxAAZOXqoS9l1xm5WNk1x0EHAM7ttZQ3pQ4RkYdym0AkhMDs2bMxcOBAxMfHAwAKCgoAAJGRkTZ1IyMjrWUFBQVQKpUIDQ2tt05d6enp0Gg01ldsbKyzT+eWGCvMDZaXNFJO1GIVjfyjoMLYtDpERB7KbQLRzJkzkZOTg/Xr19uVKRQKm/dCCLttdTVUZ8GCBTAYDNbXpUuXmt9wJ1AH+DVYrmqknKjFAhq51RygblodIiIP5RaBKC0tDdu3b8f+/fsRExNj3R4VFQUAdnd6CgsLrXeNoqKiYDKZUFRUVG+duvz9/aFWq21eUtKGKJEUp3VYlhSnhTaE44fIxYLbWcYBOdIl2VLelDpERB5K0kAkhMDMmTOxefNm7Nu3D506dbIp79SpE6KiorBnzx7rNpPJhAMHDmDAgAEAgD59+sDPz8+mTn5+Pk6dOmWt4+40QUpkpCTYhaKkOC2WpiRwQDW5XmCoZaZY3cBTO4MsMLRpdYiIPJSks8xmzJiBDz74ANu2bUP37t2t2zUaDQIDLVPNly5divT0dKxduxZxcXFYsmQJMjMzbabdP/nkk/j000+xbt06hIWFYe7cubh+/XqTp91LPcusluGGCfpSE0oqzFAF+EEbomQYotZVXmQZHF1htHSBBbezDzpNqUNE1Aqc+fst6XOIVq9eDQAYPHiwzfa1a9ciNTUVAPDss8+ivLwcM2bMQFFREe6++27s3r3bGoYAYMWKFfD19cWECRNQXl6O5ORkrFu3zmOeQVRLE8QARBKrvRPU0jpERB7GrZ5DJBV3uUNERERETee1zyEiIiIikoKkXWZEJEM2Y5A0QLCWXXBEJDkGIiJqPVwLjYjcFLvMiKh1lBfZhyHAsuzH9jRLORGRRBiIiKh1cC00InJjDERE1Dq4FhoRuTGOISKPV/tAS2OFGepAP2iD+Twnt8S10IjIjTEQkUfLKy7HvE05OJirt25LitMiIyUBuraBEraM7NSuhXZur30Z10IjIomxy4w8luGGyS4MAUBWrh7zN+XAcMMkUcvIIa6FRkRujHeIyGPpS012YahWVq4e+lITu87cjaY98NAaroVGRG6HgYg8lrHC3GB5SSPlJBGuhUZEbohdZuSx1AF+DZarGiknIiKqxUBEHksbokRSnNZhWVKcFtoQdpcREVHTMBCRx9IEKZGRkmAXipLitFiaksDxQ0RE1GQcQ0QeTdc2EKsm9Ya+1ISSCjNUAX7QhvA5REREdGsYiMjjaYIYgIiIqGXYZUZERESyx0BEREREsscuMyJ3V15004MMNUCwls/xISJyMgYiIndmuAJsmwn8tO/XbbVLXWjaS9cuIiIvwy4zIndVXmQfhgDL4qjb0yzlRETkFAxERO6q7Jp9GKp1bq+lnIiInIKBiMhdVRhbVk5ERE3GMUTUKgw3TNCXmmCsMEMd6AdtsPOeHeTKY0sqQN2yciIiajIGInK5vOJyzNuUg4O5euu2pDgtMlISoGsb6LbHllxwO8sA6nN77cu6JFvKiYjIKdhlRi5luGGyCywAkJWrx/xNOTDcMLnlsd1CYKhlNlmXZNvttbPMOPWeiMhpeIeIXEpfarILLLWycvXQl5qa3b3lymO7DU174KE1Nz2HSG25M8QwRETkVAxE5FLGCnOD5SWNlEt1bLcSGMoARETkYuwyI5dSB/g1WK5qpFyqYxMRkbzwDhG5lDZEiaQ4LbIcdG0lxWmhDWl+l5Y2RIlhd0Sge7QavWPborKqBgF+Pvj2YhF+yDe26NhERCQvCiGEkLoRUjMajdBoNDAYDFCrOZXZ2fKKyzF/U45NKEqK02JpSgKiWzgT7OL1MizYchJf/Xjdum1g13AsGdcTt4UHt+jYRETk3pz5+81ABNcEIq99Nk4z1V6PkgozVAF+0Ia0/HoYbpgwc/1xhwOrk+K0WDWpt6yvORGRt3Pm7ze7zFzAq5+N00yaIOcHQlnMMiMiolbBQdVO5vXPxnEjspllRkRELsdA5GRNuWtBzsFZZkRE5CwMRE7Guxatp3YGmyMtncFGRETywkDkZLxr0Xo0QUpkpCTYhaLaGWwcP0RERE3FQdVO5srn7pA9XdtArJrU2+kz2IiISF54h8jJeNei9WmClOgSEYK7bgtFl4gQXmMiIrplvEPkArxrQURE5FkYiFzEFc/dISIiItdglxkRERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyZ6kgSgrKwsPPPAAdDodFAoFtm7dalOempoKhUJh8+rfv79NncrKSqSlpUGr1SI4OBhjxozB5cuXW/EsnMdww4RzhaU4frEI566VciFYAsqLAP1Z4PIxQJ9reU9ERE4n6bT7srIy9OrVC48++ihSUlIc1hk5ciTWrl1rfa9U2k5lnzVrFj755BNs2LAB4eHhmDNnDkaPHo3s7Gz4+Pi4tP3OlFdcjnmbcmwWhk2K0yIjJQG6toEStowkY7gCbJsJ/LTv121dkoExqwBNe+naRUTkhSQNRKNGjcKoUaMarOPv74+oqCiHZQaDAWvWrMF7772HoUOHAgDef/99xMbG4osvvsCIESOc3mZXMNww2YUhAMjK1WP+physmtSbzzSSm/Ii+zAEAOf2AtvTgIfWAIGh0rSNiMgLuf0YoszMTERERKBbt2547LHHUFhYaC3Lzs6G2WzG8OHDrdt0Oh3i4+Nx6NCheo9ZWVkJo9Fo85KSvtRkF4ZqZeXqoS9l15nslF2zD0O1zu21lBMRkdO4dSAaNWoU/vOf/2Dfvn1Yvnw5jh49iiFDhqCyshIAUFBQAKVSidBQ238pR0ZGoqCgoN7jpqenQ6PRWF+xsbEuPY/GGCvMDZaXNFJOXqiikZDeWDkREd0St166Y+LEidb/jo+PR9++fdGhQwd89tlnGD9+fL37CSGgUCjqLV+wYAFmz55tfW80GiUNReoAvwbLVY2UkxcKULesnIiIbolb3yGqKzo6Gh06dEBubi4AICoqCiaTCUVFtjNvCgsLERkZWe9x/P39oVarbV5S0oYokRSndViWFKeFNoTjh2QnuJ1lALUjXZIt5URE5DQeFYiuX7+OS5cuITo6GgDQp08f+Pn5Yc+ePdY6+fn5OHXqFAYMGCBVM2+ZJkiJjJQEu1CUFKfF0pQEDqiWo8BQy2yyuqGodpYZB1QTETmVpF1mpaWl+PHHH63vz58/jxMnTiAsLAxhYWFYvHgxUlJSEB0djQsXLmDhwoXQarUYN24cAECj0WD69OmYM2cOwsPDERYWhrlz56Jnz57WWWeeQtc2EKsm9Ya+1ISSCjNUAX7QhigZhuRM094ym6zsmmXMUIDacmeIYYiIyOkkDUTHjh3Dvffea31fO65n6tSpWL16NU6ePIl3330XxcXFiI6Oxr333ouNGzdCpVJZ91mxYgV8fX0xYcIElJeXIzk5GevWrfOoZxDV0gQxAFEdgaEMQERErUAhhBBSN0JqRqMRGo0GBoNB8vFERERE1DTO/P32qDFERERERK7AQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyJ+niruS9DDdM0JeaYKwwQx3oB23wTQvXlhfdtIK7BgjWcgFTIiKSFAMROV1ecTnmbcrBwVy9dVtSnBZLUxIQrfgF2DYT+Gnfrzt0SQbGrAI07SVoLREREbvMyMkMN0x2YQgAsnL1OH72PETdMAQA5/YC29Msd46IiIgkwEBETqUvNdmFoVo91CYo6oahWuf2WrrRiIiIJMAuMxlocDyPkxkrzPWWKatLGt65wujk1hARETUNA5GXq288T0ZKAnRtA53+eeoAv3rLTD6qhncOUDu5NURERE3DLjMv1tB4nvmbcmC4YXL6Z2pDlEiK0zos+96ohOiS7HjHLslAcDunt4eIiKgpGIi8WEPjebJy9dCXOj8QaYKUyEhJsAtFSXFa/KZbJyjGrLKEn5vVzjLj1HsiIpIIu8y8WEPjeQCgpJHy5tK1DcSqSb2hLzWhpMIMVYAftCG145baAw+tuek5RGrLnSGGISIikhADkRdraDwPAKgaKW8JTVADA7cDQxmAiIjIrbDLzIs1NJ4nKU4LbYhrZpoRERF5GgYiL9bQeJ6lKQkum3pPRETkadhl5uUaHs9DREREAAORLDQ4noeIiIjYZUZERETEQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHpTsACCEAAEajUeKWEBER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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"scatt_plot(df7,'Rajaji Nagar')"
]
},
{
"cell_type": "code",
"execution_count": 360,
"id": "96a83e10-c4b7-48c7-ab6a-b4b7a7cd5319",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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nT17NhYsWIDAwEAEBARg4cKF6N27t37VHBEREVFTODRgWrNmDQAgMTHR6PiHH36IlJQUSKVSnDp1Ch999BGKi4sRGhqKESNG4LPPPoOPj4++/cqVK+Hq6opp06ZBrVYjOTkZ69evh1Qqbc2PQ0RERO2URBAEwdGdcLSSkhIoFAqoVCrmMxEREbURrfn77RRJ30RERETOjAETERERkR0MmIiIiIjsYMBEREREZAcDJiIiIiI7GDARERER2cGAiYiIiMgOBkxEREREdjBgIiIiIrKDARMRERGRHQyYiIiIiOxgwERERERkBwMmIiIiIjsYMBERERHZwYCJiIiIyA4GTERERER2MGAiIiIisoMBExEREZEdDJiIiIiI7GDARERERGQHAyYiIiIiOxgwEREREdnBgImIiIjIDgZMRERERHYwYCIiIiKygwETERERkR0MmIiIiIjsYMBEREREZAcDJiIiIiI7GDARERER2cGAiYiIiMgOBkxEREREdjBgIiIiIrKDARMRERGRHQyYiIiIiOxgwERERERkBwMmIiIiIjsYMBERERHZwYCJiIiIyA5XR3eAiIiow1EXAeW3gMoSwF0BeCkBD39H94psYMBERETUmlTXgW9Sgcu76o51TwYmrgIUnR3XL7KJU3JEREStRV1kHiwBwKWdwNY08Tw5JQZMREREraX8lnmwpHNpp3ienBIDJiIiotZSWdK08+QwDJiIiIhai7tv086TwzBgIiIiai1encQEb0u6J4vnySkxYCIiImotHv7iajjToEm3So6lBZwWywoQERG1JkVnYOpagzpMvuLIEoMlp+bQEaZly5ZhwIAB8PHxQVBQECZNmoTz588btREEAUuWLEFYWBg8PDyQmJiIM2fOGLWpqqpCWloalEolvLy8MHHiROTk5LTmRyEiooZSFwEFvwE5R4GCCx1rSb2HP6DsAYTHif9trmCpIz/TFubQgGnPnj148skncejQIaSnp6OmpgajRo1CeXm5vs2KFSvwxhtvYPXq1Thy5AhCQkJw3333obS0VN9m3rx52LJlCzZt2oT9+/ejrKwMEyZMgFardcTHIiIie1TXgS9mAasHAB8kA6vjgC9ni8epcfhMW5REEATB0Z3QuXXrFoKCgrBnzx4MGzYMgiAgLCwM8+bNw3PPPQdAHE0KDg7Gv/71Lzz++ONQqVTo1KkT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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"scatt_plot(df7,'Whitefield')"
]
},
{
"cell_type": "code",
"execution_count": 361,
"id": "3cf447e3-5178-46dd-a5a7-6478addf711a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"' so lets remove the datapoint that have same or less price for equal space and bhks'"
]
},
"execution_count": 361,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"''' so lets remove the datapoint that have same or less price \\\n",
"for equal space and bhks'''"
]
},
{
"cell_type": "code",
"execution_count": 362,
"id": "8a696863-27ed-4d00-ac6d-f0cb5c075449",
"metadata": {},
"outputs": [],
"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')"
]
},
{
"cell_type": "code",
"execution_count": 363,
"id": "bf98962c-b483-48d7-a27f-d246fadf46fc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7329, 6)"
]
},
"execution_count": 363,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df8=remove_bhk_outliers(df7)\n",
"df8.shape"
]
},
{
"cell_type": "code",
"execution_count": 364,
"id": "e6a862e0-3214-4d0b-b997-5c3437046195",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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F1bVf1/5HjSMyq+BO30XMmTmBmw2m0wmk5o3by5JSk9PV3FxsQYOHOioExcXp8TERO3atUuS9Omnn8pisei2225z1OnZs6csFoujjjsrLS3V/fffr1//+te6+eabK5R78zUoLS3V+++/r06dOmnQoEGKjo7Wbbfd5jSk5M39L9enTx+tX79e3333nQzD0NatW3X06FENGjRIknddA5vNJkmKioqSJJ04cUKZmZlOfQsMDNQdd9zhaLc39V+qeA2qquOt34WV9d/Xvgevvgbu9l1IIHKxwsJCzZw5U+PGjXM8vC4zM1Nms1mRkZFOdVu1aqXMzExHnejo6Arni46OdtRxZwsWLJC/v7/+53/+p9Jyb74GWVlZys/P1/z58zV48GB9+OGHGjFihEaOHKnt27dL8u7+l3vhhRfUuXNntWnTRmazWYMHD9Zf/vIX9enTR5L3XAPDMDR16lT16dNHiYmJkuRoW6tWrZzqXt03b+i/VPk1uJo3fxdW1X9f+h6s7Bq423chT7t3oeLiYv3kJz9RaWmp/vKXv9RY3zAMmUwmx89X/rmqOu4oPT1dixcv1hdffHHNbfWGa1BaWipJuvfee/XYY49Jkm655Rbt2rVLL730ku64444q3+sN/S/3wgsvaPfu3Vq/fr3atm2rHTt2aNKkSYqNjVX//v2rfJ+nXYPJkyfrwIED+vjjjyuUXd3G2rTb0/ovVX8NJO//Lqys/772PVjZNXC370LuELlIcXGxRo8erRMnTmjTpk2OfxFJUkxMjOx2u3Jycpzek5WV5fgXZUxMjM6dO1fhvOfPn6/wr053s3PnTmVlZem6666Tv7+//P399e2332ratGlq166dJO++BlarVf7+/urcubPT8ZtuusmxssKb+y9JBQUFmj17tp577jndc889SkpK0uTJkzVmzBg9++yzkrzjGqSlpWn9+vXaunWr2rRp4zgeExMjSRX+9Xp13zy9/1LV16Cct38XVtV/X/oerOoauN13Ya1nG6FOVMlkUrvdbgwfPty4+eabjaysrArvKZ9E9uabbzqOnT17ttJJZJ999pmjzu7du91yIt3V1yA7O9s4ePCg0ysuLs6YMWOGo+3edA0q+zvQq1evChMJhw8fbowdO9YwDO/qv2FUvAY2m82QZGzYsMGp3i9/+UtjwIABhmF49jUoLS01Hn30USMuLs44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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"scatt_plot(df8,'Rajaji Nagar')\n",
"# majority of data points from dataset are removed"
]
},
{
"cell_type": "markdown",
"id": "4bbf12a4-571a-4079-ac51-e9465fcf901b",
"metadata": {},
"source": [
" #ploting histogram to see distributions of ppsqft etc..."
]
},
{
"cell_type": "code",
"execution_count": 365,
"id": "947a1d6c-a49b-400c-ae4e-77cbf308167b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\seaborn\\_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
" with pd.option_context('mode.use_inf_as_na', True):\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 365,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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UD300EOSJKfTqRkzZmj+/Pnq2bOnQkJCtGDBAg0ePNi6m27AgAFKSkpSenq6Vq5cKUmaOXOmUlJSuHMOAADY5tPQtHfvXo0ePdqanzdvniRp2rRpWrFihfbv36/XX39dtbW1ioiI0OjRo/XGG28oKCjIes3SpUvl5+enKVOmqKGhQWPHjlVubq66dOli1axfv15z58617rJLTU295rOhAAAALufT0DRq1CgZY666/p133rnuNrp166acnBzl5ORctSYkJETr1q1rUY8AAABSB7umCQAAwFcITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgg09D05///GdNnDhRkZGRcjgc+v3vf++13hijrKwsRUZGKjAwUKNGjdKBAwe8ajwej+bMmaPQ0FB1795dqampOnHihFdNTU2N0tLS5HQ65XQ6lZaWptra2ps8OgAAcCvxaWj6/PPPNXToUC1fvvyK61988UUtWbJEy5cv1wcffCCXy6Xx48fr7NmzVk1mZqY2bdqkvLw87dy5U/X19UpJSdGFCxesmqlTp6qkpET5+fnKz89XSUmJ0tLSbvr4AADArcPPlztPTk5WcnLyFdcZY7Rs2TI988wzmjx5siTptddeU3h4uDZs2KAnnnhCbrdbq1ev1tq1azVu3DhJ0rp16xQVFaUtW7ZowoQJKisrU35+voqKihQXFydJWrVqlRISElReXq7+/fu3zWABAECH1m6vaTpy5IiqqqqUmJhoLQsICNDIkSNVWFgoSSouLta5c+e8aiIjIxUbG2vV7Nq1S06n0wpMkhQfHy+n02nVAAAAXI9PzzRdS1VVlSQpPDzca3l4eLiOHTtm1XTt2lU9evRoUnPp9VVVVQoLC2uy/bCwMKvmSjwejzwejzVfV1fXsoEAAIBbQrs903SJw+HwmjfGNFl2uctrrlR/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olReXq6CggJt2bJFs2bN0q9+9Svt2LHDut7rq0ETQPvFmSYAraaoqKjJfN++fW2HmiFDhuj999/XuXPnmqwLDw/X3XffrcOHD+vee+/1mmJiYlrU4/nz51VcXGydTfr617+uAwcOqE+fPk320ZygdLnAwEClpqbq3//937V9+3bt2rVL+/fv14ABA3T+/Hnt3bvXqi0vL7/uowS6du0qSdYZPABtg9AEoNVUVFRo3rx5Ki8v1+9+9zvl5OToySeftP36jIwM1dXV6dFHH9XevXt16NAhrV27VuXl5ZL+fhdadna2fvOb3+gvf/mL9u/frzVr1mjJkiW29/HSSy9p06ZNOnjwoGbPnq2amhr98Ic/lCTNnj1bn332mb7//e9rz549Onz4sN5991398Ic/bHFAyc3N1erVq1VaWqrDhw9r7dq1CgwMVHR0tPr376+kpCSlp6dr9+7dKi4u1uOPP37NM26SFB0dLYfDof/+7//WqVOnVF9f36LeADQPoQlAq/mnf/onNTQ06B//8R81e/ZszZkzRzNnzrT9+p49e2rr1q2qr6/XyJEjNWzYMK1atcq6xunxxx/Xf/zHfyg3N1eDBw/WyJEjlZub26wzTS+88IJ++ctfaujQoXr//ff1hz/8QaGhoZKkyMhI/c///I8uXLigCRMmKDY2Vk8++aScTqduu61l/7m88847tWrVKn3jG9/QkCFD9N577+mPf/yjevbsKenvj1CIiorSyJEjNXnyZM2cOfO6z2K6++67tWjRIv30pz9VeHi4MjIyWtQbgOZxmEtfqgPADRg1apTuv/9+6/lC7c3Ro0cVExOjDz/8UPfff7+v27mmPn36KDMzU5mZmb5uBcBXcKYJAADABkITgFvC4sWLvR4V8NUpOTn5pu13/fr1V93voEGDbtp+AbQ9vp4DcEv47LPP9Nlnn11xXWBgoO6+++6bst+zZ8/q5MmTV1zn7++v6Ojom7JfAG2P0AQAAGADX88BAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbPj/BVZbge0sa0EAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.histplot(data=df8,x='price_per_sqft',bins=10)\n"
]
},
{
"cell_type": "markdown",
"id": "24032637-d94a-44e9-a53e-93922a4ad439",
"metadata": {},
"source": [
" #lets explore oulliers in bath column"
]
},
{
"cell_type": "code",
"execution_count": 366,
"id": "f512f6d9-a13b-4e07-af4f-b3b54c51f57d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 4., 3., 2., 5., 8., 1., 6., 7., 9., 12., 16., 13.])"
]
},
"execution_count": 366,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df8.bath.unique()"
]
},
{
"cell_type": "code",
"execution_count": 367,
"id": "14376fee-af65-49fc-ab7b-2493e2dfd88d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" 5277 \n",
" Neeladri Nagar \n",
" 4000.0 \n",
" 12.0 \n",
" 160.0 \n",
" 10 \n",
" 4000.000000 \n",
" \n",
" \n",
" 8486 \n",
" other \n",
" 12000.0 \n",
" 12.0 \n",
" 525.0 \n",
" 10 \n",
" 4375.000000 \n",
" \n",
" \n",
" 8575 \n",
" other \n",
" 10000.0 \n",
" 16.0 \n",
" 550.0 \n",
" 16 \n",
" 5500.000000 \n",
" \n",
" \n",
" 9308 \n",
" other \n",
" 6000.0 \n",
" 12.0 \n",
" 150.0 \n",
" 11 \n",
" 2500.000000 \n",
" \n",
" \n",
" 9639 \n",
" other \n",
" 5425.0 \n",
" 13.0 \n",
" 275.0 \n",
" 13 \n",
" 5069.124424 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk price_per_sqft\n",
"5277 Neeladri Nagar 4000.0 12.0 160.0 10 4000.000000\n",
"8486 other 12000.0 12.0 525.0 10 4375.000000\n",
"8575 other 10000.0 16.0 550.0 16 5500.000000\n",
"9308 other 6000.0 12.0 150.0 11 2500.000000\n",
"9639 other 5425.0 13.0 275.0 13 5069.124424"
]
},
"execution_count": 367,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(df8[df8.bath>10])"
]
},
{
"cell_type": "code",
"execution_count": 368,
"id": "cc4640db-37c6-44a0-a05b-0fad991f7926",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\seaborn\\_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
" with pd.option_context('mode.use_inf_as_na', True):\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 368,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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AADAEU36ltk333yj1atXa9u2bRo0aJD8/f19Xl+6dGmzDAcAANAamhREH3zwgW644QZJ0oEDB3xe4wJrAADQ3jQpiLZv397ccwAAADimSdcQAQAAdCRNOkM0cuTIC35r7J133mnyQAAAAK2tSUF09vqhs86cOaOioiIdOHCg0S99BQAAaOuaFETLli075/GMjAxVV1f/oIEAAABaW7NeQzRx4kR+jxkAAGh3mjWIdu3apS5dujTnWwIAALS4Jn3LbPz48T7PLctSaWmp3nvvPT3++OPNMhgAAEBraVIQud1un+eXXXaZYmNj9dRTTykxMbFZBgMAAGgtTQqiV155pbnnAAAAcEyTguiswsJCFRcXy+VyqV+/fho8eHBzzQUAANBqmhRE5eXluu+++7Rjxw5dccUVsixLXq9XI0eO1MaNG3XllVc295wAAAAtpkl3maWlpamyslIHDx7Ul19+qYqKCh04cECVlZWaNWtWc88IAADQopp0hignJ0fbtm1T37597WP9+vXTb37zGy6qBgAA7U6TzhA1NDTI39+/0XF/f381NDT84KEAAABaU5OC6Pbbb9fs2bP1+eef28c+++wzPfzwwxo1alSzDQcAANAamhRE2dnZqqqq0jXXXKMf/ehHuvbaaxUdHa2qqiqtWLGiuWcEAABoUU26higyMlL79u1Tbm6uDh06JMuy1K9fP40ePbq55wMAAGhxl3SG6J133lG/fv1UWVkpSRozZozS0tI0a9Ys3XTTTerfv7/efffdFhkUAACgpVxSEC1fvlxTpkxR9+7dG73mdrs1bdo0LV26tNmGAwAAaA2XFETvv/++xo0bd97XExMTVVhY+IOHAgAAaE2XFEQnTpw45+32Z/n5+enkyZM/eCgAAIDWdElBdNVVV2n//v3nff2DDz5Qz549f/BQAAAAremSgujHP/6x/uu//kvffPNNo9dqamr0xBNPKCkpqdmGAwAAaA2XdNv9Y489ptdff13XXXedZs6cqdjYWLlcLhUXF+s3v/mN6uvrtWjRopaaFQAAoEVcUhCFh4crPz9fv/zlL7Vw4UJZliVJcrlcGjt2rF588UWFh4e3yKAAAAAt5ZJ/MGOvXr305ptvqqKiQp988oksy1JMTIx69OjREvMBAAC0uCb9pGpJ6tGjh2666abmnAUAAMARTfpdZgAAAB0JQQQAAIxH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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.histplot(data=df8.bath,bins=10)"
]
},
{
"cell_type": "code",
"execution_count": 369,
"id": "da06d4a8-4ddc-4d93-a1c3-d0997d9b5f10",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" price_per_sqft \n",
" \n",
" \n",
" \n",
" \n",
" 1626 \n",
" Chikkabanavar \n",
" 2460.0 \n",
" 7.0 \n",
" 80.0 \n",
" 4 \n",
" 3252.032520 \n",
" \n",
" \n",
" 5238 \n",
" Nagasandra \n",
" 7000.0 \n",
" 8.0 \n",
" 450.0 \n",
" 4 \n",
" 6428.571429 \n",
" \n",
" \n",
" 6711 \n",
" Thanisandra \n",
" 1806.0 \n",
" 6.0 \n",
" 116.0 \n",
" 3 \n",
" 6423.034330 \n",
" \n",
" \n",
" 8411 \n",
" other \n",
" 11338.0 \n",
" 9.0 \n",
" 1000.0 \n",
" 6 \n",
" 8819.897689 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk price_per_sqft\n",
"1626 Chikkabanavar 2460.0 7.0 80.0 4 3252.032520\n",
"5238 Nagasandra 7000.0 8.0 450.0 4 6428.571429\n",
"6711 Thanisandra 1806.0 6.0 116.0 3 6423.034330\n",
"8411 other 11338.0 9.0 1000.0 6 8819.897689"
]
},
"execution_count": 369,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# lets say for n-bhk if n+1-bathrms is OK but having n+2 bathroom is unusual\n",
"df8[df8.bhk+2 < df8.bath]\n",
"\n",
"# it will give entries with bkh+2 bathrooms"
]
},
{
"cell_type": "code",
"execution_count": 370,
"id": "1438380a-f4f2-4f01-a962-54ff7a852348",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7251, 6)"
]
},
"execution_count": 370,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df9=df8[df8.bhk+2 > df8.bath]\n",
"# read as \"after adding +2bhks still bhks must be greater or equal to bathrooms \"\n",
"df9.shape"
]
},
{
"cell_type": "code",
"execution_count": 371,
"id": "56957f94-a06f-4afe-8795-85f0a13966da",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7251, 5)"
]
},
"execution_count": 371,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df9=df9.drop(['price_per_sqft'],axis='columns')\n",
"df9.shape"
]
},
{
"cell_type": "code",
"execution_count": 372,
"id": "13bd45fd-7dce-425e-986d-e26f8b639233",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1st Block Jayanagar \n",
" 2850.0 \n",
" 4.0 \n",
" 428.0 \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" 1st Block Jayanagar \n",
" 1630.0 \n",
" 3.0 \n",
" 194.0 \n",
" 3 \n",
" \n",
" \n",
" 2 \n",
" 1st Block Jayanagar \n",
" 1875.0 \n",
" 2.0 \n",
" 235.0 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" 1st Block Jayanagar \n",
" 1200.0 \n",
" 2.0 \n",
" 130.0 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" 1st Block Jayanagar \n",
" 1235.0 \n",
" 2.0 \n",
" 148.0 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 1st Block Jayanagar 2850.0 4.0 428.0 4\n",
"1 1st Block Jayanagar 1630.0 3.0 194.0 3\n",
"2 1st Block Jayanagar 1875.0 2.0 235.0 3\n",
"3 1st Block Jayanagar 1200.0 2.0 130.0 3\n",
"4 1st Block Jayanagar 1235.0 2.0 148.0 2"
]
},
"execution_count": 372,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df9.head()"
]
},
{
"cell_type": "code",
"execution_count": 373,
"id": "02490762-9303-4a6c-b61f-3e39d9a5e1fa",
"metadata": {},
"outputs": [],
"source": [
"df10=df9"
]
},
{
"cell_type": "markdown",
"id": "16fc2317-13d9-43e2-bfe9-6aaa32fb6b19",
"metadata": {},
"source": [
" # Machine learning"
]
},
{
"cell_type": "code",
"execution_count": 374,
"id": "7b5e8b2e-9673-4e2b-a03a-fa7459bd98e6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"hi\n"
]
}
],
"source": [
"print(\"hi\")"
]
},
{
"cell_type": "code",
"execution_count": 375,
"id": "53e4b758-62ac-402c-b43e-35d3a9ec2347",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1st Block Jayanagar \n",
" 2850.0 \n",
" 4.0 \n",
" 428.0 \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" 1st Block Jayanagar \n",
" 1630.0 \n",
" 3.0 \n",
" 194.0 \n",
" 3 \n",
" \n",
" \n",
" 2 \n",
" 1st Block Jayanagar \n",
" 1875.0 \n",
" 2.0 \n",
" 235.0 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" 1st Block Jayanagar \n",
" 1200.0 \n",
" 2.0 \n",
" 130.0 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" 1st Block Jayanagar \n",
" 1235.0 \n",
" 2.0 \n",
" 148.0 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk\n",
"0 1st Block Jayanagar 2850.0 4.0 428.0 4\n",
"1 1st Block Jayanagar 1630.0 3.0 194.0 3\n",
"2 1st Block Jayanagar 1875.0 2.0 235.0 3\n",
"3 1st Block Jayanagar 1200.0 2.0 130.0 3\n",
"4 1st Block Jayanagar 1235.0 2.0 148.0 2"
]
},
"execution_count": 375,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df10.head()"
]
},
{
"cell_type": "code",
"execution_count": 376,
"id": "71001036-1260-40d5-ac12-ed9f7b1839b1",
"metadata": {},
"outputs": [],
"source": [
"# one hot encoding"
]
},
{
"cell_type": "code",
"execution_count": 377,
"id": "fed6f6b3-c267-4b8d-aeb8-4dc683e73034",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 1st Block Jayanagar \n",
" 1st Phase JP Nagar \n",
" 2nd Phase Judicial Layout \n",
" 2nd Stage Nagarbhavi \n",
" 5th Block Hbr Layout \n",
" 5th Phase JP Nagar \n",
" 6th Phase JP Nagar \n",
" 7th Phase JP Nagar \n",
" 8th Phase JP Nagar \n",
" 9th Phase JP Nagar \n",
" ... \n",
" Vishveshwarya Layout \n",
" Vishwapriya Layout \n",
" Vittasandra \n",
" Whitefield \n",
" Yelachenahalli \n",
" Yelahanka \n",
" Yelahanka New Town \n",
" Yelenahalli \n",
" Yeshwanthpur \n",
" other \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" True \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" ... \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 1 \n",
" True \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" ... \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 2 \n",
" True \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" ... \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 3 \n",
" True \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" ... \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 4 \n",
" True \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" ... \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
"
\n",
"
5 rows × 242 columns
\n",
"
"
],
"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",
"3 True False False \n",
"4 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",
"3 False False False \n",
"4 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",
"3 False False False \n",
"4 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",
"3 False ... False False \n",
"4 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",
"3 False False False False False \n",
"4 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",
"3 False False False \n",
"4 False False False \n",
"\n",
"[5 rows x 242 columns]"
]
},
"execution_count": 377,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dummies=pd.get_dummies(df10.location)\n",
"dummies.head()"
]
},
{
"cell_type": "code",
"execution_count": 378,
"id": "4faeac73-2067-4c97-8168-d108f26f5c95",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 1st Block Jayanagar \n",
" 1st Phase JP Nagar \n",
" 2nd Phase Judicial Layout \n",
" 2nd Stage Nagarbhavi \n",
" 5th Block Hbr Layout \n",
" 5th Phase JP Nagar \n",
" 6th Phase JP Nagar \n",
" 7th Phase JP Nagar \n",
" 8th Phase JP Nagar \n",
" 9th Phase JP Nagar \n",
" ... \n",
" Vishveshwarya Layout \n",
" Vishwapriya Layout \n",
" Vittasandra \n",
" Whitefield \n",
" Yelachenahalli \n",
" Yelahanka \n",
" Yelahanka New Town \n",
" Yelenahalli \n",
" Yeshwanthpur \n",
" other \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
5 rows × 242 columns
\n",
"
"
],
"text/plain": [
" 1st Block Jayanagar 1st Phase JP Nagar 2nd Phase Judicial Layout \\\n",
"0 1 0 0 \n",
"1 1 0 0 \n",
"2 1 0 0 \n",
"3 1 0 0 \n",
"4 1 0 0 \n",
"\n",
" 2nd Stage Nagarbhavi 5th Block Hbr Layout 5th Phase JP Nagar \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" 6th Phase JP Nagar 7th Phase JP Nagar 8th Phase JP Nagar \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" 9th Phase JP Nagar ... Vishveshwarya Layout Vishwapriya Layout \\\n",
"0 0 ... 0 0 \n",
"1 0 ... 0 0 \n",
"2 0 ... 0 0 \n",
"3 0 ... 0 0 \n",
"4 0 ... 0 0 \n",
"\n",
" Vittasandra Whitefield Yelachenahalli Yelahanka Yelahanka New Town \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Yelenahalli Yeshwanthpur other \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
"[5 rows x 242 columns]"
]
},
"execution_count": 378,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dummies_int=dummies.astype(int)\n",
"dummies_int.head()"
]
},
{
"cell_type": "code",
"execution_count": 379,
"id": "c15b46db-4d46-45e4-832b-561416834a54",
"metadata": {},
"outputs": [],
"source": [
"#now join the encoded dummies column with df10"
]
},
{
"cell_type": "code",
"execution_count": 380,
"id": "933454cd-aaf6-4886-ac80-02e4c4954089",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" location \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" 1st Block Jayanagar \n",
" 1st Phase JP Nagar \n",
" 2nd Phase Judicial Layout \n",
" 2nd Stage Nagarbhavi \n",
" 5th Block Hbr Layout \n",
" ... \n",
" Vijayanagar \n",
" Vishveshwarya Layout \n",
" Vishwapriya Layout \n",
" Vittasandra \n",
" Whitefield \n",
" Yelachenahalli \n",
" Yelahanka \n",
" Yelahanka New Town \n",
" Yelenahalli \n",
" Yeshwanthpur \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1st Block Jayanagar \n",
" 2850.0 \n",
" 4.0 \n",
" 428.0 \n",
" 4 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 1st Block Jayanagar \n",
" 1630.0 \n",
" 3.0 \n",
" 194.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 1st Block Jayanagar \n",
" 1875.0 \n",
" 2.0 \n",
" 235.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1st Block Jayanagar \n",
" 1200.0 \n",
" 2.0 \n",
" 130.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 1st Block Jayanagar \n",
" 1235.0 \n",
" 2.0 \n",
" 148.0 \n",
" 2 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 10232 \n",
" other \n",
" 1200.0 \n",
" 2.0 \n",
" 70.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10233 \n",
" other \n",
" 1800.0 \n",
" 1.0 \n",
" 200.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10236 \n",
" other \n",
" 1353.0 \n",
" 2.0 \n",
" 110.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10237 \n",
" other \n",
" 812.0 \n",
" 1.0 \n",
" 26.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10240 \n",
" other \n",
" 3600.0 \n",
" 5.0 \n",
" 400.0 \n",
" 4 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
7251 rows × 246 columns
\n",
"
"
],
"text/plain": [
" location total_sqft bath price bhk 1st Block Jayanagar \\\n",
"0 1st Block Jayanagar 2850.0 4.0 428.0 4 1 \n",
"1 1st Block Jayanagar 1630.0 3.0 194.0 3 1 \n",
"2 1st Block Jayanagar 1875.0 2.0 235.0 3 1 \n",
"3 1st Block Jayanagar 1200.0 2.0 130.0 3 1 \n",
"4 1st Block Jayanagar 1235.0 2.0 148.0 2 1 \n",
"... ... ... ... ... ... ... \n",
"10232 other 1200.0 2.0 70.0 2 0 \n",
"10233 other 1800.0 1.0 200.0 1 0 \n",
"10236 other 1353.0 2.0 110.0 2 0 \n",
"10237 other 812.0 1.0 26.0 1 0 \n",
"10240 other 3600.0 5.0 400.0 4 0 \n",
"\n",
" 1st Phase JP Nagar 2nd Phase Judicial Layout 2nd Stage Nagarbhavi \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"... ... ... ... \n",
"10232 0 0 0 \n",
"10233 0 0 0 \n",
"10236 0 0 0 \n",
"10237 0 0 0 \n",
"10240 0 0 0 \n",
"\n",
" 5th Block Hbr Layout ... Vijayanagar Vishveshwarya Layout \\\n",
"0 0 ... 0 0 \n",
"1 0 ... 0 0 \n",
"2 0 ... 0 0 \n",
"3 0 ... 0 0 \n",
"4 0 ... 0 0 \n",
"... ... ... ... ... \n",
"10232 0 ... 0 0 \n",
"10233 0 ... 0 0 \n",
"10236 0 ... 0 0 \n",
"10237 0 ... 0 0 \n",
"10240 0 ... 0 0 \n",
"\n",
" Vishwapriya Layout Vittasandra Whitefield Yelachenahalli Yelahanka \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"... ... ... ... ... ... \n",
"10232 0 0 0 0 0 \n",
"10233 0 0 0 0 0 \n",
"10236 0 0 0 0 0 \n",
"10237 0 0 0 0 0 \n",
"10240 0 0 0 0 0 \n",
"\n",
" Yelahanka New Town Yelenahalli Yeshwanthpur \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"... ... ... ... \n",
"10232 0 0 0 \n",
"10233 0 0 0 \n",
"10236 0 0 0 \n",
"10237 0 0 0 \n",
"10240 0 0 0 \n",
"\n",
"[7251 rows x 246 columns]"
]
},
"execution_count": 380,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df11=pd.concat([df10,dummies_int.drop('other',axis=1)],axis='columns')\n",
"df11"
]
},
{
"cell_type": "code",
"execution_count": 381,
"id": "a552b4fb-dac3-4525-838c-f5a23892a3a2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" total_sqft \n",
" bath \n",
" price \n",
" bhk \n",
" 1st Block Jayanagar \n",
" 1st Phase JP Nagar \n",
" 2nd Phase Judicial Layout \n",
" 2nd Stage Nagarbhavi \n",
" 5th Block Hbr Layout \n",
" 5th Phase JP Nagar \n",
" ... \n",
" Vijayanagar \n",
" Vishveshwarya Layout \n",
" Vishwapriya Layout \n",
" Vittasandra \n",
" Whitefield \n",
" Yelachenahalli \n",
" Yelahanka \n",
" Yelahanka New Town \n",
" Yelenahalli \n",
" Yeshwanthpur \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2850.0 \n",
" 4.0 \n",
" 428.0 \n",
" 4 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 1630.0 \n",
" 3.0 \n",
" 194.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 1875.0 \n",
" 2.0 \n",
" 235.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1200.0 \n",
" 2.0 \n",
" 130.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 1235.0 \n",
" 2.0 \n",
" 148.0 \n",
" 2 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 10232 \n",
" 1200.0 \n",
" 2.0 \n",
" 70.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10233 \n",
" 1800.0 \n",
" 1.0 \n",
" 200.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10236 \n",
" 1353.0 \n",
" 2.0 \n",
" 110.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10237 \n",
" 812.0 \n",
" 1.0 \n",
" 26.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10240 \n",
" 3600.0 \n",
" 5.0 \n",
" 400.0 \n",
" 4 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
7251 rows × 245 columns
\n",
"
"
],
"text/plain": [
" total_sqft bath price bhk 1st Block Jayanagar 1st Phase JP Nagar \\\n",
"0 2850.0 4.0 428.0 4 1 0 \n",
"1 1630.0 3.0 194.0 3 1 0 \n",
"2 1875.0 2.0 235.0 3 1 0 \n",
"3 1200.0 2.0 130.0 3 1 0 \n",
"4 1235.0 2.0 148.0 2 1 0 \n",
"... ... ... ... ... ... ... \n",
"10232 1200.0 2.0 70.0 2 0 0 \n",
"10233 1800.0 1.0 200.0 1 0 0 \n",
"10236 1353.0 2.0 110.0 2 0 0 \n",
"10237 812.0 1.0 26.0 1 0 0 \n",
"10240 3600.0 5.0 400.0 4 0 0 \n",
"\n",
" 2nd Phase Judicial Layout 2nd Stage Nagarbhavi 5th Block Hbr Layout \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"... ... ... ... \n",
"10232 0 0 0 \n",
"10233 0 0 0 \n",
"10236 0 0 0 \n",
"10237 0 0 0 \n",
"10240 0 0 0 \n",
"\n",
" 5th Phase JP Nagar ... Vijayanagar Vishveshwarya Layout \\\n",
"0 0 ... 0 0 \n",
"1 0 ... 0 0 \n",
"2 0 ... 0 0 \n",
"3 0 ... 0 0 \n",
"4 0 ... 0 0 \n",
"... ... ... ... ... \n",
"10232 0 ... 0 0 \n",
"10233 0 ... 0 0 \n",
"10236 0 ... 0 0 \n",
"10237 0 ... 0 0 \n",
"10240 0 ... 0 0 \n",
"\n",
" Vishwapriya Layout Vittasandra Whitefield Yelachenahalli Yelahanka \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"... ... ... ... ... ... \n",
"10232 0 0 0 0 0 \n",
"10233 0 0 0 0 0 \n",
"10236 0 0 0 0 0 \n",
"10237 0 0 0 0 0 \n",
"10240 0 0 0 0 0 \n",
"\n",
" Yelahanka New Town Yelenahalli Yeshwanthpur \n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"... ... ... ... \n",
"10232 0 0 0 \n",
"10233 0 0 0 \n",
"10236 0 0 0 \n",
"10237 0 0 0 \n",
"10240 0 0 0 \n",
"\n",
"[7251 rows x 245 columns]"
]
},
"execution_count": 381,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df12=df11.drop('location',axis=1)\n",
"df12"
]
},
{
"cell_type": "code",
"execution_count": 382,
"id": "52f69811-009e-4fc1-bde2-5f51b8e8644c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7251, 245)"
]
},
"execution_count": 382,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df12.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d2ef10c-f47e-4c81-b99a-ec362edc9264",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "248528ef-f0c3-4670-9d2f-a71eff39aa8c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 383,
"id": "acdaf739-2efe-4e7f-b125-1e94346e43f8",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" total_sqft \n",
" bath \n",
" bhk \n",
" 1st Block Jayanagar \n",
" 1st Phase JP Nagar \n",
" 2nd Phase Judicial Layout \n",
" 2nd Stage Nagarbhavi \n",
" 5th Block Hbr Layout \n",
" 5th Phase JP Nagar \n",
" 6th Phase JP Nagar \n",
" ... \n",
" Vijayanagar \n",
" Vishveshwarya Layout \n",
" Vishwapriya Layout \n",
" Vittasandra \n",
" Whitefield \n",
" Yelachenahalli \n",
" Yelahanka \n",
" Yelahanka New Town \n",
" Yelenahalli \n",
" Yeshwanthpur \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2850.0 \n",
" 4.0 \n",
" 4 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 1630.0 \n",
" 3.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 1875.0 \n",
" 2.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1200.0 \n",
" 2.0 \n",
" 3 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 1235.0 \n",
" 2.0 \n",
" 2 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 10232 \n",
" 1200.0 \n",
" 2.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10233 \n",
" 1800.0 \n",
" 1.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10236 \n",
" 1353.0 \n",
" 2.0 \n",
" 2 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10237 \n",
" 812.0 \n",
" 1.0 \n",
" 1 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
" 10240 \n",
" 3600.0 \n",
" 5.0 \n",
" 4 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" ... \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
7251 rows × 244 columns
\n",
"
"
],
"text/plain": [
" total_sqft bath bhk 1st Block Jayanagar 1st Phase JP Nagar \\\n",
"0 2850.0 4.0 4 1 0 \n",
"1 1630.0 3.0 3 1 0 \n",
"2 1875.0 2.0 3 1 0 \n",
"3 1200.0 2.0 3 1 0 \n",
"4 1235.0 2.0 2 1 0 \n",
"... ... ... ... ... ... \n",
"10232 1200.0 2.0 2 0 0 \n",
"10233 1800.0 1.0 1 0 0 \n",
"10236 1353.0 2.0 2 0 0 \n",
"10237 812.0 1.0 1 0 0 \n",
"10240 3600.0 5.0 4 0 0 \n",
"\n",
" 2nd Phase Judicial Layout 2nd Stage Nagarbhavi 5th Block Hbr Layout \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"... ... ... ... \n",
"10232 0 0 0 \n",
"10233 0 0 0 \n",
"10236 0 0 0 \n",
"10237 0 0 0 \n",
"10240 0 0 0 \n",
"\n",
" 5th Phase JP Nagar 6th Phase JP Nagar ... Vijayanagar \\\n",
"0 0 0 ... 0 \n",
"1 0 0 ... 0 \n",
"2 0 0 ... 0 \n",
"3 0 0 ... 0 \n",
"4 0 0 ... 0 \n",
"... ... ... ... ... \n",
"10232 0 0 ... 0 \n",
"10233 0 0 ... 0 \n",
"10236 0 0 ... 0 \n",
"10237 0 0 ... 0 \n",
"10240 0 0 ... 0 \n",
"\n",
" Vishveshwarya Layout Vishwapriya Layout Vittasandra Whitefield \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"... ... ... ... ... \n",
"10232 0 0 0 0 \n",
"10233 0 0 0 0 \n",
"10236 0 0 0 0 \n",
"10237 0 0 0 0 \n",
"10240 0 0 0 0 \n",
"\n",
" Yelachenahalli Yelahanka Yelahanka New Town Yelenahalli \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"... ... ... ... ... \n",
"10232 0 0 0 0 \n",
"10233 0 0 0 0 \n",
"10236 0 0 0 0 \n",
"10237 0 0 0 0 \n",
"10240 0 0 0 0 \n",
"\n",
" Yeshwanthpur \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 \n",
"... ... \n",
"10232 0 \n",
"10233 0 \n",
"10236 0 \n",
"10237 0 \n",
"10240 0 \n",
"\n",
"[7251 rows x 244 columns]"
]
},
"execution_count": 383,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = df12.drop('price',axis=1)\n",
"X"
]
},
{
"cell_type": "code",
"execution_count": 384,
"id": "f0eda7a8-a8ce-40d8-a887-5a131e2addff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 428.0\n",
"1 194.0\n",
"2 235.0\n",
"3 130.0\n",
"4 148.0\n",
" ... \n",
"10232 70.0\n",
"10233 200.0\n",
"10236 110.0\n",
"10237 26.0\n",
"10240 400.0\n",
"Name: price, Length: 7251, dtype: float64"
]
},
"execution_count": 384,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y = df12.price\n",
"y"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "472de023-41ba-4005-afa4-831c3f1bbe36",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 385,
"id": "a346d217-da42-4cb2-a5ff-9cd4e39ec010",
"metadata": {},
"outputs": [],
"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)"
]
},
{
"cell_type": "code",
"execution_count": 386,
"id": "44dec7f1-dc6a-42b3-9c8e-1a9c71242066",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"lr_clf=LinearRegression()\n"
]
},
{
"cell_type": "code",
"execution_count": 387,
"id": "00f03e32-58d9-4835-88aa-e9ef9108a9a5",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"LinearRegression() In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
],
"text/plain": [
"LinearRegression()"
]
},
"execution_count": 387,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_clf.fit(X_train,y_train)"
]
},
{
"cell_type": "code",
"execution_count": 388,
"id": "bfbb931a-7f1e-43fd-bca9-373ce8ea46dd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8452277697874279"
]
},
"execution_count": 388,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_clf.score(X_test,y_test)"
]
},
{
"cell_type": "markdown",
"id": "3abc64ec-e249-4f00-973f-a56ffe74ae72",
"metadata": {},
"source": [
"# cross validation"
]
},
{
"cell_type": "code",
"execution_count": 389,
"id": "15010e45-995e-48b7-bc1d-334d5051f97a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.82430186, 0.77166234, 0.85089567, 0.80837764, 0.83653286])"
]
},
"execution_count": 389,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.model_selection import ShuffleSplit,cross_val_score\n",
"cv=ShuffleSplit(n_splits=5,test_size=0.2,random_state=0 )\n",
"\n",
"cross_val_score(LinearRegression(),X,y,cv=cv)"
]
},
{
"cell_type": "code",
"execution_count": 390,
"id": "5dc45cb7-7a18-4496-8363-cd2beb19dc98",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.linear_model import Lasso\n",
"from sklearn.tree import DecisionTreeRegressor"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1eb07295-bc40-480e-85ef-81af9c548cd0",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 391,
"id": "5f8d3206-911d-44a2-9f38-7c05c4304228",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:378: FitFailedWarning: \n",
"10 fits failed out of a total of 20.\n",
"The score on these train-test partitions for these parameters will be set to nan.\n",
"If these failures are not expected, you can try to debug them by setting error_score='raise'.\n",
"\n",
"Below are more details about the failures:\n",
"--------------------------------------------------------------------------------\n",
"10 fits failed with the following error:\n",
"Traceback (most recent call last):\n",
" File \"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 686, in _fit_and_score\n",
" estimator.fit(X_train, y_train, **fit_params)\n",
" File \"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\tree\\_classes.py\", line 1247, in fit\n",
" super().fit(\n",
" File \"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\tree\\_classes.py\", line 177, in fit\n",
" self._validate_params()\n",
" File \"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\base.py\", line 600, in _validate_params\n",
" validate_parameter_constraints(\n",
" File \"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py\", line 97, in validate_parameter_constraints\n",
" raise InvalidParameterError(\n",
"sklearn.utils._param_validation.InvalidParameterError: The 'criterion' parameter of DecisionTreeRegressor must be a str among {'friedman_mse', 'squared_error', 'absolute_error', 'poisson'}. Got 'mse' instead.\n",
"\n",
" warnings.warn(some_fits_failed_message, FitFailedWarning)\n",
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:952: UserWarning: One or more of the test scores are non-finite: [ nan nan 0.72559954 0.63367494]\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" model \n",
" best_score \n",
" best_params \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" linear_regression \n",
" 0.819001 \n",
" {'fit_intercept': False} \n",
" \n",
" \n",
" 1 \n",
" lasso \n",
" 0.687432 \n",
" {'alpha': 1, 'selection': 'random'} \n",
" \n",
" \n",
" 2 \n",
" decision_tree \n",
" 0.725600 \n",
" {'criterion': 'friedman_mse', 'splitter': 'best'} \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" model best_score \\\n",
"0 linear_regression 0.819001 \n",
"1 lasso 0.687432 \n",
"2 decision_tree 0.725600 \n",
"\n",
" best_params \n",
"0 {'fit_intercept': False} \n",
"1 {'alpha': 1, 'selection': 'random'} \n",
"2 {'criterion': 'friedman_mse', 'splitter': 'best'} "
]
},
"execution_count": 391,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import LinearRegression, Lasso\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"from sklearn.model_selection import GridSearchCV, ShuffleSplit\n",
"import pandas as pd\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], # Example parameter for LinearRegression\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': ['mse', '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",
" return pd.DataFrame(scores, columns=['model', 'best_score', 'best_params'])\n",
"\n",
"# Example usage (assuming X and y are defined somewhere in your code):\n",
"# best_models_df = find_best_model_using_gridsearchcv(X, y)\n",
"# print(best_models_df)\n",
"find_best_model_using_gridsearchcv(X,y)\n"
]
},
{
"cell_type": "code",
"execution_count": 392,
"id": "87959f3e-fd24-4cc3-aefa-5100d0134614",
"metadata": {},
"outputs": [],
"source": [
"# from above lr_clf has decent accuracy ,so choose it."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1910bbcf-2072-4f8d-a1e5-178324d25e4a",
"metadata": {},
"outputs": [],
"source": [
"list(X.columns)"
]
},
{
"cell_type": "code",
"execution_count": 398,
"id": "9e5292b3-392a-44c3-b972-af80f61bccc7",
"metadata": {},
"outputs": [],
"source": [
"def predict_price(location,sqft,bath,bhk):\n",
" loc_index= np.where(X.columns==location)[0][0]\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",
" return lr_clf.predict([x])[0]"
]
},
{
"cell_type": "code",
"execution_count": 399,
"id": "76e15208-9a70-40cb-9a01-a5439da1e560",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/plain": [
"139.3860563827195"
]
},
"execution_count": 399,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict_price('Whitefield',2000,4,4)"
]
},
{
"cell_type": "code",
"execution_count": 400,
"id": "02277089-3a1a-4541-b2e2-75bb46bd637b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/plain": [
"83.49904677167738"
]
},
"execution_count": 400,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict_price('1st Phase JP Nagar',1000,2,2)"
]
},
{
"cell_type": "code",
"execution_count": 410,
"id": "c6ac17f3-73eb-4f15-a6c6-b8b4ac42af29",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/plain": [
"86.80519395194304"
]
},
"execution_count": 410,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict_price('1st Phase JP Nagar',1000,3,3)"
]
},
{
"cell_type": "code",
"execution_count": 411,
"id": "2866e273-1e18-4fc7-b23f-2b934d9a3181",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Suleman\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"text/plain": [
"181.27815484007036"
]
},
"execution_count": 411,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict_price('Indira Nagar',1000,2,2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7b9d4c38-40b0-4d8f-be13-86aa159b2ab9",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "47f83871-decc-4948-94cb-d069e00d7101",
"metadata": {},
"source": [
"# pickle and json files"
]
},
{
"cell_type": "code",
"execution_count": 419,
"id": "490eaaa1-cd20-4af3-8e7a-121ed2fb71e6",
"metadata": {},
"outputs": [],
"source": [
"# pickle file to connect with flask server requirements\n",
"import pickle\n",
"with open ('banglore_home_price_model.pickle','wb') as f:\n",
" pickle.dump(lr_clf,f)"
]
},
{
"cell_type": "code",
"execution_count": 420,
"id": "d51d0f7d-e07b-491a-a8e3-407b571578d4",
"metadata": {},
"outputs": [],
"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))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "23fe6d87-4f76-407a-8238-2b73e57cb34d",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "00d771e7-60df-42f2-9660-43a4691081a2",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.7"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}