{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d53b8e28",
   "metadata": {},
   "source": [
    "# Q10: Data Wrangling\n",
    "\n",
    "**Problem Statement:** Data Wrangling on Real Estate Market"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "cf87a209",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Raw shape: (240, 8)\n",
      "Property ID  Sale Date Neighborhood Property Type  Area SqFt  Bedrooms  Year Built  Sale Price\n",
      "     RE0001 2024-11-24         West     Apartment     1327.0         2        1990   345888.22\n",
      "     RE0002 2025-05-03        South         House     1311.0         2        1981   254684.47\n",
      "     RE0003 2024-10-02        North     Townhouse     1145.0         2        2007   282201.60\n",
      "     RE0004 2025-01-06        North     Apartment     1717.0         3        2018   406372.48\n",
      "     RE0005 2023-12-23         West     Townhouse      719.0         1        2019   344811.98\n",
      "Missing values:\n",
      " Property ID      0\n",
      "Sale Date        0\n",
      "Neighborhood     0\n",
      "Property Type    0\n",
      "Area SqFt        1\n",
      "Bedrooms         0\n",
      "Year Built       0\n",
      "Sale Price       0\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "homes = pd.read_csv(\"RealEstate_Prices.csv\")\n",
    "amenities = pd.read_csv(\"RealEstate_Neighborhoods.csv\")\n",
    "print(\"Raw shape:\", homes.shape)\n",
    "print(homes.head().to_string(index=False))\n",
    "print(\"Missing values:\\n\", homes.isna().sum().to_string())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "48bb7fe7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Clean columns: ['property_id', 'sale_date', 'neighborhood', 'property_type', 'area_sqft', 'bedrooms', 'year_built', 'sale_price']\n"
     ]
    }
   ],
   "source": [
    "# Clean column names and types; fill the missing area with the median.\n",
    "homes.columns = [re.sub(r\"[^a-z0-9]+\", \"_\", name.lower()).strip(\"_\") for name in homes.columns]\n",
    "homes[\"sale_date\"] = pd.to_datetime(homes[\"sale_date\"], errors=\"coerce\")\n",
    "homes[\"neighborhood\"] = homes[\"neighborhood\"].astype(str).str.strip().str.title()\n",
    "homes[\"area_sqft\"] = homes[\"area_sqft\"].fillna(homes[\"area_sqft\"].median())\n",
    "homes = homes.dropna(subset=[\"sale_date\", \"sale_price\"])\n",
    "print(\"Clean columns:\", homes.columns.tolist())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "20169d60",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recent properties: 124\n",
      "neighborhood  NearbyAmenities\n",
      "        West                7\n",
      "       South                4\n",
      "       North                5\n",
      "       North                5\n",
      "     Central                8\n"
     ]
    }
   ],
   "source": [
    "# Merge neighborhood amenities and select a recent subset.\n",
    "homes = homes.merge(amenities, left_on=\"neighborhood\", right_on=\"Neighborhood\", how=\"left\", validate=\"many_to_one\")\n",
    "homes = homes.drop(columns=\"Neighborhood\")\n",
    "recent = homes.loc[homes[\"sale_date\"] >= \"2024-01-01\"].copy()\n",
    "print(\"Recent properties:\", len(recent))\n",
    "print(recent[[\"neighborhood\", \"NearbyAmenities\"]].head().to_string(index=False))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "79fad92b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prices above IQR upper bound: 1\n",
      "              count       mean     median\n",
      "neighborhood                             \n",
      "Central          30  523646.54  534323.86\n",
      "North            39  390297.44  392842.99\n",
      "South            27  324892.40  332545.07\n",
      "West             28  489647.20  492930.45\n"
     ]
    }
   ],
   "source": [
    "# Cap unusually high prices and derive price per square foot.\n",
    "q1, q3 = recent[\"sale_price\"].quantile([0.25, 0.75])\n",
    "upper = q3 + 1.5 * (q3 - q1)\n",
    "print(\"Prices above IQR upper bound:\", int((recent[\"sale_price\"] > upper).sum()))\n",
    "recent[\"sale_price_capped\"] = recent[\"sale_price\"].clip(upper=upper)\n",
    "recent[\"price_per_sqft\"] = recent[\"sale_price_capped\"] / recent[\"area_sqft\"]\n",
    "print(recent.groupby(\"neighborhood\")[\"sale_price_capped\"].agg([\"count\", \"mean\", \"median\"]).round(2).to_string())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a6101480",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Encoded feature columns: ['area_sqft', 'bedrooms', 'year_built', 'NearbyAmenities', 'neighborhood_North', 'neighborhood_South', 'neighborhood_West', 'property_type_House', 'property_type_Townhouse']\n"
     ]
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Encode categorical columns for later modeling and compare neighborhoods.\n",
    "model_features = pd.get_dummies(recent[[\"neighborhood\", \"property_type\", \"area_sqft\", \"bedrooms\", \"year_built\", \"NearbyAmenities\"]], drop_first=True, dtype=int)\n",
    "print(\"Encoded feature columns:\", model_features.columns.tolist())\n",
    "recent.groupby(\"neighborhood\")[\"sale_price_capped\"].mean().sort_values().plot.barh(title=\"Average sale price by neighborhood\")\n",
    "plt.xlabel(\"Sale price\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "file_extension": ".py",
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
