{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bdu-stMDC9lL",
        "outputId": "358497ce-924b-49d1-9fc0-9008467c2dfb"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting sodapy\n",
            "  Downloading sodapy-2.2.0-py2.py3-none-any.whl (15 kB)\n",
            "Requirement already satisfied: requests>=2.28.1 in /usr/local/lib/python3.10/dist-packages (from sodapy) (2.31.0)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28.1->sodapy) (3.3.2)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28.1->sodapy) (3.6)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28.1->sodapy) (2.0.7)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28.1->sodapy) (2024.2.2)\n",
            "Installing collected packages: sodapy\n",
            "Successfully installed sodapy-2.2.0\n"
          ]
        }
      ],
      "source": [
        "# !pip install requests\n",
        "!pip install sodapy\n",
        "\n",
        "import requests\n",
        "from requests.auth import HTTPBasicAuth\n",
        "\n",
        "## Understanding, Exploring and Visualizing Data\n",
        "import pandas as pd\n",
        "import seaborn as sns\n",
        "import matplotlib\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn import datasets\n",
        "from sodapy import Socrata\n",
        "\n",
        "\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from sklearn.preprocessing import LabelEncoder\n",
        "from sklearn.metrics import mean_squared_error\n",
        "\n",
        "\n",
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.preprocessing import MinMaxScaler\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.ensemble import GradientBoostingClassifier\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.svm import LinearSVC\n",
        "from sklearn.neighbors import KNeighborsClassifier\n",
        "from sklearn.metrics import accuracy_score, confusion_matrix\n",
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.metrics import mean_squared_error\n",
        "from sklearn.preprocessing import OneHotEncoder\n",
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.pipeline import Pipeline\n",
        "import dask.dataframe as dd\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cry5oVSCGK-X",
        "outputId": "76cb8110-2457-4838-f590-976f79259033"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'pandas.core.frame.DataFrame'>\n",
            "RangeIndex: 200000 entries, 0 to 199999\n",
            "Data columns (total 45 columns):\n",
            " #   Column                       Non-Null Count   Dtype \n",
            "---  ------                       --------------   ----- \n",
            " 0   bble                         200000 non-null  object\n",
            " 1   boro                         200000 non-null  object\n",
            " 2   block                        200000 non-null  object\n",
            " 3   lot                          200000 non-null  object\n",
            " 4   owner                        191502 non-null  object\n",
            " 5   bldgcl                       200000 non-null  object\n",
            " 6   taxclass                     200000 non-null  object\n",
            " 7   ltfront                      200000 non-null  object\n",
            " 8   ltdepth                      200000 non-null  object\n",
            " 9   stories                      163223 non-null  object\n",
            " 10  fullval                      200000 non-null  object\n",
            " 11  avland                       200000 non-null  object\n",
            " 12  avtot                        200000 non-null  object\n",
            " 13  exland                       200000 non-null  object\n",
            " 14  extot                        200000 non-null  object\n",
            " 15  excd1                        56136 non-null   object\n",
            " 16  staddr                       199329 non-null  object\n",
            " 17  bldfront                     200000 non-null  object\n",
            " 18  blddepth                     200000 non-null  object\n",
            " 19  avland2                      144671 non-null  object\n",
            " 20  avtot2                       144671 non-null  object\n",
            " 21  exland2                      30762 non-null   object\n",
            " 22  extot2                       46378 non-null   object\n",
            " 23  period                       200000 non-null  object\n",
            " 24  year                         200000 non-null  object\n",
            " 25  valtype                      200000 non-null  object\n",
            " 26  zip                          175469 non-null  object\n",
            " 27  exmptcl                      4803 non-null    object\n",
            " 28  easement                     2872 non-null    object\n",
            " 29  borough                      166533 non-null  object\n",
            " 30  latitude                     166417 non-null  object\n",
            " 31  longitude                    166417 non-null  object\n",
            " 32  community_board              166417 non-null  object\n",
            " 33  council_district             166417 non-null  object\n",
            " 34  census_tract                 166417 non-null  object\n",
            " 35  bin                          165961 non-null  object\n",
            " 36  nta                          166417 non-null  object\n",
            " 37  geocoded_column              166417 non-null  object\n",
            " 38  :@computed_region_efsh_h5xi  165123 non-null  object\n",
            " 39  :@computed_region_f5dn_yrer  166404 non-null  object\n",
            " 40  :@computed_region_yeji_bk3q  166404 non-null  object\n",
            " 41  :@computed_region_92fq_4b7q  166404 non-null  object\n",
            " 42  :@computed_region_sbqj_enih  166404 non-null  object\n",
            " 43  ext                          11668 non-null   object\n",
            " 44  excd2                        3508 non-null    object\n",
            "dtypes: object(45)\n",
            "memory usage: 68.7+ MB\n"
          ]
        }
      ],
      "source": [
        "# First Dataset (2010 - 2019)\n",
        "# https://data.cityofnewyork.us/City-Government/Property-Valuation-and-Assessment-Data/yjxr-fw8i/about_data\n",
        "api_endpoint = \"https://data.cityofnewyork.us/resource/yjxr-fw8i.json\"\n",
        "api_key = \"7cdpwsl5p8eqeg1d24xsbq64w\"\n",
        "api_secret = \"31grq5eswi42uh3k9hu6eyjlkp3x0wb0bsyk4r9yu2jz2mr6b9\"\n",
        "\n",
        "response = requests.get(api_endpoint, auth=HTTPBasicAuth(api_key, api_secret))\n",
        "\n",
        "limit = 1000  # Number of items per request\n",
        "offset = 0    # Starting point for each request\n",
        "# Total records in the file is 9845857, we are omitting 2 records\n",
        "total_records = 9845855  # Total records in the dataset (adjust as needed)\n",
        "\n",
        "# Initialize an empty DataFrame to store all data\n",
        "all_data = pd.DataFrame()\n",
        "i =  0\n",
        "\n",
        "# We are only taking the first 60k data\n",
        "# 20022\n",
        "2\n",
        "while i < 200:\n",
        "    i += 1\n",
        "    # Use the API call to request the server for info\n",
        "    response = requests.get(api_endpoint, auth=HTTPBasicAuth(api_key, api_secret),\n",
        "                            params={\"$limit\": limit, \"$offset\": offset})\n",
        "\n",
        "    # Check if the request was successful\n",
        "    if response.status_code == 200:\n",
        "        # Load current data into a DataFrame\n",
        "        current_data = pd.DataFrame(response.json())\n",
        "\n",
        "        # Concatenate the current data to the main DataFrame\n",
        "        all_data = pd.concat([all_data, current_data], ignore_index=True)\n",
        "\n",
        "        # Update the offset for the next request\n",
        "        offset += limit\n",
        "        #print(current_data)\n",
        "    else:\n",
        "        print(f\"Failed to fetch data: {response.status_code}\")\n",
        "        print(response.text)\n",
        "        break\n",
        "\n",
        "# Save the DataFrame to a CSV file\n",
        "all_data.to_csv('nyc_data1.csv', index=False)\n",
        "\n",
        "# Display the shape of the DataFrame to verify the number of rows loaded\n",
        "# print(all_data.shape)\n",
        "\n",
        "\n",
        "df1 = all_data\n",
        "df1.info()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 236
        },
        "id": "no0qDem4GK4A",
        "outputId": "2b748f85-2b0b-4e7a-ded5-b8fcfbcf7e0e"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        parid boro block lot rectype  year secvol pymktland pymkttot  \\\n",
              "0  3025410030    3  2541  30       1  2021    901     87000  1721000   \n",
              "1  3025410033    3  2541  33       1  2021    901    106000  2562400   \n",
              "2  3025410036    3  2541  36       1  2021    901     87000  1939200   \n",
              "3  3025410038    3  2541  38       1  2021    901    314000  1593000   \n",
              "4  3025410039    3  2541  39       1  2021    901    298000  1942000   \n",
              "\n",
              "  pyactland  ... cbntaxclass fintaxclass easement reuc_ref subident_reuc  \\\n",
              "0     39150  ...         NaN         NaN      NaN      NaN           NaN   \n",
              "1     47700  ...         NaN         NaN      NaN      NaN           NaN   \n",
              "2     39150  ...         NaN         NaN      NaN      NaN           NaN   \n",
              "3     18840  ...         NaN         NaN      NaN      NaN           NaN   \n",
              "4     17880  ...         NaN         NaN      NaN      NaN           NaN   \n",
              "\n",
              "  ident subident roll_section reuc_description valref  \n",
              "0   NaN      NaN          NaN              NaN    NaN  \n",
              "1   NaN      NaN          NaN              NaN    NaN  \n",
              "2   NaN      NaN          NaN              NaN    NaN  \n",
              "3   NaN      NaN          NaN              NaN    NaN  \n",
              "4   NaN      NaN          NaN              NaN    NaN  \n",
              "\n",
              "[5 rows x 132 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-9736f7f9-0796-4411-bbd3-a5b966a6e970\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>parid</th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>rectype</th>\n",
              "      <th>year</th>\n",
              "      <th>secvol</th>\n",
              "      <th>pymktland</th>\n",
              "      <th>pymkttot</th>\n",
              "      <th>pyactland</th>\n",
              "      <th>...</th>\n",
              "      <th>cbntaxclass</th>\n",
              "      <th>fintaxclass</th>\n",
              "      <th>easement</th>\n",
              "      <th>reuc_ref</th>\n",
              "      <th>subident_reuc</th>\n",
              "      <th>ident</th>\n",
              "      <th>subident</th>\n",
              "      <th>roll_section</th>\n",
              "      <th>reuc_description</th>\n",
              "      <th>valref</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3025410030</td>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>1</td>\n",
              "      <td>2021</td>\n",
              "      <td>901</td>\n",
              "      <td>87000</td>\n",
              "      <td>1721000</td>\n",
              "      <td>39150</td>\n",
              "      <td>...</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3025410033</td>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>1</td>\n",
              "      <td>2021</td>\n",
              "      <td>901</td>\n",
              "      <td>106000</td>\n",
              "      <td>2562400</td>\n",
              "      <td>47700</td>\n",
              "      <td>...</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3025410036</td>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>1</td>\n",
              "      <td>2021</td>\n",
              "      <td>901</td>\n",
              "      <td>87000</td>\n",
              "      <td>1939200</td>\n",
              "      <td>39150</td>\n",
              "      <td>...</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3025410038</td>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>1</td>\n",
              "      <td>2021</td>\n",
              "      <td>901</td>\n",
              "      <td>314000</td>\n",
              "      <td>1593000</td>\n",
              "      <td>18840</td>\n",
              "      <td>...</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3025410039</td>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>1</td>\n",
              "      <td>2021</td>\n",
              "      <td>901</td>\n",
              "      <td>298000</td>\n",
              "      <td>1942000</td>\n",
              "      <td>17880</td>\n",
              "      <td>...</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 132 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-9736f7f9-0796-4411-bbd3-a5b966a6e970')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-9736f7f9-0796-4411-bbd3-a5b966a6e970 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-9736f7f9-0796-4411-bbd3-a5b966a6e970');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-2d431d24-06d0-4ee4-aea6-cf6016906cb1\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-2d431d24-06d0-4ee4-aea6-cf6016906cb1')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-2d431d24-06d0-4ee4-aea6-cf6016906cb1 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df2"
            }
          },
          "metadata": {},
          "execution_count": 63
        }
      ],
      "source": [
        "# Second Dataset (NEW) (2021-2023)\n",
        "# https://data.cityofnewyork.us/City-Government/Property-Valuation-and-Assessment-Data-Tax-Classes/8y4t-faws/data_preview\n",
        "\n",
        "api_endpoint = \"https://data.cityofnewyork.us/resource/8y4t-faws.json\"\n",
        "api_key = \"6iicdls0lllux5k2zh4wmcbcy\"\n",
        "api_secret = \"nol8pwnk4foppzbxrm8vl23sgljt0mqzkxpzo0xscgbxs1zv9\"\n",
        "\n",
        "response = requests.get(api_endpoint, auth=HTTPBasicAuth(api_key, api_secret))\n",
        "\n",
        "limit = 1000  # Number of items per request\n",
        "offset = 0    # Starting point for each request\n",
        "# Total records in the file is 9845857, we are omitting 2 records\n",
        "total_records = 9845855  # Total records in the dataset (adjust as needed)\n",
        "\n",
        "# Initialize an empty DataFrame to store all data\n",
        "all_data = pd.DataFrame()\n",
        "i =  0\n",
        "\n",
        "# We are only taking the first 60k data\n",
        "# 200\n",
        "while i < 200:\n",
        "    i += 1\n",
        "    # Use the API call to request the server for info\n",
        "    response = requests.get(api_endpoint, auth=HTTPBasicAuth(api_key, api_secret),\n",
        "                            params={\"$limit\": limit, \"$offset\": offset})\n",
        "\n",
        "    # Check if the request was successful\n",
        "    if response.status_code == 200:\n",
        "        # Load current data into a DataFrame\n",
        "        current_data = pd.DataFrame(response.json())\n",
        "\n",
        "        # Concatenate the current data to the main DataFrame\n",
        "        all_data = pd.concat([all_data, current_data], ignore_index=True)\n",
        "\n",
        "        # Update the offset for the next request\n",
        "        offset += limit\n",
        "        #print(current_data)\n",
        "    else:\n",
        "        print(f\"Failed to fetch data: {response.status_code}\")\n",
        "        print(response.text)\n",
        "        break\n",
        "\n",
        "# Save the DataFrame to a CSV file\n",
        "all_data.to_csv('nyc_data2.csv', index=False)\n",
        "\n",
        "# Display the shape of the DataFrame to verify the number of rows loaded\n",
        "# print(all_data.shape)\n",
        "\n",
        "\n",
        "df2 = all_data\n",
        "df2.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AJwJdGMrh3tu"
      },
      "source": [
        "\n",
        "Dataset common:\n",
        "\n",
        "Dataset1:Dataset2\n",
        "\n",
        "2010      :    2025\n",
        "\n",
        "\n",
        "\n",
        "---\n",
        "\n",
        "\n",
        "boro : boro              (borough)\n",
        "\n",
        "block : block            (block range by borough)\n",
        "\n",
        "lot : lot                     (Unique number within BORO/BLOCK)\n",
        "\n",
        "easement : easement (codes for things such as A for air rights and R for railroads)\n",
        "\n",
        "year : year\n",
        "\n",
        "FINTAXCLASS : taxclass\n",
        "\n",
        "bldg_class : bldgcl      (building class)\n",
        "\n",
        "owner : owner\n",
        "\n",
        "street_name : staddr    (street name : street address   (is there a diff))\n",
        "\n",
        "LOT_FRT : LTFRONT     (lot frontage : lot width)\n",
        "\n",
        "LOT_DEP : ltdep           (lot depth)\n",
        "\n",
        "bld_story : stories       (number of stories)\n",
        "\n",
        "\n",
        "PYMKTLAND : FULLVAL                 Market Assessed Land Value\n",
        "\n",
        "PYACTLAND : AVLAND                  Actual Assessed Land Value\n",
        "\n",
        "PYACTTOT : AVTOT                        Actual Assessed Total Value\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "---\n",
        "\n",
        "\n",
        "Dataset 1 Useful:\n",
        "\n",
        "\n",
        "(These values are originally assessed)\n",
        "\n",
        "PYMKTLAND             Market Assessed Land Value\n",
        "\n",
        "PYMKTTOT                Market Assessed Total Value\n",
        "\n",
        "PYACTLAND              Actual Assessed Land Value\n",
        "\n",
        "PYACTTOT                 Actual Assessed Total Value\n",
        "\n",
        "PYTAXCLASS             Property Tax Class\n",
        "\n",
        "\n",
        "(These values are finally assessed)\n",
        "\n",
        "FINMKTLAND              Final Market Assessed Land Value\n",
        "\n",
        "FINMKTTOT                 Final Market Assessed Total Value\n",
        "\n",
        "FINACTLAND               Final Actual Assessed Land Value\n",
        "\n",
        "FINACTTOT                  Final Actual Assessed Total Value\n",
        "\n",
        "FINTAXCLASS              Property Tax Class\n",
        "\n",
        "\n",
        "(These values are currently assessed)\n",
        "\n",
        "CURMKTLAND            Current Market Assessed Land Value\n",
        "\n",
        "CURMKTTOT               Current Market Assessed Total Value\n",
        "\n",
        "CURACTLAND             Current Actual Assessed Land Value\n",
        "\n",
        "CURACTTOT                Current Actual Assessed Total Value\n",
        "\n",
        "\n",
        "noav                           A building in progress\n",
        "\n",
        "stcode                        street code (idk)\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "---\n",
        "\n",
        "\n",
        "\n",
        "Dataset 2 Useful:\n",
        "\n",
        "FULLVAL            Market Value\n",
        "\n",
        "AVLAND            Actual Land Value\n",
        "\n",
        "AVTOT               Actual Total Value\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Py1S2O6-f1VA",
        "outputId": "ebc39960-585f-414a-e18b-4e9d7432b246"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-64-2e21fd54fc22>:5: DtypeWarning: Columns (0,62,66,69,115,120,122,123,124,125,126,127,128,130,131) have mixed types. Specify dtype option on import or set low_memory=False.\n",
            "  df2 = pd.read_csv('nyc_data2.csv')\n"
          ]
        }
      ],
      "source": [
        "# Read from CSV\n",
        "\n",
        "df1 = pd.read_csv('nyc_data1.csv')\n",
        "\n",
        "df2 = pd.read_csv('nyc_data2.csv')\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LI7VStz0tRXJ",
        "outputId": "0abbb4d6-c8fa-42bf-954a-8d90a393c1ac"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0          87000\n",
              "1         106000\n",
              "2          87000\n",
              "3         314000\n",
              "4         298000\n",
              "           ...  \n",
              "199995    212000\n",
              "199996    168000\n",
              "199997    148000\n",
              "199998    188000\n",
              "199999    238000\n",
              "Name: pymktland, Length: 200000, dtype: int64"
            ]
          },
          "metadata": {},
          "execution_count": 65
        }
      ],
      "source": [
        "df2['pymktland']"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PbSEQazKhS0I",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "f4d9ace4-4edc-4bd8-d707-f278b2fdfbb3"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "        boro  block  lot easement  year taxclass bldgcl               owner  \\\n",
            "0          3   2541   30      NaN  2021      NaN     C1             299 LLC   \n",
            "1          3   2541   33      NaN  2021      NaN     C1             293 LLC   \n",
            "2          3   2541   36      NaN  2021      NaN     C1            287A LLC   \n",
            "3          3   2541   38      NaN  2021      NaN     B9  JUSZCZAK, ANTONINA   \n",
            "4          3   2541   39      NaN  2021      NaN     B9     SAWICKI CZESLAW   \n",
            "...      ...    ...  ...      ...   ...      ...    ...                 ...   \n",
            "199284     3   7820   15      NaN  2021      NaN     B1       VELEZ, LUIS A   \n",
            "199285     3   7820   17      NaN  2021      NaN     B1      GEDEON GINETTE   \n",
            "199286     3   7820   18      NaN  2021      NaN     B1        MARK, GERARD   \n",
            "199287     3   7820   19      NaN  2021      NaN     B1         BAHL PHILIP   \n",
            "199288     3   7820   21      NaN  2021      NaN     B3     BENNETT, ROBERT   \n",
            "\n",
            "                      staddr  ltfront  ltdepth  stories  fullval  avland  \\\n",
            "0       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
            "1       MCGUINNESS BOULEVARD    76.00    35.00      5.0   106000   47700   \n",
            "2       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
            "3                JAVA STREET    25.00   100.00      2.0   314000   18840   \n",
            "4                JAVA STREET    25.00   100.00      3.0   298000   17880   \n",
            "...                      ...      ...      ...      ...      ...     ...   \n",
            "199284         KINGS HIGHWAY    35.00   114.00      2.0   212000   12720   \n",
            "199285         KINGS HIGHWAY    20.00   107.00      2.0   168000   10080   \n",
            "199286         KINGS HIGHWAY    20.00    94.33      2.0   148000    8880   \n",
            "199287         KINGS HIGHWAY    23.33    81.67      2.0   188000   11280   \n",
            "199288         KINGS HIGHWAY    91.00    52.33      2.0   238000   14280   \n",
            "\n",
            "          avtot  \n",
            "0        774450  \n",
            "1       1153080  \n",
            "2        872640  \n",
            "3         95580  \n",
            "4        116520  \n",
            "...         ...  \n",
            "199284    42120  \n",
            "199285    36540  \n",
            "199286    36540  \n",
            "199287    41880  \n",
            "199288    48420  \n",
            "\n",
            "[199289 rows x 15 columns]\n",
            "        boro  block  lot easement  year taxclass bldgcl               owner  \\\n",
            "0          3   2541   30      NaN  2021      NaN     C1             299 LLC   \n",
            "1          3   2541   33      NaN  2021      NaN     C1             293 LLC   \n",
            "2          3   2541   36      NaN  2021      NaN     C1            287A LLC   \n",
            "3          3   2541   38      NaN  2021      NaN     B9  JUSZCZAK, ANTONINA   \n",
            "4          3   2541   39      NaN  2021      NaN     B9     SAWICKI CZESLAW   \n",
            "...      ...    ...  ...      ...   ...      ...    ...                 ...   \n",
            "199284     3   7820   15      NaN  2021      NaN     B1       VELEZ, LUIS A   \n",
            "199285     3   7820   17      NaN  2021      NaN     B1      GEDEON GINETTE   \n",
            "199286     3   7820   18      NaN  2021      NaN     B1        MARK, GERARD   \n",
            "199287     3   7820   19      NaN  2021      NaN     B1         BAHL PHILIP   \n",
            "199288     3   7820   21      NaN  2021      NaN     B3     BENNETT, ROBERT   \n",
            "\n",
            "                      staddr  ltfront  ltdepth  stories  fullval  avland  \\\n",
            "0       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
            "1       MCGUINNESS BOULEVARD    76.00    35.00      5.0   106000   47700   \n",
            "2       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
            "3                JAVA STREET    25.00   100.00      2.0   314000   18840   \n",
            "4                JAVA STREET    25.00   100.00      3.0   298000   17880   \n",
            "...                      ...      ...      ...      ...      ...     ...   \n",
            "199284         KINGS HIGHWAY    35.00   114.00      2.0   212000   12720   \n",
            "199285         KINGS HIGHWAY    20.00   107.00      2.0   168000   10080   \n",
            "199286         KINGS HIGHWAY    20.00    94.33      2.0   148000    8880   \n",
            "199287         KINGS HIGHWAY    23.33    81.67      2.0   188000   11280   \n",
            "199288         KINGS HIGHWAY    91.00    52.33      2.0   238000   14280   \n",
            "\n",
            "          avtot  \n",
            "0        774450  \n",
            "1       1153080  \n",
            "2        872640  \n",
            "3         95580  \n",
            "4        116520  \n",
            "...         ...  \n",
            "199284    42120  \n",
            "199285    36540  \n",
            "199286    36540  \n",
            "199287    41880  \n",
            "199288    48420  \n",
            "\n",
            "[199289 rows x 15 columns]\n"
          ]
        }
      ],
      "source": [
        "# This is to combine the values we want from df1 (2010-2019) and df2 (2021-2025), we have also cut the data to 2021-2023\n",
        "\n",
        "# This is because d1 has the years formatted like this 2010/11 when we want it as a signular year 2010\n",
        "df1['year'] = df1['year'].str.slice(0, 4)\n",
        "\n",
        "# Drop rows where the year is 2024 or 2025\n",
        "df2 = df2[~df2['year'].isin([2024, 2025])]\n",
        "\n",
        "\n",
        "columns_mapping = {\n",
        "    'boro': 'boro',             # d2:boro -> d3:boro\n",
        "    'block': 'block',           # d2:block -> d3:block\n",
        "    'lot': 'lot',               # d2:lot -> d3:lot\n",
        "    'easement': 'easement',     # d2:easement -> d3:easement\n",
        "    'year': 'year',             # d2:year -> d3:year\n",
        "    'fintaxclass': 'taxclass',  # d2:FINTAXCLASS -> d3:taxclass\n",
        "    'bldg_class': 'bldgcl',     # d2:bldg_class -> d3:bldgcl\n",
        "    'owner': 'owner',           # d2:owner -> d3:owner\n",
        "    'street_name': 'staddr',    # d2:street_name -> d3:staddr\n",
        "    'lot_frt': 'ltfront',       # d2:LOT_FRT -> d3:LTFRONT\n",
        "    'lot_dep': 'ltdepth',         # d2:LOT_DEP -> d3:ltdep\n",
        "    'bld_story': 'stories',     # d2:bld_story -> d3:stories\n",
        "    'pymktland': 'fullval',     # d2:PYMKTLAND -> d3:FULLVAL\n",
        "    'pyactland': 'avland',      # d2:PYACTLAND -> d3:AVLAND\n",
        "    'pyacttot': 'avtot'         # d2:PYACTTOT -> d3:AVTOT\n",
        "}\n",
        "\n",
        "\n",
        "df3_columns = ['boro', 'block', 'lot', 'easement', 'year', 'taxclass', 'bldgcl',\n",
        "              'owner', 'staddr', 'ltfront', 'ltdepth', 'stories', 'fullval', 'avland', 'avtot']\n",
        "\n",
        "df3 = pd.DataFrame(columns=df3_columns)\n",
        "\n",
        "# Select columns safely from df1_renamed and df2\n",
        "# df2_renamed = df2.rename(columns={v: k for k, v in columns_mapping.items()})\n",
        "\n",
        "# Create a new dictionary with keys and values swapped\n",
        "'''\n",
        "swapped_columns_mapping = {}\n",
        "for original_column, new_column in columns_mapping.items():\n",
        "    swapped_columns_mapping[new_column] = original_column\n",
        "\n",
        "# Use the new dictionary to rename columns in df2\n",
        "df2_renamed = df2.rename(columns=swapped_columns_mapping)\n",
        "print(df2_renamed)\n",
        "df2_selected = df2_renamed.reindex(columns=df3_columns)\n",
        "\n",
        "\n",
        "# df1_selected = df1.reindex(columns=df3_columns)\n",
        "\n",
        "'''\n",
        "# Step 1: Filter columns in df2 that are keys in the columns_mapping\n",
        "df2_filtered = df2[list(columns_mapping.keys())]\n",
        "\n",
        "# Step 2: Rename columns in df2 according to the mapping\n",
        "df2_renamed = df2_filtered.rename(columns=columns_mapping)\n",
        "\n",
        "# Step 3: Merge or Update\n",
        "# Option 1: Merge\n",
        "df3_merged = pd.merge(df3, df2_renamed, on=list(columns_mapping.values()), how='outer')\n",
        "print(df3_merged)\n",
        "# Option 2: Update\n",
        "df3.update(df2_renamed)\n",
        "print(df3_merged)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "L7uSGb6GbIXc",
        "outputId": "197d7fab-8daf-4599-c72b-0f76b9ffdc68"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block  lot easement  year taxclass bldgcl               owner  \\\n",
              "0          3   2541   30      NaN  2021      NaN     C1             299 LLC   \n",
              "1          3   2541   33      NaN  2021      NaN     C1             293 LLC   \n",
              "2          3   2541   36      NaN  2021      NaN     C1            287A LLC   \n",
              "3          3   2541   38      NaN  2021      NaN     B9  JUSZCZAK, ANTONINA   \n",
              "4          3   2541   39      NaN  2021      NaN     B9     SAWICKI CZESLAW   \n",
              "...      ...    ...  ...      ...   ...      ...    ...                 ...   \n",
              "199995     3   7820   15      NaN  2021      NaN     B1       VELEZ, LUIS A   \n",
              "199996     3   7820   17      NaN  2021      NaN     B1      GEDEON GINETTE   \n",
              "199997     3   7820   18      NaN  2021      NaN     B1        MARK, GERARD   \n",
              "199998     3   7820   19      NaN  2021      NaN     B1         BAHL PHILIP   \n",
              "199999     3   7820   21      NaN  2021      NaN     B3     BENNETT, ROBERT   \n",
              "\n",
              "                      staddr  ltfront  ltdepth  stories  fullval  avland  \\\n",
              "0       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
              "1       MCGUINNESS BOULEVARD    76.00    35.00      5.0   106000   47700   \n",
              "2       MCGUINNESS BOULEVARD    62.00    35.00      5.0    87000   39150   \n",
              "3                JAVA STREET    25.00   100.00      2.0   314000   18840   \n",
              "4                JAVA STREET    25.00   100.00      3.0   298000   17880   \n",
              "...                      ...      ...      ...      ...      ...     ...   \n",
              "199995         KINGS HIGHWAY    35.00   114.00      2.0   212000   12720   \n",
              "199996         KINGS HIGHWAY    20.00   107.00      2.0   168000   10080   \n",
              "199997         KINGS HIGHWAY    20.00    94.33      2.0   148000    8880   \n",
              "199998         KINGS HIGHWAY    23.33    81.67      2.0   188000   11280   \n",
              "199999         KINGS HIGHWAY    91.00    52.33      2.0   238000   14280   \n",
              "\n",
              "          avtot  \n",
              "0        774450  \n",
              "1       1153080  \n",
              "2        872640  \n",
              "3         95580  \n",
              "4        116520  \n",
              "...         ...  \n",
              "199995    42120  \n",
              "199996    36540  \n",
              "199997    36540  \n",
              "199998    41880  \n",
              "199999    48420  \n",
              "\n",
              "[199289 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-68d3e775-e8df-4da8-8ffa-d2eea998451e\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.00</td>\n",
              "      <td>35.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.00</td>\n",
              "      <td>35.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.00</td>\n",
              "      <td>35.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.00</td>\n",
              "      <td>100.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.00</td>\n",
              "      <td>100.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199995</th>\n",
              "      <td>3</td>\n",
              "      <td>7820</td>\n",
              "      <td>15</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B1</td>\n",
              "      <td>VELEZ, LUIS A</td>\n",
              "      <td>KINGS HIGHWAY</td>\n",
              "      <td>35.00</td>\n",
              "      <td>114.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>212000</td>\n",
              "      <td>12720</td>\n",
              "      <td>42120</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199996</th>\n",
              "      <td>3</td>\n",
              "      <td>7820</td>\n",
              "      <td>17</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B1</td>\n",
              "      <td>GEDEON GINETTE</td>\n",
              "      <td>KINGS HIGHWAY</td>\n",
              "      <td>20.00</td>\n",
              "      <td>107.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>168000</td>\n",
              "      <td>10080</td>\n",
              "      <td>36540</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199997</th>\n",
              "      <td>3</td>\n",
              "      <td>7820</td>\n",
              "      <td>18</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B1</td>\n",
              "      <td>MARK, GERARD</td>\n",
              "      <td>KINGS HIGHWAY</td>\n",
              "      <td>20.00</td>\n",
              "      <td>94.33</td>\n",
              "      <td>2.0</td>\n",
              "      <td>148000</td>\n",
              "      <td>8880</td>\n",
              "      <td>36540</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199998</th>\n",
              "      <td>3</td>\n",
              "      <td>7820</td>\n",
              "      <td>19</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B1</td>\n",
              "      <td>BAHL PHILIP</td>\n",
              "      <td>KINGS HIGHWAY</td>\n",
              "      <td>23.33</td>\n",
              "      <td>81.67</td>\n",
              "      <td>2.0</td>\n",
              "      <td>188000</td>\n",
              "      <td>11280</td>\n",
              "      <td>41880</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199999</th>\n",
              "      <td>3</td>\n",
              "      <td>7820</td>\n",
              "      <td>21</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B3</td>\n",
              "      <td>BENNETT, ROBERT</td>\n",
              "      <td>KINGS HIGHWAY</td>\n",
              "      <td>91.00</td>\n",
              "      <td>52.33</td>\n",
              "      <td>2.0</td>\n",
              "      <td>238000</td>\n",
              "      <td>14280</td>\n",
              "      <td>48420</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>199289 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-68d3e775-e8df-4da8-8ffa-d2eea998451e')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-68d3e775-e8df-4da8-8ffa-d2eea998451e button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-68d3e775-e8df-4da8-8ffa-d2eea998451e');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-39702964-38ea-4ad4-a5c1-54f9ccf69957\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-39702964-38ea-4ad4-a5c1-54f9ccf69957')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-39702964-38ea-4ad4-a5c1-54f9ccf69957 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df2_renamed"
            }
          },
          "metadata": {},
          "execution_count": 67
        }
      ],
      "source": [
        "df2_renamed"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "OrO1dxjzYfsO"
      },
      "outputs": [],
      "source": [
        "# Delete any columns that arent defined in df3_columns\n",
        "df1 = df1[df3_columns]\n",
        "\n",
        "# Concatenate df1 and df2\n",
        "df3 = pd.concat([df2_renamed, df1], ignore_index=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "I6KgWYjCkUe4",
        "outputId": "d1f7e3df-c50c-4e62-de3d-cf655ee77860"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block   lot easement  year taxclass bldgcl  \\\n",
              "0          3   2541    30      NaN  2021      NaN     C1   \n",
              "1          3   2541    33      NaN  2021      NaN     C1   \n",
              "2          3   2541    36      NaN  2021      NaN     C1   \n",
              "3          3   2541    38      NaN  2021      NaN     B9   \n",
              "4          3   2541    39      NaN  2021      NaN     B9   \n",
              "...      ...    ...   ...      ...   ...      ...    ...   \n",
              "399284     2   3432  1941      NaN  2018       1A     R3   \n",
              "399285     2   3332    42      NaN  2018        2     C7   \n",
              "399286     2   3385    38      NaN  2018        1     B1   \n",
              "399287     2   2963     6      NaN  2018       2B     C1   \n",
              "399288     2   2928    33      NaN  2018        4     Z9   \n",
              "\n",
              "                        owner                staddr  ltfront  ltdepth  \\\n",
              "0                     299 LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "1                     293 LLC  MCGUINNESS BOULEVARD     76.0     35.0   \n",
              "2                    287A LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "3          JUSZCZAK, ANTONINA           JAVA STREET     25.0    100.0   \n",
              "4             SAWICKI CZESLAW           JAVA STREET     25.0    100.0   \n",
              "...                       ...                   ...      ...      ...   \n",
              "399284        ALEMAN, CYNTHIA        116 SURF DRIVE      0.0      0.0   \n",
              "399285  3105 DECATUR ASSOCIAT   3105 DECATUR AVENUE    125.0    119.0   \n",
              "399286            HOGAN, RUTH   345 EAST 236 STREET     25.0    100.0   \n",
              "399287  HOUSING WORKS LYMAN P  1412 PROSPECT AVENUE     28.0    162.0   \n",
              "399288  THOMAS MOTT OSBORNE M   549 EAST 171 STREET     75.0    141.0   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "0           5.0    87000   39150   774450  \n",
              "1           5.0   106000   47700  1153080  \n",
              "2           5.0    87000   39150   872640  \n",
              "3           2.0   314000   18840    95580  \n",
              "4           3.0   298000   17880   116520  \n",
              "...         ...      ...     ...      ...  \n",
              "399284      3.0   422839     706    18814  \n",
              "399285      5.0  3346000   79200  1505700  \n",
              "399286      2.0   632000   13020    37920  \n",
              "399287      4.0  1174000    1362    76125  \n",
              "399288      1.0   188000   59850    84600  \n",
              "\n",
              "[399289 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-53f0e272-4d92-4441-a360-1fdee3ad418a\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399284</th>\n",
              "      <td>2</td>\n",
              "      <td>3432</td>\n",
              "      <td>1941</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1A</td>\n",
              "      <td>R3</td>\n",
              "      <td>ALEMAN, CYNTHIA</td>\n",
              "      <td>116 SURF DRIVE</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>422839</td>\n",
              "      <td>706</td>\n",
              "      <td>18814</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399285</th>\n",
              "      <td>2</td>\n",
              "      <td>3332</td>\n",
              "      <td>42</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>3105 DECATUR ASSOCIAT</td>\n",
              "      <td>3105 DECATUR AVENUE</td>\n",
              "      <td>125.0</td>\n",
              "      <td>119.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>3346000</td>\n",
              "      <td>79200</td>\n",
              "      <td>1505700</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399286</th>\n",
              "      <td>2</td>\n",
              "      <td>3385</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>HOGAN, RUTH</td>\n",
              "      <td>345 EAST 236 STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>632000</td>\n",
              "      <td>13020</td>\n",
              "      <td>37920</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399287</th>\n",
              "      <td>2</td>\n",
              "      <td>2963</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2B</td>\n",
              "      <td>C1</td>\n",
              "      <td>HOUSING WORKS LYMAN P</td>\n",
              "      <td>1412 PROSPECT AVENUE</td>\n",
              "      <td>28.0</td>\n",
              "      <td>162.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>1174000</td>\n",
              "      <td>1362</td>\n",
              "      <td>76125</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399288</th>\n",
              "      <td>2</td>\n",
              "      <td>2928</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>Z9</td>\n",
              "      <td>THOMAS MOTT OSBORNE M</td>\n",
              "      <td>549 EAST 171 STREET</td>\n",
              "      <td>75.0</td>\n",
              "      <td>141.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>188000</td>\n",
              "      <td>59850</td>\n",
              "      <td>84600</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>399289 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-53f0e272-4d92-4441-a360-1fdee3ad418a')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-53f0e272-4d92-4441-a360-1fdee3ad418a button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-53f0e272-4d92-4441-a360-1fdee3ad418a');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-30e2a1d1-52b8-425c-b91e-33fff6f01b7b\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-30e2a1d1-52b8-425c-b91e-33fff6f01b7b')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-30e2a1d1-52b8-425c-b91e-33fff6f01b7b button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df3"
            }
          },
          "metadata": {},
          "execution_count": 69
        }
      ],
      "source": [
        "\n",
        "df3"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "coTjb3RM4Ez9",
        "outputId": "4b4b3e6e-9ac2-496f-f4c3-d04e47177c4b"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block   lot easement  year taxclass bldgcl  \\\n",
              "0          3   2541    30      NaN  2021      NaN     C1   \n",
              "1          3   2541    33      NaN  2021      NaN     C1   \n",
              "2          3   2541    36      NaN  2021      NaN     C1   \n",
              "3          3   2541    38      NaN  2021      NaN     B9   \n",
              "4          3   2541    39      NaN  2021      NaN     B9   \n",
              "...      ...    ...   ...      ...   ...      ...    ...   \n",
              "399284     2   3432  1941      NaN  2018       1A     R3   \n",
              "399285     2   3332    42      NaN  2018        2     C7   \n",
              "399286     2   3385    38      NaN  2018        1     B1   \n",
              "399287     2   2963     6      NaN  2018       2B     C1   \n",
              "399288     2   2928    33      NaN  2018        4     Z9   \n",
              "\n",
              "                        owner                staddr  ltfront  ltdepth  \\\n",
              "0                     299 LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "1                     293 LLC  MCGUINNESS BOULEVARD     76.0     35.0   \n",
              "2                    287A LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "3          JUSZCZAK, ANTONINA           JAVA STREET     25.0    100.0   \n",
              "4             SAWICKI CZESLAW           JAVA STREET     25.0    100.0   \n",
              "...                       ...                   ...      ...      ...   \n",
              "399284        ALEMAN, CYNTHIA        116 SURF DRIVE      0.0      0.0   \n",
              "399285  3105 DECATUR ASSOCIAT   3105 DECATUR AVENUE    125.0    119.0   \n",
              "399286            HOGAN, RUTH   345 EAST 236 STREET     25.0    100.0   \n",
              "399287  HOUSING WORKS LYMAN P  1412 PROSPECT AVENUE     28.0    162.0   \n",
              "399288  THOMAS MOTT OSBORNE M   549 EAST 171 STREET     75.0    141.0   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "0           5.0    87000   39150   774450  \n",
              "1           5.0   106000   47700  1153080  \n",
              "2           5.0    87000   39150   872640  \n",
              "3           2.0   314000   18840    95580  \n",
              "4           3.0   298000   17880   116520  \n",
              "...         ...      ...     ...      ...  \n",
              "399284      3.0   422839     706    18814  \n",
              "399285      5.0  3346000   79200  1505700  \n",
              "399286      2.0   632000   13020    37920  \n",
              "399287      4.0  1174000    1362    76125  \n",
              "399288      1.0   188000   59850    84600  \n",
              "\n",
              "[386557 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-86eabd30-2969-4de9-aabe-78e1d9c113c7\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399284</th>\n",
              "      <td>2</td>\n",
              "      <td>3432</td>\n",
              "      <td>1941</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1A</td>\n",
              "      <td>R3</td>\n",
              "      <td>ALEMAN, CYNTHIA</td>\n",
              "      <td>116 SURF DRIVE</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>422839</td>\n",
              "      <td>706</td>\n",
              "      <td>18814</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399285</th>\n",
              "      <td>2</td>\n",
              "      <td>3332</td>\n",
              "      <td>42</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>3105 DECATUR ASSOCIAT</td>\n",
              "      <td>3105 DECATUR AVENUE</td>\n",
              "      <td>125.0</td>\n",
              "      <td>119.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>3346000</td>\n",
              "      <td>79200</td>\n",
              "      <td>1505700</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399286</th>\n",
              "      <td>2</td>\n",
              "      <td>3385</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>HOGAN, RUTH</td>\n",
              "      <td>345 EAST 236 STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>632000</td>\n",
              "      <td>13020</td>\n",
              "      <td>37920</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399287</th>\n",
              "      <td>2</td>\n",
              "      <td>2963</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2B</td>\n",
              "      <td>C1</td>\n",
              "      <td>HOUSING WORKS LYMAN P</td>\n",
              "      <td>1412 PROSPECT AVENUE</td>\n",
              "      <td>28.0</td>\n",
              "      <td>162.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>1174000</td>\n",
              "      <td>1362</td>\n",
              "      <td>76125</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399288</th>\n",
              "      <td>2</td>\n",
              "      <td>2928</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>Z9</td>\n",
              "      <td>THOMAS MOTT OSBORNE M</td>\n",
              "      <td>549 EAST 171 STREET</td>\n",
              "      <td>75.0</td>\n",
              "      <td>141.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>188000</td>\n",
              "      <td>59850</td>\n",
              "      <td>84600</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>386557 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-86eabd30-2969-4de9-aabe-78e1d9c113c7')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-86eabd30-2969-4de9-aabe-78e1d9c113c7 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-86eabd30-2969-4de9-aabe-78e1d9c113c7');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-e58d55a4-527a-41e2-ae3f-02d80e6e134d\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-e58d55a4-527a-41e2-ae3f-02d80e6e134d')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-e58d55a4-527a-41e2-ae3f-02d80e6e134d button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df4"
            }
          },
          "metadata": {},
          "execution_count": 70
        }
      ],
      "source": [
        "# drop data without a full valuation\n",
        "df3['year'] = df3['year'].astype(int)\n",
        "df4 = df3.dropna(subset=['fullval'])\n",
        "\n",
        "\n",
        "# df4 = df3.dropna(subset=['staddr'])\n",
        "\n",
        "\n",
        "# Drop rows where FULLVAL is 0\n",
        "df4 = df4[df4['fullval'] != 0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2Q8humcKhN9I"
      },
      "outputs": [],
      "source": [
        "if 'staddr' in df3.columns:\n",
        "    # Drop rows with missing values in 'staddr'\n",
        "    df4 = df3.dropna(subset=['staddr'])\n",
        "    df4 = df3.dropna(subset=['fullval'])\n",
        "\n",
        "    # Drop rows where FULLVAL is 0\n",
        "    df4 = df4[df4['fullval'] != 0]\n",
        "else:\n",
        "    print(\"'staddr' column not found in df3\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "M3ItjdrShIvO",
        "outputId": "8336ddd5-1e65-4e97-fd88-b4aaec0560a3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block   lot easement  year taxclass bldgcl  \\\n",
              "0          3   2541    30      NaN  2021      NaN     C1   \n",
              "1          3   2541    33      NaN  2021      NaN     C1   \n",
              "2          3   2541    36      NaN  2021      NaN     C1   \n",
              "3          3   2541    38      NaN  2021      NaN     B9   \n",
              "4          3   2541    39      NaN  2021      NaN     B9   \n",
              "...      ...    ...   ...      ...   ...      ...    ...   \n",
              "399284     2   3432  1941      NaN  2018       1A     R3   \n",
              "399285     2   3332    42      NaN  2018        2     C7   \n",
              "399286     2   3385    38      NaN  2018        1     B1   \n",
              "399287     2   2963     6      NaN  2018       2B     C1   \n",
              "399288     2   2928    33      NaN  2018        4     Z9   \n",
              "\n",
              "                        owner                staddr  ltfront  ltdepth  \\\n",
              "0                     299 LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "1                     293 LLC  MCGUINNESS BOULEVARD     76.0     35.0   \n",
              "2                    287A LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "3          JUSZCZAK, ANTONINA           JAVA STREET     25.0    100.0   \n",
              "4             SAWICKI CZESLAW           JAVA STREET     25.0    100.0   \n",
              "...                       ...                   ...      ...      ...   \n",
              "399284        ALEMAN, CYNTHIA        116 SURF DRIVE      0.0      0.0   \n",
              "399285  3105 DECATUR ASSOCIAT   3105 DECATUR AVENUE    125.0    119.0   \n",
              "399286            HOGAN, RUTH   345 EAST 236 STREET     25.0    100.0   \n",
              "399287  HOUSING WORKS LYMAN P  1412 PROSPECT AVENUE     28.0    162.0   \n",
              "399288  THOMAS MOTT OSBORNE M   549 EAST 171 STREET     75.0    141.0   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "0           5.0    87000   39150   774450  \n",
              "1           5.0   106000   47700  1153080  \n",
              "2           5.0    87000   39150   872640  \n",
              "3           2.0   314000   18840    95580  \n",
              "4           3.0   298000   17880   116520  \n",
              "...         ...      ...     ...      ...  \n",
              "399284      3.0   422839     706    18814  \n",
              "399285      5.0  3346000   79200  1505700  \n",
              "399286      2.0   632000   13020    37920  \n",
              "399287      4.0  1174000    1362    76125  \n",
              "399288      1.0   188000   59850    84600  \n",
              "\n",
              "[386557 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-90832f55-eafc-49d8-bd55-7008e9661454\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399284</th>\n",
              "      <td>2</td>\n",
              "      <td>3432</td>\n",
              "      <td>1941</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1A</td>\n",
              "      <td>R3</td>\n",
              "      <td>ALEMAN, CYNTHIA</td>\n",
              "      <td>116 SURF DRIVE</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>422839</td>\n",
              "      <td>706</td>\n",
              "      <td>18814</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399285</th>\n",
              "      <td>2</td>\n",
              "      <td>3332</td>\n",
              "      <td>42</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>3105 DECATUR ASSOCIAT</td>\n",
              "      <td>3105 DECATUR AVENUE</td>\n",
              "      <td>125.0</td>\n",
              "      <td>119.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>3346000</td>\n",
              "      <td>79200</td>\n",
              "      <td>1505700</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399286</th>\n",
              "      <td>2</td>\n",
              "      <td>3385</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>HOGAN, RUTH</td>\n",
              "      <td>345 EAST 236 STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>632000</td>\n",
              "      <td>13020</td>\n",
              "      <td>37920</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399287</th>\n",
              "      <td>2</td>\n",
              "      <td>2963</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2B</td>\n",
              "      <td>C1</td>\n",
              "      <td>HOUSING WORKS LYMAN P</td>\n",
              "      <td>1412 PROSPECT AVENUE</td>\n",
              "      <td>28.0</td>\n",
              "      <td>162.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>1174000</td>\n",
              "      <td>1362</td>\n",
              "      <td>76125</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399288</th>\n",
              "      <td>2</td>\n",
              "      <td>2928</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>Z9</td>\n",
              "      <td>THOMAS MOTT OSBORNE M</td>\n",
              "      <td>549 EAST 171 STREET</td>\n",
              "      <td>75.0</td>\n",
              "      <td>141.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>188000</td>\n",
              "      <td>59850</td>\n",
              "      <td>84600</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>386557 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-90832f55-eafc-49d8-bd55-7008e9661454')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-90832f55-eafc-49d8-bd55-7008e9661454 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-90832f55-eafc-49d8-bd55-7008e9661454');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-f99cf3cd-2774-46a1-847b-d374cc8945a0\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-f99cf3cd-2774-46a1-847b-d374cc8945a0')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-f99cf3cd-2774-46a1-847b-d374cc8945a0 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df4"
            }
          },
          "metadata": {},
          "execution_count": 72
        }
      ],
      "source": [
        "df4"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "46U2AegRyAx_"
      },
      "outputs": [],
      "source": [
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.svm import SVC\n",
        "from sklearn.metrics import accuracy_score, confusion_matrix\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 70
        },
        "id": "qoJ9TkUOvyGt",
        "outputId": "50326fd0-0a15-4bac-ba68-c03c5cf40b71"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "\"\\n# this to have address in a form comp can understand\\nfeature_transformer = ColumnTransformer(transformers=[\\n    ('onehot', OneHotEncoder(handle_unknown='ignore'), ['staddr'])\\n], remainder='passthrough')\\n\\n\\npipeline = Pipeline([\\n    ('transformer', feature_transformer),\\n    ('scaler', StandardScaler(with_mean=False))  # Set with_mean to False\\n])\\n\\n# Split dataset\\nX = df4[['year', 'staddr']]\\ny = df4['fullval']\\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)\\n\\n# Apply transformations using the pipeline\\nX_train = pipeline.fit_transform(X_train)\\nX_test = pipeline.transform(X_test)\\n\""
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 74
        }
      ],
      "source": [
        "'''\n",
        "# this to have address in a form comp can understand\n",
        "feature_transformer = ColumnTransformer(transformers=[\n",
        "    ('onehot', OneHotEncoder(handle_unknown='ignore'), ['staddr'])\n",
        "], remainder='passthrough')\n",
        "\n",
        "\n",
        "pipeline = Pipeline([\n",
        "    ('transformer', feature_transformer),\n",
        "    ('scaler', StandardScaler(with_mean=False))  # Set with_mean to False\n",
        "])\n",
        "\n",
        "# Split dataset\n",
        "X = df4[['year', 'staddr']]\n",
        "y = df4['fullval']\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)\n",
        "\n",
        "# Apply transformations using the pipeline\n",
        "X_train = pipeline.fit_transform(X_train)\n",
        "X_test = pipeline.transform(X_test)\n",
        "'''"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JAZaJz4e4HmY"
      },
      "outputs": [],
      "source": [
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.svm import SVR\n",
        "from sklearn.metrics import mean_squared_error, r2_score"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "dmrATUHjyx5k"
      },
      "outputs": [],
      "source": [
        "# Define the regressors to use\n",
        "regressors = {\n",
        "    'Random Forest Regressor': RandomForestRegressor(n_estimators=100),\n",
        "    'Linear Regression': LinearRegression(),\n",
        "    'Support Vector Regressor': SVR()\n",
        "}"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "L6761eQ1gsNz",
        "outputId": "a35bd72e-d3dc-4052-b1d0-8e86a8af1946"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block   lot easement  year taxclass bldgcl  \\\n",
              "0          3   2541    30      NaN  2021      NaN     C1   \n",
              "1          3   2541    33      NaN  2021      NaN     C1   \n",
              "2          3   2541    36      NaN  2021      NaN     C1   \n",
              "3          3   2541    38      NaN  2021      NaN     B9   \n",
              "4          3   2541    39      NaN  2021      NaN     B9   \n",
              "...      ...    ...   ...      ...   ...      ...    ...   \n",
              "399284     2   3432  1941      NaN  2018       1A     R3   \n",
              "399285     2   3332    42      NaN  2018        2     C7   \n",
              "399286     2   3385    38      NaN  2018        1     B1   \n",
              "399287     2   2963     6      NaN  2018       2B     C1   \n",
              "399288     2   2928    33      NaN  2018        4     Z9   \n",
              "\n",
              "                        owner                staddr  ltfront  ltdepth  \\\n",
              "0                     299 LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "1                     293 LLC  MCGUINNESS BOULEVARD     76.0     35.0   \n",
              "2                    287A LLC  MCGUINNESS BOULEVARD     62.0     35.0   \n",
              "3          JUSZCZAK, ANTONINA           JAVA STREET     25.0    100.0   \n",
              "4             SAWICKI CZESLAW           JAVA STREET     25.0    100.0   \n",
              "...                       ...                   ...      ...      ...   \n",
              "399284        ALEMAN, CYNTHIA        116 SURF DRIVE      0.0      0.0   \n",
              "399285  3105 DECATUR ASSOCIAT   3105 DECATUR AVENUE    125.0    119.0   \n",
              "399286            HOGAN, RUTH   345 EAST 236 STREET     25.0    100.0   \n",
              "399287  HOUSING WORKS LYMAN P  1412 PROSPECT AVENUE     28.0    162.0   \n",
              "399288  THOMAS MOTT OSBORNE M   549 EAST 171 STREET     75.0    141.0   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "0           5.0    87000   39150   774450  \n",
              "1           5.0   106000   47700  1153080  \n",
              "2           5.0    87000   39150   872640  \n",
              "3           2.0   314000   18840    95580  \n",
              "4           3.0   298000   17880   116520  \n",
              "...         ...      ...     ...      ...  \n",
              "399284      3.0   422839     706    18814  \n",
              "399285      5.0  3346000   79200  1505700  \n",
              "399286      2.0   632000   13020    37920  \n",
              "399287      4.0  1174000    1362    76125  \n",
              "399288      1.0   188000   59850    84600  \n",
              "\n",
              "[386557 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-a88f5b21-6db9-4527-8a2c-7bebf51a5565\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399284</th>\n",
              "      <td>2</td>\n",
              "      <td>3432</td>\n",
              "      <td>1941</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1A</td>\n",
              "      <td>R3</td>\n",
              "      <td>ALEMAN, CYNTHIA</td>\n",
              "      <td>116 SURF DRIVE</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>422839</td>\n",
              "      <td>706</td>\n",
              "      <td>18814</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399285</th>\n",
              "      <td>2</td>\n",
              "      <td>3332</td>\n",
              "      <td>42</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>3105 DECATUR ASSOCIAT</td>\n",
              "      <td>3105 DECATUR AVENUE</td>\n",
              "      <td>125.0</td>\n",
              "      <td>119.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>3346000</td>\n",
              "      <td>79200</td>\n",
              "      <td>1505700</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399286</th>\n",
              "      <td>2</td>\n",
              "      <td>3385</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>HOGAN, RUTH</td>\n",
              "      <td>345 EAST 236 STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>632000</td>\n",
              "      <td>13020</td>\n",
              "      <td>37920</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399287</th>\n",
              "      <td>2</td>\n",
              "      <td>2963</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2B</td>\n",
              "      <td>C1</td>\n",
              "      <td>HOUSING WORKS LYMAN P</td>\n",
              "      <td>1412 PROSPECT AVENUE</td>\n",
              "      <td>28.0</td>\n",
              "      <td>162.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>1174000</td>\n",
              "      <td>1362</td>\n",
              "      <td>76125</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>399288</th>\n",
              "      <td>2</td>\n",
              "      <td>2928</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>Z9</td>\n",
              "      <td>THOMAS MOTT OSBORNE M</td>\n",
              "      <td>549 EAST 171 STREET</td>\n",
              "      <td>75.0</td>\n",
              "      <td>141.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>188000</td>\n",
              "      <td>59850</td>\n",
              "      <td>84600</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>386557 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-a88f5b21-6db9-4527-8a2c-7bebf51a5565')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-a88f5b21-6db9-4527-8a2c-7bebf51a5565 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-a88f5b21-6db9-4527-8a2c-7bebf51a5565');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-7afa3abc-868f-437f-a6dd-0ee4ed3601ac\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-7afa3abc-868f-437f-a6dd-0ee4ed3601ac')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-7afa3abc-868f-437f-a6dd-0ee4ed3601ac button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df4"
            }
          },
          "metadata": {},
          "execution_count": 77
        }
      ],
      "source": [
        "df4"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ceJMjQjp436e"
      },
      "outputs": [],
      "source": [
        "# Because each borough is likely to exhibit different growth charatesitscs I have deceided to split the dataset by borough\n",
        "\n",
        "# Split the dataframe based on the 'boro' column\n",
        "Manhattandf = df4[df4['boro'] == 1]\n",
        "Bronxdf = df4[df4['boro'] == 2]\n",
        "Brooklyndf = df4[df4['boro'] == 3]\n",
        "Queensdf = df4[df4['boro'] == 4]\n",
        "StatenIslanddf = df4[df4['boro'] == 5]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "4nIwI_TJyHh5",
        "outputId": "6663bb51-c167-4a4c-d6af-74809a7d7982"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block  lot easement  year taxclass bldgcl  \\\n",
              "6524       1   1841   13      NaN  2021      NaN     B3   \n",
              "8244       1   1841   14      NaN  2021      NaN     A5   \n",
              "8323       1   1841   15      NaN  2021      NaN     A4   \n",
              "8477       1   1841   16      NaN  2021      NaN     A9   \n",
              "9218       1   1841   17      NaN  2021      NaN     B9   \n",
              "...      ...    ...  ...      ...   ...      ...    ...   \n",
              "398253     1   2225   30      NaN  2018        2     C1   \n",
              "398254     1   2215  356      NaN  2018        1     B1   \n",
              "398264     1   2202    9      NaN  2018        2     D4   \n",
              "398265     1   2164   44      NaN  2018        2     C7   \n",
              "398283     1   2175   63      NaN  2018        4     K1   \n",
              "\n",
              "                            owner                staddr  ltfront  ltdepth  \\\n",
              "6524               GARLAND E WOOD       WEST 105 STREET    17.58    75.00   \n",
              "8244             NOYES, ELIZABETH      MANHATTAN AVENUE    16.67    75.00   \n",
              "8323             GOINGS, MATTIE M      MANHATTAN AVENUE    16.33    86.83   \n",
              "8477    GLENN GULLICKSON, TIMOTHY      MANHATTAN AVENUE    16.33    86.83   \n",
              "9218                RAYMOND RECHT      MANHATTAN AVENUE    17.00    70.00   \n",
              "...                           ...                   ...      ...      ...   \n",
              "398253      M & N MANAGEMENT CORP    168 SHERMAN AVENUE    50.00   150.00   \n",
              "398254        PONDICHI CONSTANTIN  10 VAN CORLEAR PLACE    28.00   133.00   \n",
              "398264      420 WEST 206 STREET O   416 WEST 206 STREET   200.00    99.00   \n",
              "398265      175 REALTY ASSOCIATES         4316 BROADWAY    37.00   103.00   \n",
              "398283          PARTNERS 2004 LLC    180 DYCKMAN STREET    50.00   100.00   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "6524        3.0  1107000   66420   175440  \n",
              "8244        3.0   226000   13560   219780  \n",
              "8323        3.0  1179000   70740   227580  \n",
              "8477        3.0  1782000  106920   256260  \n",
              "9218        3.0  1611000   96660   219300  \n",
              "...         ...      ...     ...      ...  \n",
              "398253      5.0  1584000   59850   712800  \n",
              "398254      2.0   655000   23674    34006  \n",
              "398264      6.0  6011000  193950  2704950  \n",
              "398265      5.0  2122000   59400   954900  \n",
              "398283      1.0  2320000  201600  1044000  \n",
              "\n",
              "[155480 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-10c41c3a-a8e6-42ae-8f06-f21b9fdb02b1\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>6524</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>13</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B3</td>\n",
              "      <td>GARLAND E WOOD</td>\n",
              "      <td>WEST 105 STREET</td>\n",
              "      <td>17.58</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1107000</td>\n",
              "      <td>66420</td>\n",
              "      <td>175440</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8244</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>14</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A5</td>\n",
              "      <td>NOYES, ELIZABETH</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.67</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>226000</td>\n",
              "      <td>13560</td>\n",
              "      <td>219780</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8323</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>15</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A4</td>\n",
              "      <td>GOINGS, MATTIE M</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1179000</td>\n",
              "      <td>70740</td>\n",
              "      <td>227580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8477</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>16</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A9</td>\n",
              "      <td>GLENN GULLICKSON, TIMOTHY</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1782000</td>\n",
              "      <td>106920</td>\n",
              "      <td>256260</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9218</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>17</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>RAYMOND RECHT</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>17.00</td>\n",
              "      <td>70.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1611000</td>\n",
              "      <td>96660</td>\n",
              "      <td>219300</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398253</th>\n",
              "      <td>1</td>\n",
              "      <td>2225</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C1</td>\n",
              "      <td>M &amp; N MANAGEMENT CORP</td>\n",
              "      <td>168 SHERMAN AVENUE</td>\n",
              "      <td>50.00</td>\n",
              "      <td>150.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>1584000</td>\n",
              "      <td>59850</td>\n",
              "      <td>712800</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398254</th>\n",
              "      <td>1</td>\n",
              "      <td>2215</td>\n",
              "      <td>356</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>PONDICHI CONSTANTIN</td>\n",
              "      <td>10 VAN CORLEAR PLACE</td>\n",
              "      <td>28.00</td>\n",
              "      <td>133.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>655000</td>\n",
              "      <td>23674</td>\n",
              "      <td>34006</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398264</th>\n",
              "      <td>1</td>\n",
              "      <td>2202</td>\n",
              "      <td>9</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>D4</td>\n",
              "      <td>420 WEST 206 STREET O</td>\n",
              "      <td>416 WEST 206 STREET</td>\n",
              "      <td>200.00</td>\n",
              "      <td>99.00</td>\n",
              "      <td>6.0</td>\n",
              "      <td>6011000</td>\n",
              "      <td>193950</td>\n",
              "      <td>2704950</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398265</th>\n",
              "      <td>1</td>\n",
              "      <td>2164</td>\n",
              "      <td>44</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>175 REALTY ASSOCIATES</td>\n",
              "      <td>4316 BROADWAY</td>\n",
              "      <td>37.00</td>\n",
              "      <td>103.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>2122000</td>\n",
              "      <td>59400</td>\n",
              "      <td>954900</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398283</th>\n",
              "      <td>1</td>\n",
              "      <td>2175</td>\n",
              "      <td>63</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>K1</td>\n",
              "      <td>PARTNERS 2004 LLC</td>\n",
              "      <td>180 DYCKMAN STREET</td>\n",
              "      <td>50.00</td>\n",
              "      <td>100.00</td>\n",
              "      <td>1.0</td>\n",
              "      <td>2320000</td>\n",
              "      <td>201600</td>\n",
              "      <td>1044000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>155480 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-10c41c3a-a8e6-42ae-8f06-f21b9fdb02b1')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-10c41c3a-a8e6-42ae-8f06-f21b9fdb02b1 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-10c41c3a-a8e6-42ae-8f06-f21b9fdb02b1');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-add6dc70-1589-4019-9cc0-ea1f5e0ce87b\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-add6dc70-1589-4019-9cc0-ea1f5e0ce87b')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-add6dc70-1589-4019-9cc0-ea1f5e0ce87b button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "Manhattandf"
            }
          },
          "metadata": {},
          "execution_count": 79
        }
      ],
      "source": [
        "Manhattandf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 567
        },
        "id": "DcP_VRE47St7",
        "outputId": "ac3c0973-9379-49f4-8316-d055df2a9974"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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9OlTAMD+/fvh6ekJALC0tOSM4URERFRuFbunqlWrVggKCsKHH36I48ePY/369QCAS5cuoXr16mpPkIiIiEgbFLunatGiRdDV1cUff/yBsLAwVKtWDQCwZ88etG/fXu0JEhEREWmDYvdU1ahRAzt37iywft68eWpJiIiIiEgbFbunSkdHp8CtYQDg4cOH0NHRUUtSRERERNqm2EXV66a1ysrKgr6+/lsnRERERKSNinz6L3+WcplMhqVLl6JChQpSW15eHmJjY+Ho6Kj+DImIiIi0QJGLqvwxU0IIhIeHq5zq09fXR61atRAeHq7+DImIiIi0QJGLqqSkJACAu7s7Nm/ezNvREBEREb2k2Ff/HThwoCTyICIiItJqxS6q8vLyEBERgejoaNy7dw9KpVKlPSYmRm3JEREREWmLYhdVo0aNQkREBLy9vdGwYUPIZLKSyIuIiIhIqxS7qFq3bh02bNjAmycTERERveQ/3VC5bt26JZELERERkdYqdlH19ddfY8GCBa+dBJSIiIioPCr26b/Dhw/jwIED2LNnDxo0aAA9PT2V9s2bN6stOSIiIiJtUeyiysLCAt26dSuJXIiIiIi0VrGLquXLl5dEHkRERERardhjqoiIiIiooCL1VDVt2hTR0dGoWLEimjRp8q9zU50+fVptyRERERFpiyIVVZ9++ikMDAwAAF27di3JfIiIiIi0UpGKqqlTpxb6MxERERG9UOyB6vlOnTqFCxcuAAAaNGiAJk2aqC0pIiIiIm1T7KLq3r176NOnDw4ePAgLCwsAQFpaGtzd3bFu3TpUqVJF3TkSERERlXrFvvpv5MiRePLkCc6fP49Hjx7h0aNHSEhIgEKhwFdffVUSORIRERGVesXuqYqMjMT+/ftRv359aZ2TkxMWL14MT09PtSZHREREpC2K3VOlVCoL3JoGAPT09KBUKtWSFBEREZG2KXZR1bZtW4waNQp37tyR1t2+fRuBgYFo166dWpMjIiIi0hbFLqoWLVoEhUKBWrVqoU6dOqhTpw7s7e2hUCjw008/lUSORERERKVescdU2dnZ4fTp04iOjpamVKhfvz48PDzUnhwRERGRtihWUbV+/Xps374d2dnZaNeuHUaOHFlSeRERERFplSIXVWFhYfD394eDgwOMjIywefNmXL16FbNnzy7J/IiIiIi0QpHHVC1atAhTp05F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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            " {'Manhattan': (2010, 2021), 'Bronx': (2010, 2021), 'Brooklyn': (2010, 2022), 'Queens': (2010, 2018), 'Staten Island': (2010, 2018)}\n"
          ]
        }
      ],
      "source": [
        "# create a dictionary with the borough names and the number of rows in each dataframe\n",
        "borough_counts = {\n",
        "    'Manhattan': len(Manhattandf),\n",
        "    'Bronx': len(Bronxdf),\n",
        "    'Brooklyn': len(Brooklyndf),\n",
        "    'Queens': len(Queensdf),\n",
        "    'Staten Island': len(StatenIslanddf)\n",
        "}\n",
        "\n",
        "# plot this information using a bar graph\n",
        "plt.bar(borough_counts.keys(), borough_counts.values())\n",
        "plt.xlabel('Borough')\n",
        "plt.ylabel('Number of Data Points')\n",
        "plt.title('Data Points per Borough')\n",
        "plt.xticks(rotation=45)\n",
        "plt.show()\n",
        "\n",
        "\n",
        "# date ranges in each dataframe\n",
        "date_ranges = {\n",
        "    'Manhattan': (Manhattandf['year'].min(), Manhattandf['year'].max()),\n",
        "    'Bronx': (Bronxdf['year'].min(), Bronxdf['year'].max()),\n",
        "    'Brooklyn': (Brooklyndf['year'].min(), Brooklyndf['year'].max()),\n",
        "    'Queens': (Queensdf['year'].min(), Queensdf['year'].max()),\n",
        "    'Staten Island': (StatenIslanddf['year'].min(), StatenIslanddf['year'].max())\n",
        "}\n",
        "\n",
        "print(\"\\n\", date_ranges)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "BMu6STSB8hzk",
        "outputId": "6846abee-fffc-4b81-8bdf-89e3b65a4833"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block  lot easement  year taxclass bldgcl  \\\n",
              "6524       1   1841   13      NaN  2021      NaN     B3   \n",
              "8244       1   1841   14      NaN  2021      NaN     A5   \n",
              "8323       1   1841   15      NaN  2021      NaN     A4   \n",
              "8477       1   1841   16      NaN  2021      NaN     A9   \n",
              "9218       1   1841   17      NaN  2021      NaN     B9   \n",
              "...      ...    ...  ...      ...   ...      ...    ...   \n",
              "398253     1   2225   30      NaN  2018        2     C1   \n",
              "398254     1   2215  356      NaN  2018        1     B1   \n",
              "398264     1   2202    9      NaN  2018        2     D4   \n",
              "398265     1   2164   44      NaN  2018        2     C7   \n",
              "398283     1   2175   63      NaN  2018        4     K1   \n",
              "\n",
              "                            owner                staddr  ltfront  ltdepth  \\\n",
              "6524               GARLAND E WOOD       WEST 105 STREET    17.58    75.00   \n",
              "8244             NOYES, ELIZABETH      MANHATTAN AVENUE    16.67    75.00   \n",
              "8323             GOINGS, MATTIE M      MANHATTAN AVENUE    16.33    86.83   \n",
              "8477    GLENN GULLICKSON, TIMOTHY      MANHATTAN AVENUE    16.33    86.83   \n",
              "9218                RAYMOND RECHT      MANHATTAN AVENUE    17.00    70.00   \n",
              "...                           ...                   ...      ...      ...   \n",
              "398253      M & N MANAGEMENT CORP    168 SHERMAN AVENUE    50.00   150.00   \n",
              "398254        PONDICHI CONSTANTIN  10 VAN CORLEAR PLACE    28.00   133.00   \n",
              "398264      420 WEST 206 STREET O   416 WEST 206 STREET   200.00    99.00   \n",
              "398265      175 REALTY ASSOCIATES         4316 BROADWAY    37.00   103.00   \n",
              "398283          PARTNERS 2004 LLC    180 DYCKMAN STREET    50.00   100.00   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "6524        3.0  1107000   66420   175440  \n",
              "8244        3.0   226000   13560   219780  \n",
              "8323        3.0  1179000   70740   227580  \n",
              "8477        3.0  1782000  106920   256260  \n",
              "9218        3.0  1611000   96660   219300  \n",
              "...         ...      ...     ...      ...  \n",
              "398253      5.0  1584000   59850   712800  \n",
              "398254      2.0   655000   23674    34006  \n",
              "398264      6.0  6011000  193950  2704950  \n",
              "398265      5.0  2122000   59400   954900  \n",
              "398283      1.0  2320000  201600  1044000  \n",
              "\n",
              "[155480 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-aa287185-c6fc-4fd7-a9fa-d66a764e50ff\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>6524</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>13</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B3</td>\n",
              "      <td>GARLAND E WOOD</td>\n",
              "      <td>WEST 105 STREET</td>\n",
              "      <td>17.58</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1107000</td>\n",
              "      <td>66420</td>\n",
              "      <td>175440</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8244</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>14</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A5</td>\n",
              "      <td>NOYES, ELIZABETH</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.67</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>226000</td>\n",
              "      <td>13560</td>\n",
              "      <td>219780</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8323</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>15</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A4</td>\n",
              "      <td>GOINGS, MATTIE M</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1179000</td>\n",
              "      <td>70740</td>\n",
              "      <td>227580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8477</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>16</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>A9</td>\n",
              "      <td>GLENN GULLICKSON, TIMOTHY</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1782000</td>\n",
              "      <td>106920</td>\n",
              "      <td>256260</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9218</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>17</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>RAYMOND RECHT</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>17.00</td>\n",
              "      <td>70.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1611000</td>\n",
              "      <td>96660</td>\n",
              "      <td>219300</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398253</th>\n",
              "      <td>1</td>\n",
              "      <td>2225</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C1</td>\n",
              "      <td>M &amp; N MANAGEMENT CORP</td>\n",
              "      <td>168 SHERMAN AVENUE</td>\n",
              "      <td>50.00</td>\n",
              "      <td>150.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>1584000</td>\n",
              "      <td>59850</td>\n",
              "      <td>712800</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398254</th>\n",
              "      <td>1</td>\n",
              "      <td>2215</td>\n",
              "      <td>356</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>PONDICHI CONSTANTIN</td>\n",
              "      <td>10 VAN CORLEAR PLACE</td>\n",
              "      <td>28.00</td>\n",
              "      <td>133.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>655000</td>\n",
              "      <td>23674</td>\n",
              "      <td>34006</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398264</th>\n",
              "      <td>1</td>\n",
              "      <td>2202</td>\n",
              "      <td>9</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>D4</td>\n",
              "      <td>420 WEST 206 STREET O</td>\n",
              "      <td>416 WEST 206 STREET</td>\n",
              "      <td>200.00</td>\n",
              "      <td>99.00</td>\n",
              "      <td>6.0</td>\n",
              "      <td>6011000</td>\n",
              "      <td>193950</td>\n",
              "      <td>2704950</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398265</th>\n",
              "      <td>1</td>\n",
              "      <td>2164</td>\n",
              "      <td>44</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>175 REALTY ASSOCIATES</td>\n",
              "      <td>4316 BROADWAY</td>\n",
              "      <td>37.00</td>\n",
              "      <td>103.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>2122000</td>\n",
              "      <td>59400</td>\n",
              "      <td>954900</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398283</th>\n",
              "      <td>1</td>\n",
              "      <td>2175</td>\n",
              "      <td>63</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>K1</td>\n",
              "      <td>PARTNERS 2004 LLC</td>\n",
              "      <td>180 DYCKMAN STREET</td>\n",
              "      <td>50.00</td>\n",
              "      <td>100.00</td>\n",
              "      <td>1.0</td>\n",
              "      <td>2320000</td>\n",
              "      <td>201600</td>\n",
              "      <td>1044000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>155480 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-aa287185-c6fc-4fd7-a9fa-d66a764e50ff')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-aa287185-c6fc-4fd7-a9fa-d66a764e50ff button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-aa287185-c6fc-4fd7-a9fa-d66a764e50ff');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-fe1d4580-1584-4b70-a594-3efc11a24e88\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-fe1d4580-1584-4b70-a594-3efc11a24e88')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-fe1d4580-1584-4b70-a594-3efc11a24e88 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "Manhattandf"
            }
          },
          "metadata": {},
          "execution_count": 81
        }
      ],
      "source": [
        "Manhattandf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "KtFSAiTH8pSF",
        "outputId": "19ca7a54-c015-415a-d17d-e2e36a794e27"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block  lot easement  year taxclass bldgcl                 owner  \\\n",
              "0          3   2541   30      NaN  2021      NaN     C1               299 LLC   \n",
              "1          3   2541   33      NaN  2021      NaN     C1               293 LLC   \n",
              "2          3   2541   36      NaN  2021      NaN     C1              287A LLC   \n",
              "3          3   2541   38      NaN  2021      NaN     B9    JUSZCZAK, ANTONINA   \n",
              "4          3   2541   39      NaN  2021      NaN     B9       SAWICKI CZESLAW   \n",
              "...      ...    ...  ...      ...   ...      ...    ...                   ...   \n",
              "229673     3   8932  682      NaN  2011       1B     V0       WILLIAM GLEASON   \n",
              "229674     3   8946  990      NaN  2011       1B     V0        FRANCES NELSON   \n",
              "229675     3   8955  204      NaN  2011       1B     V0             E SARUBBI   \n",
              "311669     3    865    1      NaN  2018        4     M4  THE MISSNRY SOC HOLY   \n",
              "313472     3    865    1      NaN  2018        4     M4  THE MISSNRY SOC HOLY   \n",
              "\n",
              "                      staddr  ltfront  ltdepth  stories  fullval  avland  \\\n",
              "0       MCGUINNESS BOULEVARD     62.0     35.0      5.0    87000   39150   \n",
              "1       MCGUINNESS BOULEVARD     76.0     35.0      5.0   106000   47700   \n",
              "2       MCGUINNESS BOULEVARD     62.0     35.0      5.0    87000   39150   \n",
              "3                JAVA STREET     25.0    100.0      2.0   314000   18840   \n",
              "4                JAVA STREET     25.0    100.0      3.0   298000   17880   \n",
              "...                      ...      ...      ...      ...      ...     ...   \n",
              "229673          DICTUM COURT     34.0     52.0      NaN   143000    2073   \n",
              "229674          DICTUM COURT     34.0     52.0      NaN   143000    2593   \n",
              "229675         CELESTE COURT     34.0     52.0      NaN   143000    1860   \n",
              "311669         5901 6 AVENUE    200.0    100.0      4.0  3069000  253350   \n",
              "313472         5901 6 AVENUE    200.0    100.0      4.0  3069000  253350   \n",
              "\n",
              "          avtot  \n",
              "0        774450  \n",
              "1       1153080  \n",
              "2        872640  \n",
              "3         95580  \n",
              "4        116520  \n",
              "...         ...  \n",
              "229673     2073  \n",
              "229674     2593  \n",
              "229675     1860  \n",
              "311669  1381050  \n",
              "313472  1381050  \n",
              "\n",
              "[197517 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-e7ed05eb-226e-4b1b-818d-504c2bc74796\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>299 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>774450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>33</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>293 LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>76.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>106000</td>\n",
              "      <td>47700</td>\n",
              "      <td>1153080</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>36</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>C1</td>\n",
              "      <td>287A LLC</td>\n",
              "      <td>MCGUINNESS BOULEVARD</td>\n",
              "      <td>62.0</td>\n",
              "      <td>35.0</td>\n",
              "      <td>5.0</td>\n",
              "      <td>87000</td>\n",
              "      <td>39150</td>\n",
              "      <td>872640</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>38</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>JUSZCZAK, ANTONINA</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>2.0</td>\n",
              "      <td>314000</td>\n",
              "      <td>18840</td>\n",
              "      <td>95580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>2541</td>\n",
              "      <td>39</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>NaN</td>\n",
              "      <td>B9</td>\n",
              "      <td>SAWICKI CZESLAW</td>\n",
              "      <td>JAVA STREET</td>\n",
              "      <td>25.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>3.0</td>\n",
              "      <td>298000</td>\n",
              "      <td>17880</td>\n",
              "      <td>116520</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>229673</th>\n",
              "      <td>3</td>\n",
              "      <td>8932</td>\n",
              "      <td>682</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2011</td>\n",
              "      <td>1B</td>\n",
              "      <td>V0</td>\n",
              "      <td>WILLIAM GLEASON</td>\n",
              "      <td>DICTUM COURT</td>\n",
              "      <td>34.0</td>\n",
              "      <td>52.0</td>\n",
              "      <td>NaN</td>\n",
              "      <td>143000</td>\n",
              "      <td>2073</td>\n",
              "      <td>2073</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>229674</th>\n",
              "      <td>3</td>\n",
              "      <td>8946</td>\n",
              "      <td>990</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2011</td>\n",
              "      <td>1B</td>\n",
              "      <td>V0</td>\n",
              "      <td>FRANCES NELSON</td>\n",
              "      <td>DICTUM COURT</td>\n",
              "      <td>34.0</td>\n",
              "      <td>52.0</td>\n",
              "      <td>NaN</td>\n",
              "      <td>143000</td>\n",
              "      <td>2593</td>\n",
              "      <td>2593</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>229675</th>\n",
              "      <td>3</td>\n",
              "      <td>8955</td>\n",
              "      <td>204</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2011</td>\n",
              "      <td>1B</td>\n",
              "      <td>V0</td>\n",
              "      <td>E SARUBBI</td>\n",
              "      <td>CELESTE COURT</td>\n",
              "      <td>34.0</td>\n",
              "      <td>52.0</td>\n",
              "      <td>NaN</td>\n",
              "      <td>143000</td>\n",
              "      <td>1860</td>\n",
              "      <td>1860</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>311669</th>\n",
              "      <td>3</td>\n",
              "      <td>865</td>\n",
              "      <td>1</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>M4</td>\n",
              "      <td>THE MISSNRY SOC HOLY</td>\n",
              "      <td>5901 6 AVENUE</td>\n",
              "      <td>200.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>3069000</td>\n",
              "      <td>253350</td>\n",
              "      <td>1381050</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>313472</th>\n",
              "      <td>3</td>\n",
              "      <td>865</td>\n",
              "      <td>1</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>M4</td>\n",
              "      <td>THE MISSNRY SOC HOLY</td>\n",
              "      <td>5901 6 AVENUE</td>\n",
              "      <td>200.0</td>\n",
              "      <td>100.0</td>\n",
              "      <td>4.0</td>\n",
              "      <td>3069000</td>\n",
              "      <td>253350</td>\n",
              "      <td>1381050</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>197517 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-e7ed05eb-226e-4b1b-818d-504c2bc74796')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-e7ed05eb-226e-4b1b-818d-504c2bc74796 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-e7ed05eb-226e-4b1b-818d-504c2bc74796');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-fc77663e-f215-4214-b41b-64e66d5373a9\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-fc77663e-f215-4214-b41b-64e66d5373a9')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-fc77663e-f215-4214-b41b-64e66d5373a9 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "Brooklyndf"
            }
          },
          "metadata": {},
          "execution_count": 82
        }
      ],
      "source": [
        "Brooklyndf"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# temp\n",
        "\n",
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.impute import SimpleImputer\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import mean_squared_error, r2_score\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from xgboost import XGBRegressor\n",
        "\n",
        "\n",
        "# Feature Selection and Engineering\n",
        "df_combined = Manhattandf\n",
        "\n",
        "# Removed staddr as we already have boro and block numbers so being further specific will serve little purpose\n",
        "# features_to_use = ['boro', 'block', 'lot', 'taxclass', 'bldgcl', 'staddr', 'ltfront', 'ltdepth', 'stories']\n",
        "features_to_use = ['block',  'taxclass', 'bldgcl',  'ltfront', 'ltdepth', 'stories', 'year']\n",
        "target = 'fullval'\n",
        "\n",
        "# Data Cleaning\n",
        "df_combined.dropna(subset=[target], inplace=True)\n",
        "\n",
        "# Convert categorical features to string\n",
        "# categorical_features = ['boro', 'taxclass', 'bldgcl', 'staddr']  # Assuming 'staddr' is categorical\n",
        "categorical_features = ['taxclass', 'bldgcl']\n",
        "for col in categorical_features:\n",
        "    df_combined[col] = df_combined[col].astype(str)\n",
        "\n",
        "# Categorize features\n",
        "numerical_features = [f for f in features_to_use if f not in categorical_features]\n",
        "\n",
        "# Preprocessor for handling both categorical and numerical features\n",
        "preprocessor = ColumnTransformer(\n",
        "    transformers=[\n",
        "        ('num', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='mean')),  # or 'median'\n",
        "            ('scaler', StandardScaler())\n",
        "        ]), numerical_features),\n",
        "        ('cat', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),\n",
        "            ('encoder', OneHotEncoder(handle_unknown='ignore'))\n",
        "        ]), categorical_features)\n",
        "    ]\n",
        ")\n",
        "'''\n",
        "# Linear Regression Model\n",
        "# Pipeline with model\n",
        "# Yielded .44 with 120,000 Values\n",
        "# Yielded .22 with 240,000 Values\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', LinearRegression())\n",
        "])\n",
        "'''\n",
        "'''\n",
        "# This model takes too long to load\n",
        "# Random Forest Regressor Model\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', RandomForestRegressor(n_estimators=100, random_state=42))\n",
        "])\n",
        "'''\n",
        "\n",
        "\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.3, random_state=42))\n",
        "])\n",
        "\n",
        "\n",
        "# Model preparation\n",
        "X = df_combined[features_to_use]\n",
        "y = df_combined[target]\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
        "\n",
        "# Train the model\n",
        "pipeline.fit(X_train, y_train)\n",
        "\n",
        "# Predictions and Evaluation\n",
        "y_pred = pipeline.predict(X_test)\n",
        "mse = mean_squared_error(y_test, y_pred)\n",
        "r2 = r2_score(y_test, y_pred)\n",
        "\n",
        "print(f'Mean Squared Error: {mse}')\n",
        "print(f'R-squared: {r2}')\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Z5_uEDHdFEEU",
        "outputId": "efd258d5-d869-493f-c3b9-1f99c6926a3b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-83-a9a4dcadb57e>:23: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame\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",
            "  df_combined.dropna(subset=[target], inplace=True)\n",
            "<ipython-input-83-a9a4dcadb57e>:29: 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",
            "  df_combined[col] = df_combined[col].astype(str)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mean Squared Error: 108184632975999.38\n",
            "R-squared: 0.7479928419732339\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 300
        },
        "id": "UUFlHrzE95r8",
        "outputId": "2016278a-6f7f-48f2-b668-f4374af94b4b"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "              Metric     Manhattan       Brooklyn\n",
              "0    Mean Full Value  3.624771e+06  267494.733552\n",
              "1  Median Full Value  4.224895e+05  221000.000000\n",
              "2       Mean AV Land  3.066454e+05   40435.405768\n",
              "3     Median AV Land  2.521200e+04   15022.000000\n",
              "4      Mean AV Total  1.449849e+06  180985.322139\n",
              "5    Median AV Total  1.654295e+05   62100.000000\n",
              "6       Mean Stories  1.837571e+01       2.732021\n",
              "7     Median Stories  1.300000e+01       2.000000"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-7424fe93-c60d-493a-bac7-8440e7951b30\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Metric</th>\n",
              "      <th>Manhattan</th>\n",
              "      <th>Brooklyn</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Mean Full Value</td>\n",
              "      <td>3.624771e+06</td>\n",
              "      <td>267494.733552</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Median Full Value</td>\n",
              "      <td>4.224895e+05</td>\n",
              "      <td>221000.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Mean AV Land</td>\n",
              "      <td>3.066454e+05</td>\n",
              "      <td>40435.405768</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Median AV Land</td>\n",
              "      <td>2.521200e+04</td>\n",
              "      <td>15022.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Mean AV Total</td>\n",
              "      <td>1.449849e+06</td>\n",
              "      <td>180985.322139</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>Median AV Total</td>\n",
              "      <td>1.654295e+05</td>\n",
              "      <td>62100.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>Mean Stories</td>\n",
              "      <td>1.837571e+01</td>\n",
              "      <td>2.732021</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>Median Stories</td>\n",
              "      <td>1.300000e+01</td>\n",
              "      <td>2.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-7424fe93-c60d-493a-bac7-8440e7951b30')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-7424fe93-c60d-493a-bac7-8440e7951b30 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-7424fe93-c60d-493a-bac7-8440e7951b30');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-5e503459-8ade-453c-b60a-715a6b798df7\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-5e503459-8ade-453c-b60a-715a6b798df7')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-5e503459-8ade-453c-b60a-715a6b798df7 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "metrics_df",
              "summary": "{\n  \"name\": \"metrics_df\",\n  \"rows\": 8,\n  \"fields\": [\n    {\n      \"column\": \"Metric\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 8,\n        \"samples\": [\n          \"Median Full Value\",\n          \"Median AV Total\",\n          \"Mean Full Value\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Manhattan\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1256407.2290299018,\n        \"min\": 13.0,\n        \"max\": 3624771.173540005,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          422489.5,\n          165429.5,\n          3624771.173540005\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Brooklyn\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 107860.87934620428,\n        \"min\": 2.0,\n        \"max\": 267494.7335520487,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          221000.0,\n          62100.0,\n          267494.7335520487\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 84
        }
      ],
      "source": [
        "# Trying to figure out what qualities is leading to Brooklyn having a far lower accuracy score than manhattan\n",
        "# So far my current explanation is that Brooklyn buildings are mostly residential and the accuracy to predict the prices in very differing areas makes it difficult for the model to predict accurately the value of\n",
        "\n",
        "metrics = {\n",
        "    'Metric': ['Mean Full Value', 'Median Full Value', 'Mean AV Land', 'Median AV Land', 'Mean AV Total', 'Median AV Total', 'Mean Stories', 'Median Stories'],\n",
        "    'Manhattan': [\n",
        "        Manhattandf['fullval'].mean(),\n",
        "        Manhattandf['fullval'].median(),\n",
        "        Manhattandf['avland'].mean(),\n",
        "        Manhattandf['avland'].median(),\n",
        "        Manhattandf['avtot'].mean(),\n",
        "        Manhattandf['avtot'].median(),\n",
        "        Manhattandf['stories'].mean(),\n",
        "        Manhattandf['stories'].median(),\n",
        "    ],\n",
        "    'Brooklyn': [\n",
        "        Brooklyndf['fullval'].mean(),\n",
        "        Brooklyndf['fullval'].median(),\n",
        "        Brooklyndf['avland'].mean(),\n",
        "        Brooklyndf['avland'].median(),\n",
        "        Brooklyndf['avtot'].mean(),\n",
        "        Brooklyndf['avtot'].median(),\n",
        "        Brooklyndf['stories'].mean(),\n",
        "        Brooklyndf['stories'].median(),\n",
        "    ]\n",
        "}\n",
        "\n",
        "# Converting the metrics to a DataFrame for display\n",
        "metrics_df = pd.DataFrame(metrics)\n",
        "metrics_df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "dx2r5Qev-49Q",
        "outputId": "7677a597-002e-4392-8351-fc33991ca5b1"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(197517, 91637)"
            ]
          },
          "metadata": {},
          "execution_count": 85
        }
      ],
      "source": [
        "# Attempting to remove any extreme outliers from the dataset\n",
        "\n",
        "def remove_outliers(df, column):\n",
        "    mean_val = df[column].mean()\n",
        "    # Setting the deviation limit to 60% of the mean\n",
        "    deviation_limit = 0.6 * mean_val\n",
        "    lower_bound = mean_val - deviation_limit\n",
        "    upper_bound = mean_val + deviation_limit\n",
        "    # Filtering the DataFrame to only include values within the specified range\n",
        "    return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]\n",
        "\n",
        "# Applying the outlier removal function to the relevant columns in the Manhattan and Brooklyn dataframes\n",
        "columns_to_check = ['fullval', 'avland', 'avtot', 'stories']\n",
        "\n",
        "Brooklyndf_cleaned = Brooklyndf.copy()\n",
        "\n",
        "for column in columns_to_check:\n",
        "    Brooklyndf_cleaned = remove_outliers(Brooklyndf_cleaned, column)\n",
        "\n",
        "# Display the size of the dataframes before and after outlier removal\n",
        "original_sizes =  len(Brooklyndf)\n",
        "cleaned_sizes = len(Brooklyndf_cleaned)\n",
        "\n",
        "original_sizes, cleaned_sizes"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 300
        },
        "id": "WgSs90Ixvs3s",
        "outputId": "42bc346b-9bb1-4f67-b005-4104cbd03cfd"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "              Metric       Brooklyn\n",
              "0    Mean Full Value  265926.204044\n",
              "1  Median Full Value  253000.000000\n",
              "2       Mean AV Land   15954.862697\n",
              "3     Median AV Land   15180.000000\n",
              "4      Mean AV Total   56856.716588\n",
              "5    Median AV Total   56460.000000\n",
              "6       Mean Stories       2.116288\n",
              "7     Median Stories       2.000000"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-3a13bc7c-9237-4b0d-9677-e0e69131bdfe\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Metric</th>\n",
              "      <th>Brooklyn</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Mean Full Value</td>\n",
              "      <td>265926.204044</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Median Full Value</td>\n",
              "      <td>253000.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Mean AV Land</td>\n",
              "      <td>15954.862697</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Median AV Land</td>\n",
              "      <td>15180.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Mean AV Total</td>\n",
              "      <td>56856.716588</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>Median AV Total</td>\n",
              "      <td>56460.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>Mean Stories</td>\n",
              "      <td>2.116288</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>Median Stories</td>\n",
              "      <td>2.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-3a13bc7c-9237-4b0d-9677-e0e69131bdfe')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-3a13bc7c-9237-4b0d-9677-e0e69131bdfe button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-3a13bc7c-9237-4b0d-9677-e0e69131bdfe');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-1de70121-b510-4d6c-bcd5-d49992eaceb4\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-1de70121-b510-4d6c-bcd5-d49992eaceb4')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-1de70121-b510-4d6c-bcd5-d49992eaceb4 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "metrics_df",
              "summary": "{\n  \"name\": \"metrics_df\",\n  \"rows\": 8,\n  \"fields\": [\n    {\n      \"column\": \"Metric\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 8,\n        \"samples\": [\n          \"Median Full Value\",\n          \"Median AV Total\",\n          \"Mean Full Value\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Brooklyn\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 111240.86529315186,\n        \"min\": 2.0,\n        \"max\": 265926.20404421794,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          253000.0,\n          56460.0,\n          265926.20404421794\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 86
        }
      ],
      "source": [
        "metrics = {\n",
        "    'Metric': ['Mean Full Value', 'Median Full Value', 'Mean AV Land', 'Median AV Land', 'Mean AV Total', 'Median AV Total', 'Mean Stories', 'Median Stories'],\n",
        "    'Brooklyn': [\n",
        "        Brooklyndf_cleaned['fullval'].mean(),\n",
        "        Brooklyndf_cleaned['fullval'].median(),\n",
        "        Brooklyndf_cleaned['avland'].mean(),\n",
        "        Brooklyndf_cleaned['avland'].median(),\n",
        "        Brooklyndf_cleaned['avtot'].mean(),\n",
        "        Brooklyndf_cleaned['avtot'].median(),\n",
        "        Brooklyndf_cleaned['stories'].mean(),\n",
        "        Brooklyndf_cleaned['stories'].median(),\n",
        "    ]\n",
        "}\n",
        "\n",
        "# Converting the metrics to a DataFrame for display\n",
        "metrics_df = pd.DataFrame(metrics)\n",
        "metrics_df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 616
        },
        "id": "2lHJn-B505IE",
        "outputId": "db14c7e0-a59d-4fb6-f637-fdba05cb653a"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "481576.25\n",
            "369509\n",
            "603541\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACGKklEQVR4nOzdd3hT5f/G8Xe6KVA2lL33kOFgKKDsIfIFWTKVPQQEHKBMQUDZwwIOEBBRUFCRVRkigrKRoewlMkU2lI7z++P5tVhaumh7kvZ+XVcuTpOT5E7zkOZzzjMclmVZiIiIiIiIyEO52R1ARERERETE2alwEhERERERiYUKJxERERERkViocBIREREREYmFCicREREREZFYqHASERERERGJhQonERERERGRWKhwEhERERERiYUKJxERERERkViocBJJZp06daJAgQJ2x4jViBEjcDgcyfJcNWvWpGbNmhE/b9y4EYfDwdKlS5Pl+V3hPbl58yZdunTB398fh8NB//79kz2Dw+FgxIgRET/PmzcPh8PByZMnY71vgQIF6NSpU8TP4e/xxo0bEz1nYrC7TTz4+0pMJ0+exOFwMGHChCR5/MS0YMECSpQogaenJxkzZrQlgyv9vkQkaalwEomH8C+K4RcfHx+KFStGnz59uHDhgt3xHiq63Lly5aJevXpMmzaNGzduJMrz/P3334wYMYI9e/YkyuMlJmfOFhfvvfce8+bNo2fPnixYsID27ds/dN8CBQpEeb+LFi3K66+/zpUrV5IxtYQLLxT/e8mcOTOVK1fm888/tztevHz55Ze0a9eOokWL4nA4Ih30iM6uXbto0qQJmTNnxtfXlzJlyjBt2rRYn+fPP/+kU6dOFC5cmI8++og5c+Yk0iuI3sqVKyMdGEhOixcvxuFwMHv27Ghv79mzJ56enuzduzeZk0X2zTff0KpVKwoVKoSvry/Fixdn4MCBXL16Ndr9v/vuOypWrIiPjw/58uVj+PDhhISERNrn3LlzvPXWWzz77LOkT5/+oQdUwgvYh126du2aBK9YJDIPuwOIuKJRo0ZRsGBB7t69y+bNmwkICGDlypXs378fX1/fGO/70UcfERYWlkxJIwvPHRwczPnz59m4cSP9+/dn0qRJfPfdd5QrVy5i33feeYe33norXo//999/M3LkSAoUKED58uXjfL+1a9fG63kS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VwegQoUKvPLKK3z66aeEhIRQo0YNNm7cyJIlSxg8eHDE39b4yJYtG4MHD2bkyJHUr1+fJk2acOjQIT788EOeeOKJaBdIjavwLl99+/alXr16uLu707p163g9xsyZM3n66acpW7YsXbt2pVChQly4cIGtW7fy119/sXfv3gTna9++PV999RU9evRgw4YNVKtWjdDQUP7880+++uqriLWY6tati5eXF88//zzdu3fn5s2bfPTRR2TPnj3agi4+6tevz/Hjx3njjTfYvHkzmzdvjrgtR44c1KlTJ+LnDz74gCZNmlC3bl1at27N/v37mTFjBl26dIkYmxcuvP2Er/m2YMGCiMd+5513Iu0bGhrKl19+SeXKlRPts1gkzpJ5Fj+nBVjLli2L+HnFihUWYKVNmzbSxcPDw2rZsqVlWZb1xx9/RDu97H8vb775ZsRjenp6WlWqVIn0vK+++upDp+UU5xOXab0ty0xlnDZt2ofe9uA0zyEhIdYHH3xglShRwvLy8rKyZctmNWjQwNq5c2ek/b7++mvr6aefjmiPJUqUsHr37m0dOnQoTrnDL15eXpa/v79Vp04da+rUqZGmvQ734HTk69ats1544QUrV65clpeXl5UrVy6rTZs2kaagtSwzRW+pUqUsDw+PSNN/16hRwypdunS0+R42HfkXX3xhDR482MqePbuVJk0aq1GjRtapU6ei3H/ixIlW7ty5LW9vb6tatWrWjh07op1m+2HZontPbty4Yb322mtWrly5LE9PT6to0aLWBx98EGmabcsynx29e/eOkulh06Q/6MKFC9bLL79sZc2a1fLy8rLKli0b7ZTpjzIduZubm5U9e3arTZs2kaZND7dw4UKrUKFClpeXl1W+fHlrzZo1CZqO3LIsKzQ01Bo5cqSVM2dOK02aNFbNmjWt/fv3R/l9PGw68ujaSHRZjh8/bjVq1MhKkyaNlS1bNmvgwIHW119/bQHWr7/+GrHPK6+8YhUuXNjy8fGxMmfObD377LPWjz/+GOvv8GHTkX/wwQdR9n3w9xKd6KYj9/LyskqUKGGNGTPGunfvXqT9o2s/x44ds1588UUrY8aMlo+Pj/Xkk09aK1asiPJct2/ftt5++22rYMGClqenp+Xv72+9+OKL1rFjx2J8LR9++KEFWIMGDYrxtYR/NkR3efD3cO/ePWvEiBFW/vz5LU9PT6tIkSLW5MmTY3z8B58nuiUQZsyYYZUoUcLy9PS0cuTIYfXs2dP6999/I+0T02dOdEJCQqxXX33VypYtm+VwOCI+/+L73h87dszq0KGD5e/vb3l6elq5c+e2GjdubC1dujTOWR72t+bevXvW+PHjrdKlS1ve3t5WpkyZrEqVKlkjR460rl27FrHfd999Z5UrV87y8fGxChQoYI0fPz5iqvr//n+Nz+dK+Ot92CW6aemXLVtmlS9f3vL29rby5MljvfPOO1HaemyP+6DVq1dbgDVt2rQ45xZJLA7LcrLRyzZxOBwsW7aMpk2bAvDll1/Stm1bDhw4EGVAaLp06fD39+fevXuxTkGbJUuWiFPZ+fPnp06dOpFmtAoICGD06NFxmqJUREQebsqUKbz22mv89ddfUZYGEBEReVTqqvcQFSpUIDQ0lIsXL0as1fAgLy+vGLtWPKhatWpRBvcePnw40QeAi4ikdHfu3Ik0G9jdu3eZPXs2RYsWVdEkIiJJIlUXTjdv3ow0C9OJEyfYs2cPmTNnplixYrRt25YOHTowceJEKlSowKVLl1i3bh3lypVL0ADU1157japVq/Lee+/RsmVLtm3bxpw5c5gzZ05iviwRkRSvWbNm5MuXj/Lly3Pt2jUWLlzIn3/+GbG2i4iISGJL1V31Nm7cyLPPPhvl+o4dOzJv3jyCg4MZPXo08+fP5+zZs2TNmpXKlSszcuRIypYtm6DnXLFiBYMHD+bIkSMRizM+uNq9iIjEbMqUKXz88cecPHmS0NBQSpUqxRtvvEGrVq3sjiYiIilUqi6cRERERERE4kLrOImIiIiIiMRChZOIiIiIiEgsUt3kEGFhYfz999+kT58+YpFEERERERFJfSzL4saNG+TKlStiMfGHSXWF099//03evHntjiEiIiIiIk7izJkz5MmTJ8Z9Ul3hlD59esD8cvz8/GxOI8kpODiYtWvXUrduXTw9Pe2OIymI2pYkBbUrSSpqW5IUXLVdXb9+nbx580bUCDFJdYVTePc8Pz8/FU6pTHBwML6+vvj5+bnUf2hxfmpbkhTUriSpqG1JUnD1dhWXITyaHEJERERERCQWKpxERERERERiocJJREREREQkFiqcREREREREYqHCSUREREREJBYqnERERERERGKhwklERERERCQWKpxERERERERiocJJREREREQkFiqc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yZMnrQYNGlhp0qSxsmbNag0cONAKDg6OtM+GDRus8uXLW15eXlahQoWsuXPnRnnu6dOnW/ny5bO8vLysJ5980vr1118j3R6XLOKc/tuuTp8+bVWvXt3KnDmz5e3tbRUpUsR6/fXXI62JYllqVxJVq1atrJw5c1peXl5W7ty5rVatWkVaD0WfV5JQMbUtfWbJo/j++++tMmXKWN7e3laJEiWsOXPmRLo9LCzMGjp0qJUjRw7L29vbqlWrlnXo0KFI+/zzzz9WmzZtrHTp0ll+fn7Wyy+/bN24cSPSPnv37rWefvppy9vb28qdO7c1bty4KFm++uorq1ixYpaXl5dVunRp64cffoh3luTmsCzLsu98l4iIiIiIiPPTGCcREREREZFYqHASERERERGJhQonERERERGRWKhwEhERERERiYUKJxERERERkViocBIREREREYmFCicREREREZFYqHASERERERGJhQonERFJVQoUKMCUKVPsjiEiIi5GhZOIiLisTp064XA4cDgceHl5UaRIEUaNGkVISMhD77N9+3a6deuWjClFRCQl8LA7gIiIyKOoX78+c+fOJSgoiJUrV9K7d288PT0ZPHhwpP3u3buHl5cX2bJlsympiIi4Mp1xEhERl+bt7Y2/vz/58+enZ8+e1K5dm++++45OnTrRtGlTxowZQ65cuShevDgQtave1atX6d69Ozly5MDHx4cyZcqwYsWKiNs3b97MM888Q5o0acibNy99+/bl1q1byf0yRUTEZjrjJCIiKUqaNGn4559/AFi3bh1+fn4EBgZGu29YWBgNGjTgxo0bLFy4kMKFC3Pw4EHc3d0BOHbsGPXr12f06NF8+umnXLp0iT59+tCnTx/mzp2bbK9JRETsp8JJRERSBMuyWLduHWvWrOHVV1/l0qVLpE2blo8//hgvL69o7/Pjjz+ybds2/vjjD4oVKwZAoUKFIm4fO3Ysbdu2pX///gAULVqUadOmUaNGDQICAvDx8Uny1yUiIs5BXfVERMSlrVixgnTp0uHj40ODBg1o1aoVI0aMAKBs2bIPLZoA9uzZQ548eSKKpgft3buXefPmkS5duohLvXr1CAsL48SJE0nxckRExEnpjJOIiLi0Z599loCAALy8vMiVKxceHvf/tKVNmzbG+6ZJkybG22/evEn37t3p27dvlNvy5cuXsMAiIuKSVDiJiIhLS5s2LUWKFEnQfcuVK8dff/3F4cOHoz3rVLFiRQ4ePJjgxxcRkZRDXfVERCTVqlGjBtWrV6d58+YEBgZy4sQJVq1axerVqwF488032bJlC3369GHPnj0cOXKEb7/9lj59+ticXEREkpsKJxERSdW+/vprnnjiCdq0aUOpUqV44403CA0NBcwZqZ9++onDhw/zzDPPUKFCBYYNG0auXLlsTi0iIsnNYVmWZXcIERERERERZ6YzTiIiIiIiIrFQ4SQiIiIiIhILFU4iIiIiIiKxUOEk/9d+HQgAAAAACPK3HmGBsggAABjiBAAAMMQJAABgiBMAAMAQJwAAgCFOAAAAQ5wAAACGOAEAAIwAnITDW/PAyqoAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "# Used this to create a bell curve and discovered that there are outliers in price that are messing with certain predictions resulting in negative values\n",
        "# Negative values originate from the fact that there is data supporting a very low unrealistic price for a given year in a block that messes the prediction for other buildings in the same block\n",
        "# This was used for testing, this has no effect on the Manhattandf and the df referred here isnt used later\n",
        "# Information gathered here was used for other code\n",
        "\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from scipy.stats import norm\n",
        "\n",
        "df = Manhattandf\n",
        "\n",
        "block_input = 16\n",
        "year_input = 2017\n",
        "\n",
        "# Filter the DataFrame for the specified block and year\n",
        "filtered_df = df[(df['block'] == block_input) & (df['year'] == year_input)]\n",
        "\n",
        "\n",
        "prices = filtered_df['fullval'].dropna()  # Drop NaN values\n",
        "\n",
        "mean = prices.mean()\n",
        "std = prices.std()\n",
        "\n",
        "# Generate a range of price values for the bell curve\n",
        "price_range = np.linspace(prices.min(), prices.max(), 100)\n",
        "\n",
        "bell_curve = norm.pdf(price_range, mean, std)\n",
        "\n",
        "print(mean)\n",
        "print(prices.min())\n",
        "print(prices.max())\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(price_range, bell_curve, color='blue')\n",
        "plt.title(f'Price Distribution of Buildings in Block {block_input} for the Year {year_input}')\n",
        "plt.xlabel('Price')\n",
        "plt.ylabel('Density')\n",
        "plt.grid(True)\n",
        "plt.show()\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#temp\n",
        "\n",
        "\n",
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.impute import SimpleImputer\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import mean_squared_error, r2_score\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from xgboost import XGBRegressor\n",
        "\n",
        "\n",
        "# Feature Selection and Engineering\n",
        "df_combined = Manhattandf\n",
        "\n",
        "# Removed staddr as we already have boro and block numbers so being further specific will serve little purpose\n",
        "# features_to_use = ['boro', 'block', 'lot', 'taxclass', 'bldgcl', 'staddr', 'ltfront', 'ltdepth', 'stories']\n",
        "features_to_use = ['block',  'taxclass', 'bldgcl',  'ltfront', 'ltdepth', 'stories', 'year']\n",
        "target = 'fullval'\n",
        "\n",
        "# Data Cleaning\n",
        "df_combined.dropna(subset=[target], inplace=True)\n",
        "\n",
        "# Convert categorical features to string\n",
        "# categorical_features = ['boro', 'taxclass', 'bldgcl', 'staddr']  # Assuming 'staddr' is categorical\n",
        "categorical_features = ['taxclass', 'bldgcl']\n",
        "for col in categorical_features:\n",
        "    df_combined[col] = df_combined[col].astype(str)\n",
        "\n",
        "# Categorize features\n",
        "numerical_features = [f for f in features_to_use if f not in categorical_features]\n",
        "\n",
        "# Preprocessor for handling both categorical and numerical features\n",
        "preprocessor = ColumnTransformer(\n",
        "    transformers=[\n",
        "        ('num', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='mean')),  # or 'median'\n",
        "            ('scaler', StandardScaler())\n",
        "        ]), numerical_features),\n",
        "        ('cat', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),\n",
        "            ('encoder', OneHotEncoder(handle_unknown='ignore'))\n",
        "        ]), categorical_features)\n",
        "    ]\n",
        ")\n",
        "'''\n",
        "# Linear Regression Model\n",
        "# Pipeline with model\n",
        "# Yielded .44 with 120,000 Values\n",
        "# Yielded .22 with 240,000 Values\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', LinearRegression())\n",
        "])\n",
        "'''\n",
        "'''\n",
        "# This model takes too long to load\n",
        "# Random Forest Regressor Model\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', RandomForestRegressor(n_estimators=100, random_state=42))\n",
        "])\n",
        "'''\n",
        "\n",
        "\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.3, random_state=42))\n",
        "])\n",
        "\n",
        "\n",
        "# Model preparation\n",
        "X = df_combined[features_to_use]\n",
        "y = df_combined[target]\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
        "\n",
        "# Train the model\n",
        "pipeline.fit(X_train, y_train)\n",
        "\n",
        "# Predictions and Evaluation\n",
        "y_pred = pipeline.predict(X_test)\n",
        "mse = mean_squared_error(y_test, y_pred)\n",
        "r2 = r2_score(y_test, y_pred)\n",
        "\n",
        "print(f'Mean Squared Error: {mse}')\n",
        "print(f'R-squared: {r2}')\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lrmPONdYE2_5",
        "outputId": "c6e4a024-bdef-4e9c-abf7-d422c2a5597c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-88-6ee1c7bb2b06>:24: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame\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",
            "  df_combined.dropna(subset=[target], inplace=True)\n",
            "<ipython-input-88-6ee1c7bb2b06>:30: 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",
            "  df_combined[col] = df_combined[col].astype(str)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mean Squared Error: 108184632975999.38\n",
            "R-squared: 0.7479928419732339\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "m3shi1MYg2id",
        "outputId": "270c22cd-d8d0-41cd-8696-1a3e63aa5ed1"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        boro  block  lot easement  year taxclass bldgcl  \\\n",
              "6524       1   1841   13      NaN  2021      nan     B3   \n",
              "8244       1   1841   14      NaN  2021      nan     A5   \n",
              "8323       1   1841   15      NaN  2021      nan     A4   \n",
              "8477       1   1841   16      NaN  2021      nan     A9   \n",
              "9218       1   1841   17      NaN  2021      nan     B9   \n",
              "...      ...    ...  ...      ...   ...      ...    ...   \n",
              "398253     1   2225   30      NaN  2018        2     C1   \n",
              "398254     1   2215  356      NaN  2018        1     B1   \n",
              "398264     1   2202    9      NaN  2018        2     D4   \n",
              "398265     1   2164   44      NaN  2018        2     C7   \n",
              "398283     1   2175   63      NaN  2018        4     K1   \n",
              "\n",
              "                            owner                staddr  ltfront  ltdepth  \\\n",
              "6524               GARLAND E WOOD       WEST 105 STREET    17.58    75.00   \n",
              "8244             NOYES, ELIZABETH      MANHATTAN AVENUE    16.67    75.00   \n",
              "8323             GOINGS, MATTIE M      MANHATTAN AVENUE    16.33    86.83   \n",
              "8477    GLENN GULLICKSON, TIMOTHY      MANHATTAN AVENUE    16.33    86.83   \n",
              "9218                RAYMOND RECHT      MANHATTAN AVENUE    17.00    70.00   \n",
              "...                           ...                   ...      ...      ...   \n",
              "398253      M & N MANAGEMENT CORP    168 SHERMAN AVENUE    50.00   150.00   \n",
              "398254        PONDICHI CONSTANTIN  10 VAN CORLEAR PLACE    28.00   133.00   \n",
              "398264      420 WEST 206 STREET O   416 WEST 206 STREET   200.00    99.00   \n",
              "398265      175 REALTY ASSOCIATES         4316 BROADWAY    37.00   103.00   \n",
              "398283          PARTNERS 2004 LLC    180 DYCKMAN STREET    50.00   100.00   \n",
              "\n",
              "        stories  fullval  avland    avtot  \n",
              "6524        3.0  1107000   66420   175440  \n",
              "8244        3.0   226000   13560   219780  \n",
              "8323        3.0  1179000   70740   227580  \n",
              "8477        3.0  1782000  106920   256260  \n",
              "9218        3.0  1611000   96660   219300  \n",
              "...         ...      ...     ...      ...  \n",
              "398253      5.0  1584000   59850   712800  \n",
              "398254      2.0   655000   23674    34006  \n",
              "398264      6.0  6011000  193950  2704950  \n",
              "398265      5.0  2122000   59400   954900  \n",
              "398283      1.0  2320000  201600  1044000  \n",
              "\n",
              "[155480 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-6606f5aa-0fd6-4fac-90bf-e5a0c8b37d17\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>6524</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>13</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>B3</td>\n",
              "      <td>GARLAND E WOOD</td>\n",
              "      <td>WEST 105 STREET</td>\n",
              "      <td>17.58</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1107000</td>\n",
              "      <td>66420</td>\n",
              "      <td>175440</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8244</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>14</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>A5</td>\n",
              "      <td>NOYES, ELIZABETH</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.67</td>\n",
              "      <td>75.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>226000</td>\n",
              "      <td>13560</td>\n",
              "      <td>219780</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8323</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>15</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>A4</td>\n",
              "      <td>GOINGS, MATTIE M</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1179000</td>\n",
              "      <td>70740</td>\n",
              "      <td>227580</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8477</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>16</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>A9</td>\n",
              "      <td>GLENN GULLICKSON, TIMOTHY</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>16.33</td>\n",
              "      <td>86.83</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1782000</td>\n",
              "      <td>106920</td>\n",
              "      <td>256260</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9218</th>\n",
              "      <td>1</td>\n",
              "      <td>1841</td>\n",
              "      <td>17</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>B9</td>\n",
              "      <td>RAYMOND RECHT</td>\n",
              "      <td>MANHATTAN AVENUE</td>\n",
              "      <td>17.00</td>\n",
              "      <td>70.00</td>\n",
              "      <td>3.0</td>\n",
              "      <td>1611000</td>\n",
              "      <td>96660</td>\n",
              "      <td>219300</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398253</th>\n",
              "      <td>1</td>\n",
              "      <td>2225</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C1</td>\n",
              "      <td>M &amp; N MANAGEMENT CORP</td>\n",
              "      <td>168 SHERMAN AVENUE</td>\n",
              "      <td>50.00</td>\n",
              "      <td>150.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>1584000</td>\n",
              "      <td>59850</td>\n",
              "      <td>712800</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398254</th>\n",
              "      <td>1</td>\n",
              "      <td>2215</td>\n",
              "      <td>356</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>1</td>\n",
              "      <td>B1</td>\n",
              "      <td>PONDICHI CONSTANTIN</td>\n",
              "      <td>10 VAN CORLEAR PLACE</td>\n",
              "      <td>28.00</td>\n",
              "      <td>133.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>655000</td>\n",
              "      <td>23674</td>\n",
              "      <td>34006</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398264</th>\n",
              "      <td>1</td>\n",
              "      <td>2202</td>\n",
              "      <td>9</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>D4</td>\n",
              "      <td>420 WEST 206 STREET O</td>\n",
              "      <td>416 WEST 206 STREET</td>\n",
              "      <td>200.00</td>\n",
              "      <td>99.00</td>\n",
              "      <td>6.0</td>\n",
              "      <td>6011000</td>\n",
              "      <td>193950</td>\n",
              "      <td>2704950</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398265</th>\n",
              "      <td>1</td>\n",
              "      <td>2164</td>\n",
              "      <td>44</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>2</td>\n",
              "      <td>C7</td>\n",
              "      <td>175 REALTY ASSOCIATES</td>\n",
              "      <td>4316 BROADWAY</td>\n",
              "      <td>37.00</td>\n",
              "      <td>103.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>2122000</td>\n",
              "      <td>59400</td>\n",
              "      <td>954900</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>398283</th>\n",
              "      <td>1</td>\n",
              "      <td>2175</td>\n",
              "      <td>63</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2018</td>\n",
              "      <td>4</td>\n",
              "      <td>K1</td>\n",
              "      <td>PARTNERS 2004 LLC</td>\n",
              "      <td>180 DYCKMAN STREET</td>\n",
              "      <td>50.00</td>\n",
              "      <td>100.00</td>\n",
              "      <td>1.0</td>\n",
              "      <td>2320000</td>\n",
              "      <td>201600</td>\n",
              "      <td>1044000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>155480 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6606f5aa-0fd6-4fac-90bf-e5a0c8b37d17')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-6606f5aa-0fd6-4fac-90bf-e5a0c8b37d17 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-6606f5aa-0fd6-4fac-90bf-e5a0c8b37d17');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-6339e1e5-5d42-45ec-b628-0bd0c7397c17\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-6339e1e5-5d42-45ec-b628-0bd0c7397c17')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-6339e1e5-5d42-45ec-b628-0bd0c7397c17 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "Manhattandf"
            }
          },
          "metadata": {},
          "execution_count": 89
        }
      ],
      "source": [
        "Manhattandf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Ax3zLBLXgZrx"
      },
      "outputs": [],
      "source": [
        "# The remove_outliers_by_year_block was throwing an error saying year is both a index and a column\n",
        "# So here i am basically using .reset_index but it wasn't working so i am using this alt method\n",
        "\n",
        "Manhattandf = pd.DataFrame(Manhattandf.to_dict(orient='list'))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "kkNTw8RMV6CI"
      },
      "outputs": [],
      "source": [
        "def remove_outliers_by_year_block(dataframe):\n",
        "    # Group the DataFrame by 'year' and 'block'\n",
        "    grouped = dataframe.groupby(['year', 'block'])\n",
        "\n",
        "    # Function to remove outliers from each group\n",
        "    def remove_outliers(group):\n",
        "        q1 = group['fullval'].quantile(0.25)\n",
        "        q3 = group['fullval'].quantile(0.75)\n",
        "        iqr = q3 - q1\n",
        "        lower_bound = q1 - 1.5 * iqr\n",
        "        upper_bound = q3 + 1.5 * iqr\n",
        "        return group[(group['fullval'] >= lower_bound) & (group['fullval'] <= upper_bound)]\n",
        "\n",
        "    # Apply the function to each group and reset the index\n",
        "    return grouped.apply(remove_outliers)\n",
        "\n",
        "# Apply the outlier removal function to the entire Manhattan df\n",
        "Manhattandf = remove_outliers_by_year_block(Manhattandf)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Dus8mbuMUu-o",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 455
        },
        "outputId": "93ce14b8-dfa9-4d21-c125-e3d1d13c2ad0"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                 boro  block   lot easement  year taxclass bldgcl  \\\n",
              "year block                                                          \n",
              "2010 64    1162     1     64   106      NaN  2010        4     V1   \n",
              "     73    1163     1     73    14      NaN  2010        4     Y7   \n",
              "     120   1164     1    120     9      NaN  2010        3     U1   \n",
              "     142   1165     1    142    35      NaN  2010        4     W1   \n",
              "           1166     1    142    30      NaN  2010        4     Q1   \n",
              "...               ...    ...   ...      ...   ...      ...    ...   \n",
              "2021 1912  361      1   1912  1105      NaN  2021      nan     R1   \n",
              "     1914  362      1   1914    40      NaN  2021      nan     V1   \n",
              "           363      1   1914    41      NaN  2021      nan     C0   \n",
              "           364      1   1914    55      NaN  2021      nan     C5   \n",
              "           365      1   1914    56      NaN  2021      nan     C5   \n",
              "\n",
              "                                 owner            staddr  ltfront  ltdepth  \\\n",
              "year block                                                                   \n",
              "2010 64    1162  NEW YORK CITY TRANSIT     LIBERTY PLACE     3.00    19.00   \n",
              "     73    1163  DEPARTMENT OF BUSINES      SOUTH STREET   166.00   140.00   \n",
              "     120   1164  DEPT OF TRANSPORTATIO  FRANKFORT STREET   216.00   114.00   \n",
              "     142   1165                    NaN  GREENWICH STREET     0.00     0.00   \n",
              "           1166  DORMITORY AUTHORITYNY  GREENWICH STREET     0.00     0.00   \n",
              "...                                ...               ...      ...      ...   \n",
              "2021 1912  361      BASDEVANT , JEROME      LENOX AVENUE     0.00     0.00   \n",
              "     1914  362                    DCAS   WEST 130 STREET    16.67    99.92   \n",
              "           363   RASHID, FAZEELA ABDUL   WEST 130 STREET    16.67    99.92   \n",
              "           364   STEPHENSON, DEBORAH A   WEST 130 STREET    18.75    99.92   \n",
              "           365    160 W 130 REALTY LLC   WEST 130 STREET    18.75    99.92   \n",
              "\n",
              "                 stories   fullval    avland     avtot  \n",
              "year block                                              \n",
              "2010 64    1162      NaN     21800      9810      9810  \n",
              "     73    1163      2.0   3920000   1210500   1764000  \n",
              "     120   1164      NaN   1400000    630000    630000  \n",
              "     142   1165      NaN   9488893   1800002   4270002  \n",
              "           1166      NaN  25000000  11250000  11250000  \n",
              "...                  ...       ...       ...       ...  \n",
              "2021 1912  361       5.0      2962      1333     85751  \n",
              "     1914  362       0.0    672000    302400    302400  \n",
              "           363       3.0    646000     38760    118440  \n",
              "           364       3.0     35000     15750    195750  \n",
              "           365       3.0    213000     95850    241380  \n",
              "\n",
              "[139607 rows x 15 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-2be7f6c9-2dab-471a-853d-a2eb81cacd13\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th>boro</th>\n",
              "      <th>block</th>\n",
              "      <th>lot</th>\n",
              "      <th>easement</th>\n",
              "      <th>year</th>\n",
              "      <th>taxclass</th>\n",
              "      <th>bldgcl</th>\n",
              "      <th>owner</th>\n",
              "      <th>staddr</th>\n",
              "      <th>ltfront</th>\n",
              "      <th>ltdepth</th>\n",
              "      <th>stories</th>\n",
              "      <th>fullval</th>\n",
              "      <th>avland</th>\n",
              "      <th>avtot</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>year</th>\n",
              "      <th>block</th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th rowspan=\"5\" valign=\"top\">2010</th>\n",
              "      <th>64</th>\n",
              "      <th>1162</th>\n",
              "      <td>1</td>\n",
              "      <td>64</td>\n",
              "      <td>106</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2010</td>\n",
              "      <td>4</td>\n",
              "      <td>V1</td>\n",
              "      <td>NEW YORK CITY TRANSIT</td>\n",
              "      <td>LIBERTY PLACE</td>\n",
              "      <td>3.00</td>\n",
              "      <td>19.00</td>\n",
              "      <td>NaN</td>\n",
              "      <td>21800</td>\n",
              "      <td>9810</td>\n",
              "      <td>9810</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>73</th>\n",
              "      <th>1163</th>\n",
              "      <td>1</td>\n",
              "      <td>73</td>\n",
              "      <td>14</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2010</td>\n",
              "      <td>4</td>\n",
              "      <td>Y7</td>\n",
              "      <td>DEPARTMENT OF BUSINES</td>\n",
              "      <td>SOUTH STREET</td>\n",
              "      <td>166.00</td>\n",
              "      <td>140.00</td>\n",
              "      <td>2.0</td>\n",
              "      <td>3920000</td>\n",
              "      <td>1210500</td>\n",
              "      <td>1764000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>120</th>\n",
              "      <th>1164</th>\n",
              "      <td>1</td>\n",
              "      <td>120</td>\n",
              "      <td>9</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2010</td>\n",
              "      <td>3</td>\n",
              "      <td>U1</td>\n",
              "      <td>DEPT OF TRANSPORTATIO</td>\n",
              "      <td>FRANKFORT STREET</td>\n",
              "      <td>216.00</td>\n",
              "      <td>114.00</td>\n",
              "      <td>NaN</td>\n",
              "      <td>1400000</td>\n",
              "      <td>630000</td>\n",
              "      <td>630000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th rowspan=\"2\" valign=\"top\">142</th>\n",
              "      <th>1165</th>\n",
              "      <td>1</td>\n",
              "      <td>142</td>\n",
              "      <td>35</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2010</td>\n",
              "      <td>4</td>\n",
              "      <td>W1</td>\n",
              "      <td>NaN</td>\n",
              "      <td>GREENWICH STREET</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>NaN</td>\n",
              "      <td>9488893</td>\n",
              "      <td>1800002</td>\n",
              "      <td>4270002</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1166</th>\n",
              "      <td>1</td>\n",
              "      <td>142</td>\n",
              "      <td>30</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2010</td>\n",
              "      <td>4</td>\n",
              "      <td>Q1</td>\n",
              "      <td>DORMITORY AUTHORITYNY</td>\n",
              "      <td>GREENWICH STREET</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>NaN</td>\n",
              "      <td>25000000</td>\n",
              "      <td>11250000</td>\n",
              "      <td>11250000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <th>...</th>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th rowspan=\"5\" valign=\"top\">2021</th>\n",
              "      <th>1912</th>\n",
              "      <th>361</th>\n",
              "      <td>1</td>\n",
              "      <td>1912</td>\n",
              "      <td>1105</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>R1</td>\n",
              "      <td>BASDEVANT , JEROME</td>\n",
              "      <td>LENOX AVENUE</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>5.0</td>\n",
              "      <td>2962</td>\n",
              "      <td>1333</td>\n",
              "      <td>85751</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th rowspan=\"4\" valign=\"top\">1914</th>\n",
              "      <th>362</th>\n",
              "      <td>1</td>\n",
              "      <td>1914</td>\n",
              "      <td>40</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>V1</td>\n",
              "      <td>DCAS</td>\n",
              "      <td>WEST 130 STREET</td>\n",
              "      <td>16.67</td>\n",
              "      <td>99.92</td>\n",
              "      <td>0.0</td>\n",
              "      <td>672000</td>\n",
              "      <td>302400</td>\n",
              "      <td>302400</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>363</th>\n",
              "      <td>1</td>\n",
              "      <td>1914</td>\n",
              "      <td>41</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>C0</td>\n",
              "      <td>RASHID, FAZEELA ABDUL</td>\n",
              "      <td>WEST 130 STREET</td>\n",
              "      <td>16.67</td>\n",
              "      <td>99.92</td>\n",
              "      <td>3.0</td>\n",
              "      <td>646000</td>\n",
              "      <td>38760</td>\n",
              "      <td>118440</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>364</th>\n",
              "      <td>1</td>\n",
              "      <td>1914</td>\n",
              "      <td>55</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>C5</td>\n",
              "      <td>STEPHENSON, DEBORAH A</td>\n",
              "      <td>WEST 130 STREET</td>\n",
              "      <td>18.75</td>\n",
              "      <td>99.92</td>\n",
              "      <td>3.0</td>\n",
              "      <td>35000</td>\n",
              "      <td>15750</td>\n",
              "      <td>195750</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>365</th>\n",
              "      <td>1</td>\n",
              "      <td>1914</td>\n",
              "      <td>56</td>\n",
              "      <td>NaN</td>\n",
              "      <td>2021</td>\n",
              "      <td>nan</td>\n",
              "      <td>C5</td>\n",
              "      <td>160 W 130 REALTY LLC</td>\n",
              "      <td>WEST 130 STREET</td>\n",
              "      <td>18.75</td>\n",
              "      <td>99.92</td>\n",
              "      <td>3.0</td>\n",
              "      <td>213000</td>\n",
              "      <td>95850</td>\n",
              "      <td>241380</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>139607 rows × 15 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2be7f6c9-2dab-471a-853d-a2eb81cacd13')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-2be7f6c9-2dab-471a-853d-a2eb81cacd13 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-2be7f6c9-2dab-471a-853d-a2eb81cacd13');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9a0b4fb9-339b-4b70-bbd8-42469e0c3608\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9a0b4fb9-339b-4b70-bbd8-42469e0c3608')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9a0b4fb9-339b-4b70-bbd8-42469e0c3608 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "Manhattandf"
            }
          },
          "metadata": {},
          "execution_count": 92
        }
      ],
      "source": [
        "Manhattandf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 599
        },
        "id": "HJZMrga93T6N",
        "outputId": "6fa46dde-ffa3-4801-8a78-53a241c1b7f6"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "481576.25\n",
            "369509\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACGKklEQVR4nOzdd3hT5f/G8Xe6KVA2lL33kOFgKKDsIfIFWTKVPQQEHKBMQUDZwwIOEBBRUFCRVRkigrKRoewlMkU2lI7z++P5tVhaumh7kvZ+XVcuTpOT5E7zkOZzzjMclmVZiIiIiIiIyEO52R1ARERERETE2alwEhERERERiYUKJxERERERkViocBIREREREYmFCicREREREZFYqHASERERERGJhQonERERERGRWKhwEhERERERiYUKJxERERERkViocBJJZp06daJAgQJ2x4jViBEjcDgcyfJcNWvWpGbNmhE/b9y4EYfDwdKlS5Pl+V3hPbl58yZdunTB398fh8NB//79kz2Dw+FgxIgRET/PmzcPh8PByZMnY71vgQIF6NSpU8TP4e/xxo0bEz1nYrC7TTz4+0pMJ0+exOFwMGHChCR5/MS0YMECSpQogaenJxkzZrQlgyv9vkQkaalwEomH8C+K4RcfHx+KFStGnz59uHDhgt3xHiq63Lly5aJevXpMmzaNGzduJMrz/P3334wYMYI9e/YkyuMlJmfOFhfvvfce8+bNo2fPnixYsID27ds/dN8CBQpEeb+LFi3K66+/zpUrV5IxtYQLLxT/e8mcOTOVK1fm888/tztevHz55Ze0a9eOokWL4nA4Ih30iM6uXbto0qQJmTNnxtfXlzJlyjBt2rRYn+fPP/+kU6dOFC5cmI8++og5c+Yk0iuI3sqVKyMdGEhOixcvxuFwMHv27Ghv79mzJ56enuzduzeZk0X2zTff0KpVKwoVKoSvry/Fixdn4MCBXL16Ndr9v/vuOypWrIiPjw/58uVj+PDhhISERNrn3LlzvPXWWzz77LOkT5/+oQdUwgvYh126du2aBK9YJDIPuwOIuKJRo0ZRsGBB7t69y+bNmwkICGDlypXs378fX1/fGO/70UcfERYWlkxJIwvPHRwczPnz59m4cSP9+/dn0qRJfPfdd5QrVy5i33feeYe33norXo//999/M3LkSAoUKED58uXjfL+1a9fG63kS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VwegQoUKvPLKK3z66aeEhIRQo0YNNm7cyJIlSxg8eHDE39b4yJYtG4MHD2bkyJHUr1+fJk2acOjQIT788EOeeOKJaBdIjavwLl99+/alXr16uLu707p163g9xsyZM3n66acpW7YsXbt2pVChQly4cIGtW7fy119/sXfv3gTna9++PV999RU9evRgw4YNVKtWjdDQUP7880+++uqriLWY6tati5eXF88//zzdu3fn5s2bfPTRR2TPnj3agi4+6tevz/Hjx3njjTfYvHkzmzdvjrgtR44c1KlTJ+LnDz74gCZNmlC3bl1at27N/v37mTFjBl26dIkYmxcuvP2Er/m2YMGCiMd+5513Iu0bGhrKl19+SeXKlRPts1gkzpJ5Fj+nBVjLli2L+HnFihUWYKVNmzbSxcPDw2rZsqVlWZb1xx9/RDu97H8vb775ZsRjenp6WlWqVIn0vK+++upDp+UU5xOXab0ty0xlnDZt2ofe9uA0zyEhIdYHH3xglShRwvLy8rKyZctmNWjQwNq5c2ek/b7++mvr6aefjmiPJUqUsHr37m0dOnQoTrnDL15eXpa/v79Vp04da+rUqZGmvQ734HTk69ats1544QUrV65clpeXl5UrVy6rTZs2kaagtSwzRW+pUqUsDw+PSNN/16hRwypdunS0+R42HfkXX3xhDR482MqePbuVJk0aq1GjRtapU6ei3H/ixIlW7ty5LW9vb6tatWrWjh07op1m+2HZontPbty4Yb322mtWrly5LE9PT6to0aLWBx98EGmabcsynx29e/eOkulh06Q/6MKFC9bLL79sZc2a1fLy8rLKli0b7ZTpjzIduZubm5U9e3arTZs2kaZND7dw4UKrUKFClpeXl1W+fHlrzZo1CZqO3LIsKzQ01Bo5cqSVM2dOK02aNFbNmjWt/fv3R/l9PGw68ujaSHRZjh8/bjVq1MhKkyaNlS1bNmvgwIHW119/bQHWr7/+GrHPK6+8YhUuXNjy8fGxMmfObD377LPWjz/+GOvv8GHTkX/wwQdR9n3w9xKd6KYj9/LyskqUKGGNGTPGunfvXqT9o2s/x44ds1588UUrY8aMlo+Pj/Xkk09aK1asiPJct2/ftt5++22rYMGClqenp+Xv72+9+OKL1rFjx2J8LR9++KEFWIMGDYrxtYR/NkR3efD3cO/ePWvEiBFW/vz5LU9PT6tIkSLW5MmTY3z8B58nuiUQZsyYYZUoUcLy9PS0cuTIYfXs2dP6999/I+0T02dOdEJCQqxXX33VypYtm+VwOCI+/+L73h87dszq0KGD5e/vb3l6elq5c+e2GjdubC1dujTOWR72t+bevXvW+PHjrdKlS1ve3t5WpkyZrEqVKlkjR460rl27FrHfd999Z5UrV87y8fGxChQoYI0fPz5iqvr//n+Nz+dK+Ot92CW6aemXLVtmlS9f3vL29rby5MljvfPOO1HaemyP+6DVq1dbgDVt2rQ45xZJLA7LcrLRyzZxOBwsW7aMpk2bAvDll1/Stm1bDhw4EGVAaLp06fD39+fevXuxTkGbJUuWiFPZ+fPnp06dOpFmtAoICGD06NFxmqJUREQebsqUKbz22mv89ddfUZYGEBEReVTqqvcQFSpUIDQ0lIsXL0as1fAgLy+vGLtWPKhatWpRBvcePnw40QeAi4ikdHfu3Ik0G9jdu3eZPXs2RYsWVdEkIiJJIlUXTjdv3ow0C9OJEyfYs2cPmTNnplixYrRt25YOHTowceJEKlSowKVLl1i3bh3lypVL0ADU1157japVq/Lee+/RsmVLtm3bxpw5c5gzZ05iviwRkRSvWbNm5MuXj/Lly3Pt2jUWLlzIn3/+GbG2i4iISGJL1V31Nm7cyLPPPhvl+o4dOzJv3jyCg4MZPXo08+fP5+zZs2TNmpXKlSszcuRIypYtm6DnXLFiBYMHD+bIkSMRizM+uNq9iIjEbMqUKXz88cecPHmS0NBQSpUqxRtvvEGrVq3sjiYiIilUqi6cRERERERE4kLrOImIiIiIiMRChZOIiIiIiEgsUt3kEGFhYfz999+kT58+YpFEERERERFJfSzL4saNG+TKlStiMfGHSXWF099//03evHntjiEiIiIiIk7izJkz5MmTJ8Z9Ul3hlD59esD8cvz8/GxOI8kpODiYtWvXUrduXTw9Pe2OIymI2pYkBbUrSSpqW5IUXLVdXb9+nbx580bUCDFJdYVTePc8Pz8/FU6pTHBwML6+vvj5+bnUf2hxfmpbkhTUriSpqG1JUnD1dhWXITyaHEJERERERCQWKpxERERERERiocJJREREREQkFiqcREREREREYqHCSUREREREJBYqnERERERERGKhwklERERERCQWKpxERERERERiocJJREREREQkFiqc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yZMnrQYNGlhp0qSxsmbNag0cONAKDg6OtM+GDRus8uXLW15eXlahQoWsuXPnRnnu6dOnW/ny5bO8vLysJ5980vr1118j3R6XLOKc/tuuTp8+bVWvXt3KnDmz5e3tbRUpUsR6/fXXI62JYllqVxJVq1atrJw5c1peXl5W7ty5rVatWkVaD0WfV5JQMbUtfWbJo/j++++tMmXKWN7e3laJEiWsOXPmRLo9LCzMGjp0qJUjRw7L29vbqlWrlnXo0KFI+/zzzz9WmzZtrHTp0ll+fn7Wyy+/bN24cSPSPnv37rWefvppy9vb28qdO7c1bty4KFm++uorq1ixYpaXl5dVunRp64cffoh3luTmsCzLsu98l4iIiIiIiPPTGCcREREREZFYqHASERERERGJhQonERERERGRWKhwEhERERERiYUKJxERERERkViocBIREREREYmFCicREREREZFYqHASERERERGJhQonERFJVQoUKMCUKVPsjiEiIi5GhZOIiLisTp064XA4cDgceHl5UaRIEUaNGkVISMhD77N9+3a6deuWjClFRCQl8LA7gIiIyKOoX78+c+fOJSgoiJUrV9K7d288PT0ZPHhwpP3u3buHl5cX2bJlsympiIi4Mp1xEhERl+bt7Y2/vz/58+enZ8+e1K5dm++++45OnTrRtGlTxowZQ65cuShevDgQtave1atX6d69Ozly5MDHx4cyZcqwYsWKiNs3b97MM888Q5o0acibNy99+/bl1q1byf0yRUTEZjrjJCIiKUqaNGn4559/AFi3bh1+fn4EBgZGu29YWBgNGjTgxo0bLFy4kMKFC3Pw4EHc3d0BOHbsGPXr12f06NF8+umnXLp0iT59+tCnTx/mzp2bbK9JRETsp8JJRERSBMuyWLduHWvWrOHVV1/l0qVLpE2blo8//hgvL69o7/Pjjz+ybds2/vjjD4oVKwZAoUKFIm4fO3Ysbdu2pX///gAULVqUadOmUaNGDQICAvDx8Uny1yUiIs5BXfVERMSlrVixgnTp0uHj40ODBg1o1aoVI0aMAKBs2bIPLZoA9uzZQ548eSKKpgft3buXefPmkS5duohLvXr1CAsL48SJE0nxckRExEnpjJOIiLi0Z599loCAALy8vMiVKxceHvf/tKVNmzbG+6ZJkybG22/evEn37t3p27dvlNvy5cuXsMAiIuKSVDiJiIhLS5s2LUWKFEnQfcuVK8dff/3F4cOHoz3rVLFiRQ4ePJjgxxcRkZRDXfVERCTVqlGjBtWrV6d58+YEBgZy4sQJVq1axerVqwF488032bJlC3369GHPnj0cOXKEb7/9lj59+ticXEREkpsKJxERSdW+/vprnnjiCdq0aUOpUqV44403CA0NBcwZqZ9++onDhw/zzDPPUKFCBYYNG0auXLlsTi0iIsnNYVmWZXcIERERERERZ6YzTiIiIiIiIrFQ4SQiIiIiIhILFU4iIiIiIiKxUOEk/9d+HQgAAAAACPK3HmGBsggAABjiBAAAMMQJAABgiBMAAMAQJwAAgCFOAAAAQ5wAAACGOAEAAIwAnITDW/PAyqoAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "# Used this to create a bell curve and discovered that there are outliers in price that are messing with certain predictions resulting in negative values\n",
        "# Negative values originate from the fact that there is data supporting a very low unrealistic price for a given year in a block that messes the prediction for other buildings in the same block\n",
        "# This was used for testing, this has no effect on the Manhattandf and the df referred here isnt used later\n",
        "# Information gathered here was used for other code\n",
        "\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from scipy.stats import norm\n",
        "\n",
        "df = Manhattandf\n",
        "\n",
        "block_input = 16\n",
        "year_input = 2017\n",
        "\n",
        "# Filter the DataFrame for the specified block and year\n",
        "filtered_df = df[(df['block'] == block_input) & (df['year'] == year_input)]\n",
        "\n",
        "\n",
        "prices = filtered_df['fullval'].dropna()  # Drop NaN values\n",
        "\n",
        "mean = prices.mean()\n",
        "std = prices.std()\n",
        "# min = prices.min()\n",
        "\n",
        "# Generate a range of price values for the bell curve\n",
        "price_range = np.linspace(prices.min(), prices.max(), 100)\n",
        "\n",
        "bell_curve = norm.pdf(price_range, mean, std)\n",
        "\n",
        "print(mean)\n",
        "print(prices.min())\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(price_range, bell_curve, color='blue')\n",
        "plt.title(f'Price Distribution of Buildings in Block {block_input} for the Year {year_input}')\n",
        "plt.xlabel('Price')\n",
        "plt.ylabel('Density')\n",
        "plt.grid(True)\n",
        "plt.show()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "qeRHRR-jfu-M",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "b06a43cf-d526-4a29-c383-d62007c5b6f4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mean Squared Error: 69416622146159.26\n",
            "R-squared: 0.7917212784790276\n"
          ]
        }
      ],
      "source": [
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.impute import SimpleImputer\n",
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import mean_squared_error, r2_score\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from xgboost import XGBRegressor\n",
        "\n",
        "\n",
        "# Feature Selection and Engineering\n",
        "df_combined = Manhattandf\n",
        "\n",
        "# Removed staddr as we already have boro and block numbers so being further specific will serve little purpose\n",
        "# features_to_use = ['boro', 'block', 'lot', 'taxclass', 'bldgcl', 'staddr', 'ltfront', 'ltdepth', 'stories']\n",
        "features_to_use = ['block',  'taxclass', 'bldgcl',  'ltfront', 'ltdepth', 'stories', 'year']\n",
        "target = 'fullval'\n",
        "\n",
        "# Data Cleaning\n",
        "df_combined.dropna(subset=[target], inplace=True)\n",
        "\n",
        "# Convert categorical features to string\n",
        "# categorical_features = ['boro', 'taxclass', 'bldgcl', 'staddr']  # Assuming 'staddr' is categorical\n",
        "categorical_features = ['taxclass', 'bldgcl']\n",
        "for col in categorical_features:\n",
        "    df_combined[col] = df_combined[col].astype(str)\n",
        "\n",
        "# Categorize features\n",
        "numerical_features = [f for f in features_to_use if f not in categorical_features]\n",
        "\n",
        "# Preprocessor for handling both categorical and numerical features\n",
        "preprocessor = ColumnTransformer(\n",
        "    transformers=[\n",
        "        ('num', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='mean')),  # or 'median'\n",
        "            ('scaler', StandardScaler())\n",
        "        ]), numerical_features),\n",
        "        ('cat', Pipeline([\n",
        "            ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),\n",
        "            ('encoder', OneHotEncoder(handle_unknown='ignore'))\n",
        "        ]), categorical_features)\n",
        "    ]\n",
        ")\n",
        "'''\n",
        "# Linear Regression Model\n",
        "# Pipeline with model\n",
        "# Yielded .44 with 120,000 Values\n",
        "# Yielded .22 with 240,000 Values\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', LinearRegression())\n",
        "])\n",
        "'''\n",
        "'''\n",
        "# This model takes too long to load\n",
        "# Random Forest Regressor Model\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', RandomForestRegressor(n_estimators=100, random_state=42))\n",
        "])\n",
        "'''\n",
        "\n",
        "\n",
        "pipeline = Pipeline([\n",
        "    ('preprocessor', preprocessor),\n",
        "    ('model', XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.3, random_state=42))\n",
        "])\n",
        "\n",
        "\n",
        "# Model preparation\n",
        "X = df_combined[features_to_use]\n",
        "y = df_combined[target]\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
        "\n",
        "# Train the model\n",
        "pipeline.fit(X_train, y_train)\n",
        "\n",
        "# Predictions and Evaluation\n",
        "y_pred = pipeline.predict(X_test)\n",
        "mse = mean_squared_error(y_test, y_pred)\n",
        "r2 = r2_score(y_test, y_pred)\n",
        "\n",
        "print(f'Mean Squared Error: {mse}')\n",
        "print(f'R-squared: {r2}')\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 356
        },
        "id": "k8zidAEF0F6Y",
        "outputId": "faed793f-aae1-4aa9-a487-439dca5d3893"
      },
      "outputs": [
        {
          "output_type": "error",
          "ename": "KeyboardInterrupt",
          "evalue": "Interrupted by user",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-95-d8d48a32bfd8>\u001b[0m in \u001b[0;36m<cell line: 10>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      8\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0minput_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muser_input\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mblock\u001b[0m \u001b[0;34m=\u001b[0m   \u001b[0mget_input\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Enter the block number (or N/A if unknown): \"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m \u001b[0mtaxclass\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0mget_input\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Enter the tax class (or N/A if unknown): \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m \u001b[0mbldgcl\u001b[0m \u001b[0;34m=\u001b[0m  \u001b[0mget_input\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Enter the building class (or N/A if unknown): \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m<ipython-input-95-d8d48a32bfd8>\u001b[0m in \u001b[0;36mget_input\u001b[0;34m(prompt, input_type)\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;31m# Function to handle \"N/A\" input and convert it to None (which pandas interprets as np.nan)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_input\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprompt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m     \u001b[0muser_input\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprompt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0muser_input\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'n/a'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m    849\u001b[0m                 \u001b[0;34m\"raw_input was called, but this frontend does not support input requests.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    850\u001b[0m             )\n\u001b[0;32m--> 851\u001b[0;31m         return self._input_request(str(prompt),\n\u001b[0m\u001b[1;32m    852\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    853\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m    893\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    894\u001b[0m                 \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 895\u001b[0;31m                 \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Interrupted by user\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    896\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    897\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid Message:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m: Interrupted by user"
          ]
        }
      ],
      "source": [
        "# Ask user for input and output cost prediction\n",
        "\n",
        "# Function to handle \"N/A\" input and convert it to None (which pandas interprets as np.nan)\n",
        "def get_input(prompt, input_type=str):\n",
        "    user_input = input(prompt)\n",
        "    if user_input.lower() == 'n/a':\n",
        "        return None\n",
        "    return input_type(user_input)\n",
        "\n",
        "block =   get_input(\"Enter the block number (or N/A if unknown): \", int)\n",
        "taxclass =get_input(\"Enter the tax class (or N/A if unknown): \")\n",
        "bldgcl =  get_input(\"Enter the building class (or N/A if unknown): \")\n",
        "ltfront = get_input(\"Enter the lot frontage (or N/A if unknown): \", float)\n",
        "ltdepth = get_input(\"Enter the lot depth (or N/A if unknown): \", float)\n",
        "stories = get_input(\"Enter the number of stories (or N/A if unknown): \", int)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "410DuVfbw7jy"
      },
      "outputs": [],
      "source": [
        "'''\n",
        "year = 2018\n",
        "street_name = \"1 RIVER TERRACE\"\n",
        "block = 16\n",
        "lot_num = 3859\n",
        "fullval = 354180\n",
        "taxclass = 2\n",
        "building class = R4\n",
        "stores = 31\n",
        "'''"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2dqfigtDbkj0"
      },
      "outputs": [],
      "source": [
        "year =    get_input(\"Enter the year of purchase (or N/A if unknown): \", int)\n",
        "\n",
        "user_input = pd.DataFrame({\n",
        "    'block': [block],\n",
        "    'taxclass': [taxclass],\n",
        "    'bldgcl': [bldgcl],\n",
        "    'ltfront': [ltfront],\n",
        "    'ltdepth': [ltdepth],\n",
        "    'stories': [stories],\n",
        "    'year': [year]\n",
        "})\n",
        "\n",
        "# Check if user_input contains None, replace it with np.nan\n",
        "user_input = user_input.where(pd.notnull(user_input), None)\n",
        "\n",
        "predicted_value = pipeline.predict(user_input)\n",
        "\n",
        "print(f\"The predicted value of the building is: ${predicted_value[0]:,.2f}\" if predicted_value[0] is not None else \"Insufficient data to make a prediction.\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "i5QhKL68XYRZ"
      },
      "outputs": [],
      "source": [
        "print(predicted_value)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "X0V5dFIZOzMS"
      },
      "outputs": [],
      "source": [
        "print(\"To provide more accurate predictions and graphs, please provide the following extraneous metrics\")\n",
        "lot_num  =       get_input(\"Enter the lot number (or N/A if unknown): \", int)\n",
        "street_name =    get_input(\"Enter the street_name (or N/A if unknown): \")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "dyvJl278MRUj"
      },
      "outputs": [],
      "source": [
        "# Create empty dict of desired years use for processing\n",
        "\n",
        "cost_against_year = {}\n",
        "\n",
        "# Store ranges of years to implement in graphical displays\n",
        "for yeardecrement in range(8, 1, -1):\n",
        "  cost_against_year[year - yeardecrement] = 0\n",
        "\n",
        "cost_against_year[year] = 0\n",
        "\n",
        "for yearincrement in range(1, 5):\n",
        "  cost_against_year[year + yearincrement] = 0\n",
        "\n",
        "\n",
        "\n",
        "print(cost_against_year)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WDaIHmSfQewm"
      },
      "outputs": [],
      "source": [
        "# Loop through df to look for any existing values to base graphs off of rather than generating estimates using model\n",
        "# Then populate the rest of the years with predictions\n",
        "'''\n",
        "existing_entries_year = []\n",
        "\n",
        "for index, row in df4.iterrows():\n",
        "    if row['year'] in cost_against_year and row['staddr'] == street_name and row['lot'] == lot_num and row['block'] == block:\n",
        "        cost_against_year[row['year']] += row['fullval']\n",
        "        existing_entries_year.append(row['year'])\n",
        "'''"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PqasiPrVa5zg"
      },
      "outputs": [],
      "source": [
        "for key, value in cost_against_year.items():\n",
        "  print(value)\n",
        "  if value == 0:\n",
        "    prediction_year_df = pd.DataFrame({\n",
        "    'block': [block],\n",
        "    'taxclass': [taxclass],\n",
        "    'bldgcl': [bldgcl],\n",
        "    'ltfront': [ltfront],\n",
        "    'ltdepth': [ltdepth],\n",
        "    'stories': [stories],\n",
        "    'year': [key]\n",
        "    })\n",
        "    prediction_year_df.where(pd.notnull(user_input), None)\n",
        "\n",
        "    predicition_year = pipeline.predict(prediction_year_df)\n",
        "    print(key, \"year\")\n",
        "    print(predicition_year)\n",
        "    cost_against_year[key] = predicition_year[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "W5iqplJOWFHF"
      },
      "outputs": [],
      "source": [
        "print(cost_against_year)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "sEJjjqjKzXOx"
      },
      "outputs": [],
      "source": []
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "1pDk5-y87T-W"
      },
      "outputs": [],
      "source": [
        "# Heatmap of high profit and low profit areas red adn blue\n",
        "# Genrerate change of cost over the years\n",
        "# Line graphs of price change\n",
        "# Use gpt to update with real time events and produce a better humanlike itnerface"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}