Last active
April 21, 2021 14:51
-
-
Save rdmolony/859455279c2c7141f1a8a76e67aa3290 to your computer and use it in GitHub Desktop.
estimate-dublin-heat-pump-readiness.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "estimate-dublin-heat-pump-readiness.ipynb", | |
| "provenance": [], | |
| "collapsed_sections": [], | |
| "authorship_tag": "ABX9TyNbGs74m7yH9hrhznf5u3Rj", | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| }, | |
| "language_info": { | |
| "name": "python" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/rdmolony/859455279c2c7141f1a8a76e67aa3290/estimate-dublin-heat-pump-readiness.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "o4euzmnjARsp" | |
| }, | |
| "source": [ | |
| "# Download & Import all Dependencies" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "c-HFib7Cmbng" | |
| }, | |
| "source": [ | |
| "**Note!**\n", | |
| "\n", | |
| "May need to click the `Restart Runtime` if prompted!\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "-XAxdkZz_dTK" | |
| }, | |
| "source": [ | |
| "!pip install pydrive2" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "e9jxtbzRAPn9" | |
| }, | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "import numpy as np\n", | |
| "import pandas as pd\n", | |
| "import seaborn as sns\n", | |
| "\n", | |
| "sns.set()" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Pz1KpBiT6As6" | |
| }, | |
| "source": [ | |
| "# Download Data from the `codema-dev` Google Drive\n", | |
| "\n", | |
| "- dublin_ber_public.csv<sup>1</sup>\n", | |
| "\n", | |
| "\n", | |
| "- dublin_indiv_hh_up_to_2011_anonymised.csv<sup>2</sup>\n", | |
| "\n", | |
| "<br>\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "<sup>1</sup> [SEAI BER Public search](https://ndber.seai.ie/BERResearchTool/Register/Register.aspx) Dublin extract [accessed on 04/2021]\n", | |
| "\n", | |
| "<sup>2</sup> 2011 Census cross-tabulated (Dwelling Type | Period Built) building stock requested by Codema - Dublin's Energy Agency from the Central Statistics Office in 2015 anonymised [on 04/2021] to Routing Key Boundaries (which are derived by Autoaddress.ie from Small Area boundaries from DATA.GOV.IE and Eircode Routing Key data and is [published as open, free and reusable](https://www.autoaddress.ie/support/developer-centre/resources/routing-key-boundaries) [accessed on 21/04/2021])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "XezqIvZxmtnS" | |
| }, | |
| "source": [ | |
| "**Note!**\n", | |
| "\n", | |
| "Login to your Google account in order to download the required data from the `codema-dev` Google Drive" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "uAadXGz_-pgA" | |
| }, | |
| "source": [ | |
| "#Import modules\n", | |
| "from pydrive.auth import GoogleAuth\n", | |
| "from pydrive.drive import GoogleDrive\n", | |
| "from google.colab import auth\n", | |
| "from oauth2client.client import GoogleCredentials\n", | |
| "\n", | |
| "# Authenticate and create the PyDrive client\n", | |
| "auth.authenticate_user()\n", | |
| "gauth = GoogleAuth()\n", | |
| "gauth.credentials = GoogleCredentials.get_application_default()\n", | |
| "drive = GoogleDrive(gauth)" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "hqmjHIyH_mNH" | |
| }, | |
| "source": [ | |
| "downloaded = drive.CreateFile({'id':\"1E7uPdkvz-JvjES_h7UZMab7xrZITVD1t\"}) \n", | |
| "downloaded.GetContentFile('dublin_ber_public.csv')" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "mcg5PJgoAG2z" | |
| }, | |
| "source": [ | |
| "downloaded = drive.CreateFile({'id':\"13RgKNXxORJw3rXX9IxEV3fs8ky-MfYWI\"}) \n", | |
| "downloaded.GetContentFile('dublin_indiv_hh_up_to_2011_anonymised.csv') " | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "CuE-c7bJ6B3_" | |
| }, | |
| "source": [ | |
| "# On the BER Public dataset calculate:\n", | |
| "\n", | |
| "1. Convert BER Rating (A1, A2, B1 etc) to BER Band (A, B etc)\n", | |
| "\n", | |
| "2. Convert `Year_of_Construction` to `period_built` as specified in the 2011 Census\n", | |
| "\n", | |
| "3. Convert `DwellingTypeDescr` to `dwelling_type` as specified in the 2011 Census\n", | |
| "\n", | |
| "4. Create `category_id` to mark each unique `CountyName` (i.e. Postcode), `dwelling_type`, `period_built` for use in joining the BER Public data to the 2011 Census data\n", | |
| "\n", | |
| "5. Calculate `total_floor_area` by summing the area of each floor\n", | |
| "\n", | |
| "6. Calculate `heat_loss_parameter` (HLP) by using the formulae specified in the [Excel version of DEAP 4.2.2](https://www.seai.ie/home-energy/building-energy-rating-ber/support-for-ber-assessors/domestic-ber-resources/deap4-software/)\n", | |
| "\n", | |
| "7. Mark all households with a HLP < 2.3 as `heat_pump_ready` as specified in [SEAI's Technical Assessment Process for Heat Pump System Grants](https://www.seai.ie/publications/Technical_Advisor_Role.pdf)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "1q1bwWuf58Sj" | |
| }, | |
| "source": [ | |
| "thermal_bridging_factor = 0.15\n", | |
| "ventilation_heat_loss_constant = 0.33\n", | |
| "effective_air_rate_change = 0.5\n", | |
| "typical_floor_height = 2.5 # 200,000 / 280,000 Dublin HH are (2.4, 2.6]\n", | |
| "dublin_ber_public = (\n", | |
| " pd.read_csv(\"dublin_ber_public.csv\")\n", | |
| " .assign(\n", | |
| " BERBand=lambda df: df[\"EnergyRating\"].str[0],\n", | |
| " period_built=lambda df: pd.cut(\n", | |
| " df[\"Year_of_Construction\"],\n", | |
| " bins=[\n", | |
| " -np.inf,\n", | |
| " 1919,\n", | |
| " 1945,\n", | |
| " 1960,\n", | |
| " 1970,\n", | |
| " 1980,\n", | |
| " 1990,\n", | |
| " 2000,\n", | |
| " 2005,\n", | |
| " 2011,\n", | |
| " np.inf,\n", | |
| " ],\n", | |
| " labels=[\n", | |
| " \"before 1919\",\n", | |
| " \"1919 - 1945\",\n", | |
| " \"1946 - 1960\",\n", | |
| " \"1961 - 1970\",\n", | |
| " \"1971 - 1980\",\n", | |
| " \"1981 - 1990\",\n", | |
| " \"1991 - 2000\",\n", | |
| " \"2001 - 2005\",\n", | |
| " \"2006 - 2010\",\n", | |
| " \"2011 or later\",\n", | |
| " ],\n", | |
| " ),\n", | |
| " dwelling_type=lambda df: df[\"DwellingTypeDescr\"].replace(\n", | |
| " {\n", | |
| " \"Grnd floor apt.\": \"Apartment\",\n", | |
| " \"Mid floor apt.\": \"Apartment\",\n", | |
| " \"Top floor apt.\": \"Apartment\",\n", | |
| " \"Maisonette\": \"Apartment\",\n", | |
| " \"Apt.\": \"Apartment\",\n", | |
| " \"Det. house\": \"Detached house\",\n", | |
| " \"Semi-det. house\": \"Semi-detached house\",\n", | |
| " \"House\": \"Semi-detached house\",\n", | |
| " \"Mid terrc house\": \"Terraced house\",\n", | |
| " \"End terrc house\": \"Terraced house\",\n", | |
| " None: \"Not stated\",\n", | |
| " }\n", | |
| " ),\n", | |
| " category_id=lambda df: df.groupby(\n", | |
| " [\"CountyName\", \"dwelling_type\", \"period_built\"]\n", | |
| " ).cumcount().apply(lambda x: x + 1),\n", | |
| " total_floor_area=lambda df: df[\"GroundFloorArea\"]\n", | |
| " + df[\"FirstFloorArea\"]\n", | |
| " + df[\"SecondFloorArea\"]\n", | |
| " + df[\"ThirdFloorArea\"],\n", | |
| " thermal_bridging=lambda df: (\n", | |
| " df[\"RoofArea\"]\n", | |
| " + df[\"total_floor_area\"]\n", | |
| " + df[\"DoorArea\"]\n", | |
| " + df[\"WallArea\"]\n", | |
| " + df[\"WindowArea\"]\n", | |
| " )\n", | |
| " * thermal_bridging_factor,\n", | |
| " heat_loss_via_plane_elements=lambda df: df[\"WallArea\"] * df[\"UValueWall\"]\n", | |
| " + df[\"RoofArea\"] * df[\"UValueRoof\"]\n", | |
| " + df[\"total_floor_area\"] * df[\"UValueFloor\"]\n", | |
| " + df[\"WindowArea\"] * df[\"UValueWindow\"]\n", | |
| " + df[\"DoorArea\"] * df[\"UvalueDoor\"],\n", | |
| " fabric_heat_loss=lambda df: df[\"thermal_bridging\"]\n", | |
| " + df[\"heat_loss_via_plane_elements\"],\n", | |
| " building_volume=lambda df: df[\"GroundFloorArea\"] * df[\"GroundFloorHeight\"]\n", | |
| " + df[\"FirstFloorArea\"] * df[\"FirstFloorHeight\"]\n", | |
| " + df[\"SecondFloorArea\"] * df[\"SecondFloorHeight\"]\n", | |
| " + df[\"ThirdFloorArea\"] * df[\"ThirdFloorHeight\"],\n", | |
| " building_volume_approx=lambda df: df[\"total_floor_area\"]\n", | |
| " * df[\"NoStoreys\"]\n", | |
| " * typical_floor_height,\n", | |
| " ventilation_heat_loss=lambda df: df[\"building_volume\"]\n", | |
| " * ventilation_heat_loss_constant\n", | |
| " * ventilation_heat_loss_constant,\n", | |
| " heat_loss_coefficient=lambda df: df[\"fabric_heat_loss\"]\n", | |
| " + df[\"ventilation_heat_loss\"],\n", | |
| " heat_loss_parameter=lambda df: df[\"heat_loss_coefficient\"]\n", | |
| " / df[\"total_floor_area\"],\n", | |
| " heat_pump_ready=lambda df: pd.cut(\n", | |
| " df[\"heat_loss_parameter\"], bins=[0, 2.3, np.inf], labels=[True, False]\n", | |
| " ),\n", | |
| " )\n", | |
| ")\n" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 617 | |
| }, | |
| "id": "oHmLK0WbHWlE", | |
| "outputId": "de8be753-4be4-409f-fc88-870d7cb6a0ec" | |
| }, | |
| "source": [ | |
| "dublin_ber_public" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>CountyName</th>\n", | |
| " <th>DwellingTypeDescr</th>\n", | |
| " <th>Year_of_Construction</th>\n", | |
| " <th>EnergyRating</th>\n", | |
| " <th>GroundFloorArea</th>\n", | |
| " <th>FirstFloorArea</th>\n", | |
| " <th>SecondFloorArea</th>\n", | |
| " <th>ThirdFloorArea</th>\n", | |
| " <th>GroundFloorHeight</th>\n", | |
| " <th>FirstFloorHeight</th>\n", | |
| " <th>SecondFloorHeight</th>\n", | |
| " <th>ThirdFloorHeight</th>\n", | |
| " <th>NoStoreys</th>\n", | |
| " <th>RoofArea</th>\n", | |
| " <th>DoorArea</th>\n", | |
| " <th>WallArea</th>\n", | |
| " <th>WindowArea</th>\n", | |
| " <th>UValueWall</th>\n", | |
| " <th>UValueRoof</th>\n", | |
| " <th>UValueFloor</th>\n", | |
| " <th>UvalueDoor</th>\n", | |
| " <th>UValueWindow</th>\n", | |
| " <th>BERBand</th>\n", | |
| " <th>period_built</th>\n", | |
| " <th>dwelling_type</th>\n", | |
| " <th>category_id</th>\n", | |
| " <th>total_floor_area</th>\n", | |
| " <th>thermal_bridging</th>\n", | |
| " <th>heat_loss_via_plane_elements</th>\n", | |
| " <th>fabric_heat_loss</th>\n", | |
| " <th>building_volume</th>\n", | |
| " <th>building_volume_approx</th>\n", | |
| " <th>ventilation_heat_loss</th>\n", | |
| " <th>heat_loss_coefficient</th>\n", | |
| " <th>heat_loss_parameter</th>\n", | |
| " <th>heat_pump_ready</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Dublin 6W</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>1994.0</td>\n", | |
| " <td>D1</td>\n", | |
| " <td>55.20</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.40</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>1.0</td>\n", | |
| " <td>55.20</td>\n", | |
| " <td>1.82</td>\n", | |
| " <td>42.75</td>\n", | |
| " <td>6.31</td>\n", | |
| " <td>0.35</td>\n", | |
| " <td>0.26</td>\n", | |
| " <td>0.41</td>\n", | |
| " <td>3.00</td>\n", | |
| " <td>2.80</td>\n", | |
| " <td>D</td>\n", | |
| " <td>1991 - 2000</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>1</td>\n", | |
| " <td>55.20</td>\n", | |
| " <td>24.1920</td>\n", | |
| " <td>75.0745</td>\n", | |
| " <td>99.2665</td>\n", | |
| " <td>132.4800</td>\n", | |
| " <td>138.000</td>\n", | |
| " <td>14.427072</td>\n", | |
| " <td>113.693572</td>\n", | |
| " <td>2.059666</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Co. Dublin</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>2007.0</td>\n", | |
| " <td>B2</td>\n", | |
| " <td>55.43</td>\n", | |
| " <td>55.43</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.41</td>\n", | |
| " <td>2.66</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.0</td>\n", | |
| " <td>0.54</td>\n", | |
| " <td>2.07</td>\n", | |
| " <td>34.40</td>\n", | |
| " <td>25.38</td>\n", | |
| " <td>0.37</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.26</td>\n", | |
| " <td>3.00</td>\n", | |
| " <td>2.70</td>\n", | |
| " <td>B</td>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>1</td>\n", | |
| " <td>110.86</td>\n", | |
| " <td>25.9875</td>\n", | |
| " <td>116.4226</td>\n", | |
| " <td>142.4101</td>\n", | |
| " <td>281.0301</td>\n", | |
| " <td>554.300</td>\n", | |
| " <td>30.604178</td>\n", | |
| " <td>173.014278</td>\n", | |
| " <td>1.560656</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Dublin 6</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>2000.0</td>\n", | |
| " <td>B3</td>\n", | |
| " <td>70.67</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.40</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>1.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>2.06</td>\n", | |
| " <td>26.32</td>\n", | |
| " <td>13.54</td>\n", | |
| " <td>0.91</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>3.00</td>\n", | |
| " <td>2.70</td>\n", | |
| " <td>B</td>\n", | |
| " <td>1991 - 2000</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>1</td>\n", | |
| " <td>70.67</td>\n", | |
| " <td>16.8885</td>\n", | |
| " <td>66.6892</td>\n", | |
| " <td>83.5777</td>\n", | |
| " <td>169.6080</td>\n", | |
| " <td>176.675</td>\n", | |
| " <td>18.470311</td>\n", | |
| " <td>102.048011</td>\n", | |
| " <td>1.444008</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Dublin 14</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>1955.0</td>\n", | |
| " <td>B3</td>\n", | |
| " <td>110.58</td>\n", | |
| " <td>68.08</td>\n", | |
| " <td>36.69</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.85</td>\n", | |
| " <td>2.70</td>\n", | |
| " <td>1.36</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>3.0</td>\n", | |
| " <td>101.64</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>188.46</td>\n", | |
| " <td>54.52</td>\n", | |
| " <td>0.22</td>\n", | |
| " <td>0.27</td>\n", | |
| " <td>0.60</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>2.44</td>\n", | |
| " <td>B</td>\n", | |
| " <td>1946 - 1960</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>1</td>\n", | |
| " <td>215.35</td>\n", | |
| " <td>83.9955</td>\n", | |
| " <td>331.1428</td>\n", | |
| " <td>415.1383</td>\n", | |
| " <td>548.8674</td>\n", | |
| " <td>1615.125</td>\n", | |
| " <td>59.771660</td>\n", | |
| " <td>474.909960</td>\n", | |
| " <td>2.205294</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Dublin 9</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>2001.0</td>\n", | |
| " <td>C1</td>\n", | |
| " <td>67.98</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.34</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>1.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>2.26</td>\n", | |
| " <td>38.77</td>\n", | |
| " <td>8.68</td>\n", | |
| " <td>0.51</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.29</td>\n", | |
| " <td>2.54</td>\n", | |
| " <td>2.70</td>\n", | |
| " <td>C</td>\n", | |
| " <td>2001 - 2005</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>1</td>\n", | |
| " <td>67.98</td>\n", | |
| " <td>17.6535</td>\n", | |
| " <td>68.6633</td>\n", | |
| " <td>86.3168</td>\n", | |
| " <td>159.0732</td>\n", | |
| " <td>169.950</td>\n", | |
| " <td>17.323071</td>\n", | |
| " <td>103.639871</td>\n", | |
| " <td>1.524564</td>\n", | |
| " <td>True</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", | |
| " <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", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>286954</th>\n", | |
| " <td>Dublin 9</td>\n", | |
| " <td>End of terrace house</td>\n", | |
| " <td>1945.0</td>\n", | |
| " <td>G</td>\n", | |
| " <td>55.45</td>\n", | |
| " <td>32.93</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.50</td>\n", | |
| " <td>2.69</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.0</td>\n", | |
| " <td>57.60</td>\n", | |
| " <td>3.70</td>\n", | |
| " <td>96.76</td>\n", | |
| " <td>13.00</td>\n", | |
| " <td>1.97</td>\n", | |
| " <td>1.30</td>\n", | |
| " <td>0.78</td>\n", | |
| " <td>2.35</td>\n", | |
| " <td>5.63</td>\n", | |
| " <td>G</td>\n", | |
| " <td>1919 - 1945</td>\n", | |
| " <td>End of terrace house</td>\n", | |
| " <td>262</td>\n", | |
| " <td>88.38</td>\n", | |
| " <td>38.9160</td>\n", | |
| " <td>416.3186</td>\n", | |
| " <td>455.2346</td>\n", | |
| " <td>227.2067</td>\n", | |
| " <td>441.900</td>\n", | |
| " <td>24.742810</td>\n", | |
| " <td>479.977410</td>\n", | |
| " <td>5.430837</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>286955</th>\n", | |
| " <td>Dublin 14</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>1963.0</td>\n", | |
| " <td>C3</td>\n", | |
| " <td>75.66</td>\n", | |
| " <td>58.08</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.38</td>\n", | |
| " <td>2.73</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.0</td>\n", | |
| " <td>75.87</td>\n", | |
| " <td>1.61</td>\n", | |
| " <td>82.40</td>\n", | |
| " <td>32.48</td>\n", | |
| " <td>2.06</td>\n", | |
| " <td>0.91</td>\n", | |
| " <td>0.62</td>\n", | |
| " <td>2.91</td>\n", | |
| " <td>3.25</td>\n", | |
| " <td>C</td>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Semi-detached house</td>\n", | |
| " <td>653</td>\n", | |
| " <td>133.74</td>\n", | |
| " <td>48.9150</td>\n", | |
| " <td>431.9496</td>\n", | |
| " <td>480.8646</td>\n", | |
| " <td>338.6292</td>\n", | |
| " <td>668.700</td>\n", | |
| " <td>36.876720</td>\n", | |
| " <td>517.741320</td>\n", | |
| " <td>3.871253</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>286956</th>\n", | |
| " <td>Dublin 6</td>\n", | |
| " <td>End of terrace house</td>\n", | |
| " <td>1995.0</td>\n", | |
| " <td>C3</td>\n", | |
| " <td>34.37</td>\n", | |
| " <td>34.84</td>\n", | |
| " <td>19.05</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.47</td>\n", | |
| " <td>2.69</td>\n", | |
| " <td>2.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>3.0</td>\n", | |
| " <td>34.64</td>\n", | |
| " <td>1.88</td>\n", | |
| " <td>97.57</td>\n", | |
| " <td>15.44</td>\n", | |
| " <td>0.52</td>\n", | |
| " <td>0.32</td>\n", | |
| " <td>0.44</td>\n", | |
| " <td>3.00</td>\n", | |
| " <td>2.81</td>\n", | |
| " <td>C</td>\n", | |
| " <td>1991 - 2000</td>\n", | |
| " <td>End of terrace house</td>\n", | |
| " <td>94</td>\n", | |
| " <td>88.26</td>\n", | |
| " <td>35.6685</td>\n", | |
| " <td>149.6820</td>\n", | |
| " <td>185.3505</td>\n", | |
| " <td>216.7135</td>\n", | |
| " <td>661.950</td>\n", | |
| " <td>23.600100</td>\n", | |
| " <td>208.950600</td>\n", | |
| " <td>2.367444</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>286957</th>\n", | |
| " <td>Dublin 22</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>2003.0</td>\n", | |
| " <td>C2</td>\n", | |
| " <td>61.64</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.43</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>1.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>1.76</td>\n", | |
| " <td>43.16</td>\n", | |
| " <td>9.07</td>\n", | |
| " <td>0.86</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>1.36</td>\n", | |
| " <td>3.06</td>\n", | |
| " <td>C</td>\n", | |
| " <td>2001 - 2005</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>340</td>\n", | |
| " <td>61.64</td>\n", | |
| " <td>17.3445</td>\n", | |
| " <td>67.2654</td>\n", | |
| " <td>84.6099</td>\n", | |
| " <td>149.7852</td>\n", | |
| " <td>154.100</td>\n", | |
| " <td>16.311608</td>\n", | |
| " <td>100.921508</td>\n", | |
| " <td>1.637273</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>286958</th>\n", | |
| " <td>Dublin 14</td>\n", | |
| " <td>Mid-terrace house</td>\n", | |
| " <td>1962.0</td>\n", | |
| " <td>D2</td>\n", | |
| " <td>51.85</td>\n", | |
| " <td>43.86</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.42</td>\n", | |
| " <td>2.64</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.0</td>\n", | |
| " <td>57.91</td>\n", | |
| " <td>3.38</td>\n", | |
| " <td>73.98</td>\n", | |
| " <td>17.19</td>\n", | |
| " <td>2.05</td>\n", | |
| " <td>1.01</td>\n", | |
| " <td>0.87</td>\n", | |
| " <td>2.47</td>\n", | |
| " <td>2.35</td>\n", | |
| " <td>D</td>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Mid-terrace house</td>\n", | |
| " <td>134</td>\n", | |
| " <td>95.71</td>\n", | |
| " <td>37.2255</td>\n", | |
| " <td>342.1609</td>\n", | |
| " <td>379.3864</td>\n", | |
| " <td>241.2674</td>\n", | |
| " <td>478.550</td>\n", | |
| " <td>26.274020</td>\n", | |
| " <td>405.660420</td>\n", | |
| " <td>4.238433</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>286959 rows × 36 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " CountyName DwellingTypeDescr ... heat_loss_parameter heat_pump_ready\n", | |
| "0 Dublin 6W Semi-detached house ... 2.059666 True\n", | |
| "1 Co. Dublin Ground-floor apartment ... 1.560656 True\n", | |
| "2 Dublin 6 Mid-floor apartment ... 1.444008 True\n", | |
| "3 Dublin 14 Semi-detached house ... 2.205294 True\n", | |
| "4 Dublin 9 Ground-floor apartment ... 1.524564 True\n", | |
| "... ... ... ... ... ...\n", | |
| "286954 Dublin 9 End of terrace house ... 5.430837 False\n", | |
| "286955 Dublin 14 Semi-detached house ... 3.871253 False\n", | |
| "286956 Dublin 6 End of terrace house ... 2.367444 False\n", | |
| "286957 Dublin 22 Mid-floor apartment ... 1.637273 True\n", | |
| "286958 Dublin 14 Mid-terrace house ... 4.238433 False\n", | |
| "\n", | |
| "[286959 rows x 36 columns]" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 7 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "BZwluvQ8vqS7" | |
| }, | |
| "source": [ | |
| "# Plot `heat_pump_ready` vs `period_built`\n", | |
| "\n", | |
| "... in order to estimate `heat_pump_ready` for unknown buildings based on their age" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 630 | |
| }, | |
| "id": "4W4bKo-vv-ij", | |
| "outputId": "0920e18d-04ff-44e8-b7ba-447d2bf72ec7" | |
| }, | |
| "source": [ | |
| "plt.figure(figsize=(10,10))\n", | |
| "sns.countplot(x=\"heat_pump_ready\", hue=\"period_built\", data=dublin_ber_public)" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.axes._subplots.AxesSubplot at 0x7f5a1ad869d0>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 8 | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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IuIgdl/JKywsZPTo0XTs2JGgoKCLapV96lZEREREnMPukNeyZUtatmzpzFlERERExEHsDnmjR4925hwiIiIi4kB2h7zfX292Od26dXPIMCIiIiLiGHaHvN9fb/a73NxcioqKCAkJ4aOPPnL4YCIiIiJSeXaHvN9fb/a7kpISli5dSoMGDRw+lIiIiIhUjd1LqPw3Nzc3Ro0aRWpqqiPnEREREREHqHTIA/j888+1OLKIiIhILWT37dqePXteFOjOnz+P2WwmPj7eKYOJiIiISOXZHfKSk5Mv+uzp6cm1116Lt7e3w4cSERERkaqxO+R17twZAIvFQlZWFkFBQRiNVbrbKyIiIiJOYndKO3PmDJMmTaJdu3bcfPPNtGvXjueee47Tp087cz4RERERqQS7Q94LL7zA+fPn2bx5M9999x2bN2/m/PnzvPDCC86cT0REREQqwe7btZ9++ik7duzA09MTgGuvvZakpCR69+7ttOFEREREpHLsvpLn4eFBTk7ORdtyc3MxmUwOH0pEREREqsbuK3kDBw5k2LBhDB06lPDwcE6cOMGqVasYNGiQM+cTERERkUqwO+Q98cQThISEsHnzZk6ePEmjRo0YMWKEQp6IiIhILWT37drExESuvfZaVq1axdatW1m1ahUtWrQgMTHRmfOJiIiISCXYHfK2bNlC27ZtL9rWtm1btmzZ4vChRERERKRq7A55BoMBi8Vy0baSkpJLtomIiIhIzbM75EVHR7NgwQJbqLNYLLz00ktER0c7bTgRERERqRy7H7x4/vnnefzxx+nevTvh4eGkp6cTHBzMsmXLnDmfiIiIiFSC3SEvNDSUDRs28N1335Genk5YWBjt2rXT+2tFREREaiG7Qx6A0Wikffv2tG/f3lnziIiIiIgD6DKciIiIiAtSyBMRERFxQQp5IiIiIi5IIU9ERETEBSnkiYiIiLgghTwRERERF6SQJyIiIuKCFPJEREREXJBCnoiIiIgLUsgTERERcUEKeSIiIiIuSCFPRERExAUp5ImIiIi4IIU8ERERERekkCciIiLighTyRERERFyQQp6IiIiIC1LIExEREXFBCnkiIiIiLkghT0RERMQFKeSJiIiIuCCFPBEREREXpJAnIiIi4oIU8kRERERckEKeiIiIiAtSyBMRERFxQe41PYCIiIhUnwA/T9xNjv+//2JzMbn5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d9RWgU7oggsuaLtce+6552bOnDmpq6vLv/71r5x11ln585//vMX9X3nlldx4443561//mh49emTdunXp0aNHXn311UybNi2zZs1Kv379smLFipx22mmZP39+evXqVYtDoxMTebANTj755G263x//+Mc89thjGT9+fJK3Pje5Z8+e7bk1YBfw9su1jz76aL761a9m+fLl6d69e15++eWsXLlyizP+e+yxRz72sY/lu9/9boYPH55jjz02PXv2zMMPP5wXX3wx55xzTtt96+rq8vzzz+fQQw/t8OOicxN5sA0+9KEPtX1dX1+fzZs3t/15w4YNbV9XVZXzzjsvp512WofuD9h1XHzxxZkyZUqOP/74bN68OYMGDdrifSR5631mzpw5eeihh/Lggw/mlFNOyS9+8YtUVZWDDjooN998c412z67Er1CBD2j//ffPP//5z7S0tKSlpSULFixoGxs5cmRmz56dtWvXJklaWlryj3/8o1ZbBTqh1157Lfvuu2+S5Pbbb09LS8s77rNu3bqsXr06n/nMZ3LBBRdkwIABWbx4cYYMGZLnn38+Dz74YNt9H3300fiEUt6NM3nwAQ0ePDhHHXVUTjrppPTr1y8HH3xwVq5cmeSty7qvvPJKJk+enOStM3tnnHFGDj744FpuGehEvve97+Ub3/hG9txzzxx99NFpamp6x33WrVuX888/P+vXr09VVTnkkEMyatSoNDY25rrrrsvMmTNzxRVXZOPGjdlvv/1y/fXXp66urgZHQ2dWV8l/AIDiuFwLAFAgkQcAUCCRBwBQIJEHAFAgkQcAUCCRB3RKI0eOzN/+9rdab6PLevHFF3PQQQdl06ZNtd4KsJ1EHtBlzJ07N2eccUattwHQIUQeQAGccQP+k8gDOq0nn3wyn//853P44YfnwgsvbPt8zz/96U8ZN25chg4dmokTJ27x0XGzZs3K8ccfnyFDhmTMmDH5wx/+kCR55plnMm3atCxatChDhgzJ0KFD33ftKVOmZOrUqTn77LMzZMiQTJ48OS+99FKSd7+UeeaZZ+bWW29N8tYZw4kTJ+aKK67I0KFDc9xxx+Whhx7K3Llzc8wxx+Soo47K7373u21a6/38/88wHTVqVEaNGrXdz02StLa2ZsaMGRk2bFiOO+64PPDAA21j99xzT0455ZQt1r7hhhty3nnnbXWPQA1VAJ3QiBEjqlNPPbVatmxZtWbNmurEE0+sZs+eXT3++OPVkUceWS1atKjatGlTNXfu3GrEiBHVhg0bqqqqqrvvvrtatmxZ1draWt11113VoEGDquXLl1dVVVW33357NXHixG1a/5JLLqkGDx5c/f3vf682bNhQTZ8+ve2xL7zwQjVgwIBq48aNbfefPHlyNWfOnLZ1Bg4cWN12223Vpk2bqp/+9KfVMcccU1122WXVhg0bqr/85S/V4MGDq3Xr1m11rfczYMCA6qyzzqrWrFlTvfnmmzv03MyePbs64YQTqiVLllRr1qypJk+e3HaMGzZsqI444ojq6aefblt73Lhx1b333rtNzyVQG87kAZ3WmWeemf79+6epqSkjRozIk08+md/+9reZMGFCBg0alPr6+owfPz677bZbFi1alCQZPXp0+vfvn27dumXMmDHZf//98+ijj27X+scee2yOOOKINDQ05KKLLsqiRYuydOnSbXrsvvvum1NPPTX19fUZM2ZMli5dmm9+85tpaGjI8OHD09DQkH//+987vNbXvva1NDU1pUePHjv03Nxzzz358pe/nObm5jQ1NeXcc89tW6OhoSGjR4/O73//+yTJ4sWL89JLL2XEiBHb/FwCHa97rTcA8F769u3b9vXuu++eFStWZO3atbnjjjvy61//um1s48aNWbFiRZLkjjvuyA033NB2ufONN97ImjVrtmv9j370o21ff/jDH86ee+6ZFStWpE+fPlt97Nvv06NHjyTJXnvt1XZbY2NjXn/99a2u1dzc/L7rvH18yZIl2/3c/Odae++99xbrjB8/PhdffHEuvPDCzJs3L6NHj05DQ8NWngWglkQesEtpbm7O17/+9Xf9frCXXnopl156aW688cYMGTIk9fX1GTduXNt4XV3dB1pr2bJlbV+//vrrWbt2bfr165fGxsYkyfr169OzZ88kycqVK7fncLa61ta8/Zh25Lnp27fvFmcO//Ms4uDBg7Pbbrtl4cKFmT9/fq666qoPdHxAx3O5FtilnH766bnlllvyyCOPpKqqvPHGG7n//vuzbt26vPnmm6mrq0vv3r2TJLfffnsWL17c9tg+ffpk+fLlaWlp2aa1HnjggSxcuDAtLS352c9+lkGDBqW5uTm9e/dO//79M2/evLS2tua2227LCy+8sEPH9V5rfRA78tyMHj06v/rVr7Js2bKsXbs2s2bNesf8J598ci6//PJ07959qz+4AtSeyAN2KYceemimT5+eyy+/PEcccURGjRqVuXPnJkkOPPDAfOUrX8nEiRPz2c9+Nk899VQOO+ywtsceeeSROfDAAzN8+PAMGzZsq2uNHTs21157bYYNG5bHH388M2fObBubPn16fvnLX2bYsGF5+umnM2TIkB06rvdba1vtyHPzxS9+McOHD8+4ceMyfvz4tp/Wfbtx48Zl8eLF+cIXvrD9Bwp0mLqqqqpabwKgs5kyZUr69++fiy66qKi1dsT69evbfv3Lxz/+8VpvB9gKZ/IA2Ca/+c1vcuihhwo82EX4wQugyzrppJOyZMmSd9z+gx/8oAa7eaeFCxfmnHPOedexhx9+uEP3MnLkyFRVlWuvvbZD1wW2n8u1AAAFcrkWAKBAIg8AoEAiDwCgQCIPAKBAIg8AoEAiDwCgQP8PDeD37z1SKucAAAAASUVORK5CYII=\n", | |
| "text/plain": [ | |
| "<Figure size 720x720 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "R-6WoHCwwENf" | |
| }, | |
| "source": [ | |
| "So it's reasonable to estimate on heat pump readiness:\n", | |
| "\n", | |
| "- Very unlikely: `[\"before 1919\", \"1919 - 1945\", \"1946 - 1960\", \"1961 - 1970\"]`\n", | |
| "- Unlikely: `\"1971 - 1980\"`\n", | |
| "- Somewhat unlikely: `\"1981 - 1990\"`\n", | |
| "- Somewhat likely: `\"1991 - 2000\"`\n", | |
| "- Very likely: `[\"2001 - 2005\", \"2006 - 2010\", \"2011 or later\"]`" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "JuK-bNDYAw6j" | |
| }, | |
| "source": [ | |
| "# On the 2011 Census dataset calculate:\n", | |
| "\n", | |
| "1. Create `category_id` to mark each unique `CountyName`, `dwelling_type`, `period_built` for use in joining the BER Public data to the 2011 Census data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "s-_XDqkPCfAf" | |
| }, | |
| "source": [ | |
| "dublin_census_2011 = (\n", | |
| " pd.read_csv(\"dublin_indiv_hh_up_to_2011_anonymised.csv\")\n", | |
| " .assign(\n", | |
| " category_id=lambda df: df.groupby(\n", | |
| " [\"COUNTYNAME\", \"dwelling_type\", \"period_built\"]\n", | |
| " ).cumcount().apply(lambda x: x + 1),\n", | |
| " )\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 423 | |
| }, | |
| "id": "bG6F5I3wE8VR", | |
| "outputId": "28d30363-ebbe-4d2d-f0a5-2922c514f157" | |
| }, | |
| "source": [ | |
| "dublin_census_2011" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>period_built</th>\n", | |
| " <th>dwelling_type</th>\n", | |
| " <th>COUNTYNAME</th>\n", | |
| " <th>RoutingKey</th>\n", | |
| " <th>Descriptor</th>\n", | |
| " <th>category_id</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>before 1919</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>4</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", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>454354</th>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Apartment</td>\n", | |
| " <td>Dublin 20</td>\n", | |
| " <td>D20</td>\n", | |
| " <td>DUBLIN 20</td>\n", | |
| " <td>66</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>454355</th>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Apartment</td>\n", | |
| " <td>Dublin 20</td>\n", | |
| " <td>D20</td>\n", | |
| " <td>DUBLIN 20</td>\n", | |
| " <td>67</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>454356</th>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Apartment</td>\n", | |
| " <td>Dublin 20</td>\n", | |
| " <td>D20</td>\n", | |
| " <td>DUBLIN 20</td>\n", | |
| " <td>68</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>454357</th>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Apartment</td>\n", | |
| " <td>Dublin 20</td>\n", | |
| " <td>D20</td>\n", | |
| " <td>DUBLIN 20</td>\n", | |
| " <td>69</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>454358</th>\n", | |
| " <td>2006 - 2010</td>\n", | |
| " <td>Apartment</td>\n", | |
| " <td>Dublin 20</td>\n", | |
| " <td>D20</td>\n", | |
| " <td>DUBLIN 20</td>\n", | |
| " <td>70</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>454359 rows × 6 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " period_built dwelling_type ... Descriptor category_id\n", | |
| "0 before 1919 Detached house ... DUBLIN 10 1\n", | |
| "1 1961 - 1970 Detached house ... DUBLIN 10 1\n", | |
| "2 1961 - 1970 Detached house ... DUBLIN 10 2\n", | |
| "3 1961 - 1970 Detached house ... DUBLIN 10 3\n", | |
| "4 1961 - 1970 Detached house ... DUBLIN 10 4\n", | |
| "... ... ... ... ... ...\n", | |
| "454354 2006 - 2010 Apartment ... DUBLIN 20 66\n", | |
| "454355 2006 - 2010 Apartment ... DUBLIN 20 67\n", | |
| "454356 2006 - 2010 Apartment ... DUBLIN 20 68\n", | |
| "454357 2006 - 2010 Apartment ... DUBLIN 20 69\n", | |
| "454358 2006 - 2010 Apartment ... DUBLIN 20 70\n", | |
| "\n", | |
| "[454359 rows x 6 columns]" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 10 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "EjbyJOE2JNqJ" | |
| }, | |
| "source": [ | |
| "# Link the BER Public dataset to the 2011 Census dataset\n", | |
| "\n", | |
| "> BER Public is complete post-2011 so combining these two datasets creates a complete up-to-date building stock\n", | |
| "\n", | |
| "1. Merge `dublin_census_2011` with `dublin_ber_public` on common columns\n", | |
| "\n", | |
| "2. Link buildings built after 2011 to the merged building stock<sup>1</sup>\n", | |
| "\n", | |
| "3. Assume that all buildings with unknown `heat_pump_ready` are `False` as all new or retrofitted buildings are known and reflected in the BER Public dataset \n", | |
| "\n", | |
| "<br>\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "<sup>1</sup> Heat pump readiness for unknown buildings is estimated based on building age (see `heat_pump_ready` vs `period_built` distribution above):\n", | |
| "- not heat pump ready: `[\"not stated\", \"before 1919\", \"1919 - 1945\", \"1946 - 1960\", \"1961 - 1970\", \"1971 - 1980\", \"1981 - 1990\"]`\n", | |
| "- heat pump ready: `[\"1991 - 2000\", \"2001 - 2005\", \"2006 - 2010\", \"2011 or later\"]`" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "U__oggm8H1QO" | |
| }, | |
| "source": [ | |
| "ber_public_columns_to_keep = [\n", | |
| " \"CountyName\",\n", | |
| " \"dwelling_type\",\n", | |
| " \"period_built\",\n", | |
| " \"Year_of_Construction\",\n", | |
| " \"category_id\",\n", | |
| " \"total_floor_area\",\n", | |
| " \"EnergyRating\",\n", | |
| " \"BERBand\",\n", | |
| " \"heat_pump_ready\",\n", | |
| "]" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "eb0rnMKIAOEg" | |
| }, | |
| "source": [ | |
| "dublin_indiv_hh_before_2011 = dublin_census_2011.merge(\n", | |
| " dublin_ber_public.loc[:, ber_public_columns_to_keep],\n", | |
| " left_on=[\"COUNTYNAME\", \"dwelling_type\", \"period_built\", \"category_id\"],\n", | |
| " right_on=[\"CountyName\", \"dwelling_type\", \"period_built\", \"category_id\"],\n", | |
| " how=\"left\",\n", | |
| " indicator=True,\n", | |
| " suffixes=[\"\", \"_BER\"],\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "8BR6CkHEIgV-" | |
| }, | |
| "source": [ | |
| "dublin_indiv_hh_2011_or_later = (\n", | |
| " dublin_ber_public.loc[:, ber_public_columns_to_keep]\n", | |
| " .query(\"`Year_of_Construction` >= 2011\")\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "wJHeB5zqHell" | |
| }, | |
| "source": [ | |
| "dublin_indiv_hh = (\n", | |
| " pd.concat(\n", | |
| " [\n", | |
| " dublin_indiv_hh_before_2011,\n", | |
| " dublin_indiv_hh_2011_or_later,\n", | |
| " ]\n", | |
| " )\n", | |
| " .reset_index(drop=True)\n", | |
| " .assign(\n", | |
| " heat_pump_readiness_estimated_on_period_built=lambda df:\n", | |
| " df[\"period_built\"].replace(\n", | |
| " {\n", | |
| " \"before 1919\": False,\n", | |
| " \"1919 - 1945\": False,\n", | |
| " \"1946 - 1960\": False,\n", | |
| " \"1961 - 1970\": False,\n", | |
| " \"1971 - 1980\": False,\n", | |
| " \"1981 - 1990\": False,\n", | |
| " \"1991 - 2000\": True,\n", | |
| " \"2001 - 2005\": True,\n", | |
| " \"2006 - 2010\": True,\n", | |
| " \"2011 or later\": True,\n", | |
| " \"not stated\": False,\n", | |
| " }\n", | |
| " ),\n", | |
| " inferred_heat_pump_readiness=lambda df: df[\"heat_pump_ready\"].fillna(\n", | |
| " df[\"heat_pump_readiness_estimated_on_period_built\"]\n", | |
| " ),\n", | |
| " )\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 513 | |
| }, | |
| "id": "ZEOyRUtDHZT3", | |
| "outputId": "1385a090-93f5-4526-aff9-1eb1013eb13b" | |
| }, | |
| "source": [ | |
| "dublin_indiv_hh" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>period_built</th>\n", | |
| " <th>dwelling_type</th>\n", | |
| " <th>COUNTYNAME</th>\n", | |
| " <th>RoutingKey</th>\n", | |
| " <th>Descriptor</th>\n", | |
| " <th>category_id</th>\n", | |
| " <th>CountyName</th>\n", | |
| " <th>Year_of_Construction</th>\n", | |
| " <th>total_floor_area</th>\n", | |
| " <th>EnergyRating</th>\n", | |
| " <th>BERBand</th>\n", | |
| " <th>heat_pump_ready</th>\n", | |
| " <th>_merge</th>\n", | |
| " <th>heat_pump_readiness_estimated_on_period_built</th>\n", | |
| " <th>inferred_heat_pump_readiness</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>before 1919</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>1900.0</td>\n", | |
| " <td>143.10</td>\n", | |
| " <td>E1</td>\n", | |
| " <td>E</td>\n", | |
| " <td>False</td>\n", | |
| " <td>both</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</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>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>2</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>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>3</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>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>4</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>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</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>491427</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>253</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>97.50</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491428</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>254</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>81.00</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491429</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Top-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>134</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>81.00</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491430</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>1698</td>\n", | |
| " <td>Co. Dublin</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>213.06</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491431</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>810</td>\n", | |
| " <td>Co. Dublin</td>\n", | |
| " <td>2020.0</td>\n", | |
| " <td>77.35</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>491432 rows × 15 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " period_built ... inferred_heat_pump_readiness\n", | |
| "0 before 1919 ... False\n", | |
| "1 1961 - 1970 ... False\n", | |
| "2 1961 - 1970 ... False\n", | |
| "3 1961 - 1970 ... False\n", | |
| "4 1961 - 1970 ... False\n", | |
| "... ... ... ...\n", | |
| "491427 2011 or later ... True\n", | |
| "491428 2011 or later ... True\n", | |
| "491429 2011 or later ... True\n", | |
| "491430 2011 or later ... True\n", | |
| "491431 2011 or later ... True\n", | |
| "\n", | |
| "[491432 rows x 15 columns]" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 15 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "SvbqhX6uOh03" | |
| }, | |
| "source": [ | |
| "# Estimate Building energy demand using estimated BER Ratings\n", | |
| "\n", | |
| "1. Estimate unknown floor areas by using the `CountyName` (i.e. Postcode) average floor area for each `dwelling_type`\n", | |
| "\n", | |
| "2. Estimate all BER Ratings by linking `period_built` to likely corresponding ratings<sup>1</sup>\n", | |
| "\n", | |
| "3. Infer BER Ratings by filling unknown BER Ratings with estimated BER Ratings.\n", | |
| "\n", | |
| "4. Link BER Rating to a corresponding `energy_kwh_per_m2_year`\n", | |
| "\n", | |
| "5. Estimate annual heat demand by multiplying `energy_kwh_per_m2_year` by `estimated_floor_area` and `boiler_efficiency`<sup>2</sup>\n", | |
| "\n", | |
| "<br>\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "<sup>1</sup> Corresponds to a Linear Regression estimating `BERBand` using `period_built` with the exception of Linear Regression estimating buildings built prior to 1960 are as D whereas here as E is guessed - to reflect the bias of the BER stock against older buildings being sampled. Linear Regression correctly predicts 85% of buildings within ± 1 BER band (i.e. a B rating is guessed A, B or C). In essence older buildings have worse ratings\n", | |
| "\n", | |
| "<sup>2</sup> Assumed to be 85% as in the BER Public dataset. This is likely an overestimate as the BER Public boiler efficiencies are based on the [HARP database](https://www.seai.ie/home-energy/building-energy-rating-ber/support-for-ber-assessors/harp-database/harp-database-search/) [accessed on 21/04/2021] which uses manufacturer-specified efficiencies rather than in-use" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "wE5YCeRMO0Cs" | |
| }, | |
| "source": [ | |
| "assumed_typical_boiler_efficiency = 0.85\n", | |
| "dublin_indiv_hh_demands = (\n", | |
| " dublin_indiv_hh.copy()\n", | |
| " .assign(\n", | |
| " category_floor_area=lambda df: df.groupby([\"COUNTYNAME\", \"dwelling_type\"])[\n", | |
| " \"total_floor_area\"\n", | |
| " ]\n", | |
| " .apply(lambda x: x.fillna(x.mean()))\n", | |
| " .round(),\n", | |
| " estimated_floor_area=lambda df: df[\"total_floor_area\"]\n", | |
| " .fillna(df[\"category_floor_area\"]),\n", | |
| " estimated_ber=lambda df: df[\"period_built\"].replace(\n", | |
| " {\n", | |
| " \"before 1919\": \"E\",\n", | |
| " \"1919 - 1945\": \"E\",\n", | |
| " \"1946 - 1960\": \"E\",\n", | |
| " \"1961 - 1970\": \"D\",\n", | |
| " \"1971 - 1980\": \"D\",\n", | |
| " \"1981 - 1990\": \"D\",\n", | |
| " \"1991 - 2000\": \"D\",\n", | |
| " \"2001 - 2005\": \"C\",\n", | |
| " \"2006 - 2010\": \"B\",\n", | |
| " \"2011 or later\": \"A\",\n", | |
| " \"not stated\": \"unknown\",\n", | |
| " }\n", | |
| " ),\n", | |
| " inferred_ber=lambda df: np.where(\n", | |
| " df[\"BERBand\"].isnull(),\n", | |
| " df[\"estimated_ber\"],\n", | |
| " df[\"BERBand\"],\n", | |
| " ),\n", | |
| " energy_kwh_per_m2_year=lambda df: df[\"estimated_ber\"]\n", | |
| " .replace(\n", | |
| " {\n", | |
| " \"A\": 25,\n", | |
| " \"B\": 100,\n", | |
| " \"C\": 175,\n", | |
| " \"D\": 240,\n", | |
| " \"E\": 320,\n", | |
| " \"F\": 380,\n", | |
| " \"G\": 450,\n", | |
| " \"unknown\": 240,\n", | |
| " }\n", | |
| " )\n", | |
| " .astype(np.int32),\n", | |
| " heating_mwh_per_m2_year=lambda df: df[\"energy_kwh_per_m2_year\"]\n", | |
| " * assumed_typical_boiler_efficiency\n", | |
| " * 10 ** -3,\n", | |
| " heating_mwh_per_year=lambda df: df[\"heating_mwh_per_m2_year\"]\n", | |
| " * df[\"estimated_floor_area\"],\n", | |
| " )\n", | |
| " .drop(\n", | |
| " columns=[\n", | |
| " \"total_floor_area\",\n", | |
| " \"category_floor_area\",\n", | |
| " ]\n", | |
| " )\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 513 | |
| }, | |
| "id": "_kMQ-0juPE3d", | |
| "outputId": "9936dd79-ad84-4c23-c6d7-20b961fb840a" | |
| }, | |
| "source": [ | |
| "dublin_indiv_hh_demands" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>period_built</th>\n", | |
| " <th>dwelling_type</th>\n", | |
| " <th>COUNTYNAME</th>\n", | |
| " <th>RoutingKey</th>\n", | |
| " <th>Descriptor</th>\n", | |
| " <th>category_id</th>\n", | |
| " <th>CountyName</th>\n", | |
| " <th>Year_of_Construction</th>\n", | |
| " <th>EnergyRating</th>\n", | |
| " <th>BERBand</th>\n", | |
| " <th>heat_pump_ready</th>\n", | |
| " <th>_merge</th>\n", | |
| " <th>heat_pump_readiness_estimated_on_period_built</th>\n", | |
| " <th>inferred_heat_pump_readiness</th>\n", | |
| " <th>estimated_floor_area</th>\n", | |
| " <th>estimated_ber</th>\n", | |
| " <th>inferred_ber</th>\n", | |
| " <th>energy_kwh_per_m2_year</th>\n", | |
| " <th>heating_mwh_per_m2_year</th>\n", | |
| " <th>heating_mwh_per_year</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>before 1919</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>1900.0</td>\n", | |
| " <td>E1</td>\n", | |
| " <td>E</td>\n", | |
| " <td>False</td>\n", | |
| " <td>both</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " <td>143.10</td>\n", | |
| " <td>E</td>\n", | |
| " <td>E</td>\n", | |
| " <td>320</td>\n", | |
| " <td>0.27200</td>\n", | |
| " <td>38.923200</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>1</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " <td>95.00</td>\n", | |
| " <td>D</td>\n", | |
| " <td>D</td>\n", | |
| " <td>240</td>\n", | |
| " <td>0.20400</td>\n", | |
| " <td>19.380000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>2</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " <td>95.00</td>\n", | |
| " <td>D</td>\n", | |
| " <td>D</td>\n", | |
| " <td>240</td>\n", | |
| " <td>0.20400</td>\n", | |
| " <td>19.380000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>3</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " <td>95.00</td>\n", | |
| " <td>D</td>\n", | |
| " <td>D</td>\n", | |
| " <td>240</td>\n", | |
| " <td>0.20400</td>\n", | |
| " <td>19.380000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>1961 - 1970</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>Dublin 10</td>\n", | |
| " <td>D10</td>\n", | |
| " <td>DUBLIN 10</td>\n", | |
| " <td>4</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>left_only</td>\n", | |
| " <td>False</td>\n", | |
| " <td>False</td>\n", | |
| " <td>95.00</td>\n", | |
| " <td>D</td>\n", | |
| " <td>D</td>\n", | |
| " <td>240</td>\n", | |
| " <td>0.20400</td>\n", | |
| " <td>19.380000</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", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491427</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>253</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " <td>97.50</td>\n", | |
| " <td>A</td>\n", | |
| " <td>A</td>\n", | |
| " <td>25</td>\n", | |
| " <td>0.02125</td>\n", | |
| " <td>2.071875</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491428</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Mid-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>254</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " <td>81.00</td>\n", | |
| " <td>A</td>\n", | |
| " <td>A</td>\n", | |
| " <td>25</td>\n", | |
| " <td>0.02125</td>\n", | |
| " <td>1.721250</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491429</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Top-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>134</td>\n", | |
| " <td>Dublin 11</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " <td>81.00</td>\n", | |
| " <td>A</td>\n", | |
| " <td>A</td>\n", | |
| " <td>25</td>\n", | |
| " <td>0.02125</td>\n", | |
| " <td>1.721250</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491430</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Detached house</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>1698</td>\n", | |
| " <td>Co. Dublin</td>\n", | |
| " <td>2021.0</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " <td>213.06</td>\n", | |
| " <td>A</td>\n", | |
| " <td>A</td>\n", | |
| " <td>25</td>\n", | |
| " <td>0.02125</td>\n", | |
| " <td>4.527525</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>491431</th>\n", | |
| " <td>2011 or later</td>\n", | |
| " <td>Ground-floor apartment</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>810</td>\n", | |
| " <td>Co. Dublin</td>\n", | |
| " <td>2020.0</td>\n", | |
| " <td>A2</td>\n", | |
| " <td>A</td>\n", | |
| " <td>True</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>True</td>\n", | |
| " <td>True</td>\n", | |
| " <td>77.35</td>\n", | |
| " <td>A</td>\n", | |
| " <td>A</td>\n", | |
| " <td>25</td>\n", | |
| " <td>0.02125</td>\n", | |
| " <td>1.643687</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>491432 rows × 20 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " period_built ... heating_mwh_per_year\n", | |
| "0 before 1919 ... 38.923200\n", | |
| "1 1961 - 1970 ... 19.380000\n", | |
| "2 1961 - 1970 ... 19.380000\n", | |
| "3 1961 - 1970 ... 19.380000\n", | |
| "4 1961 - 1970 ... 19.380000\n", | |
| "... ... ... ...\n", | |
| "491427 2011 or later ... 2.071875\n", | |
| "491428 2011 or later ... 1.721250\n", | |
| "491429 2011 or later ... 1.721250\n", | |
| "491430 2011 or later ... 4.527525\n", | |
| "491431 2011 or later ... 1.643687\n", | |
| "\n", | |
| "[491432 rows x 20 columns]" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 17 | |
| } | |
| ] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment