diff --git a/.coveragerc b/.coveragerc index a220497a..62a3ede8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,12 +2,8 @@ omit = *__init__* */tests/* - model_data/temp_inputs.py - model_data/config.py - model_data/__init__.py - model_data/app.py - model_data/plotting/* recommendations/rdsap_tables.py - model_data/simulation_system/* - model_data/cleaner_app.py + */config.py + */app.py + */settings.py backend/app/* \ No newline at end of file diff --git a/.github/workflows/deploy_sap_model_lambda.yml b/.github/workflows/deploy_sap_model_lambda.yml deleted file mode 100644 index fb4b8dde..00000000 --- a/.github/workflows/deploy_sap_model_lambda.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Sap Model Deploy - -on: - push: - branches: [ dev, prod ] - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.10.12 - - - name: Install Serverless and plugins - run: | - npm install -g serverless - npm install -g serverless-domain-manager - - - name: AWS credentials for dev - if: github.ref == 'refs/heads/dev' - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.DEV_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.DEV_AWS_SECRET_ACCESS_KEY }} - aws-region: eu-west-2 - - - name: AWS credentials for prod - if: github.ref == 'refs/heads/prod' - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.PROD_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.PROD_AWS_SECRET_ACCESS_KEY }} - aws-region: eu-west-2 - - - name: Set domain name - id: set_domain - run: echo "::set-output name=domain::${{ secrets[format('{0}_DOMAIN_NAME', github.ref_name)] }}" - - - name: Set ECR credentials - id: set_ecr_credentials - run: | - echo "::set-output name=ecr_uri::${{ secrets[format('{0}_SAP_MODEL_ECR_URI', github.ref_name)] }}" - - - name: Setup Docker - uses: docker/setup-buildx-action@v1 - - - name: Login to ECR - run: | - aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin ${{ steps.set_ecr_credentials.outputs.ecr_uri }} - - # Building and pushing Docker image with caching - - name: Build and push Docker image - uses: docker/build-push-action@v3 - with: - context: ./model_data/simulation_system - file: ./model_data/simulation_system/Dockerfiles/Dockerfile.prediction.lambda - push: true - tags: ${{ steps.set_ecr_credentials.outputs.ecr_uri }}:${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - platform: linux/amd64 - provenance: false - - - name: Deploy to AWS Lambda via Serverless - env: - RUNTIME_ENVIRONMENT: ${{ github.ref_name }} - MODEL_DIRECTORY_BUCKET: 'retrofit-model-directory-${{ github.ref_name }}' - PREDICTIONS_BUCKET: 'retrofit-sap-predictions-${{ github.ref_name }}' - DATA_BUCKET: 'retrofit-data-${{ github.ref_name }}' - DOMAIN_NAME: ${{ steps.set_domain.outputs.domain }} - ECR_URI: ${{ steps.set_ecr_credentials.outputs.ecr_uri }} - GITHUB_SHA: ${{ github.sha }} - run: | - # Deploy to AWS Lambda via Serverless - sls deploy --config sapmodel.serverless.yml --stage ${{ github.ref_name }} --verbose diff --git a/.gitignore b/.gitignore index 98db3e9a..6a580686 100644 --- a/.gitignore +++ b/.gitignore @@ -239,7 +239,8 @@ fabric.properties .idea/caches/build_file_checksums.ser # Locally stored data -/model_data/local_data/* +local_data/* +/local_data/* *.DS_Store infrastructure/terraform/.terraform* @@ -261,3 +262,6 @@ model_data/simulation_system/predictions/ .idea/Model.iml .idea/misc.iml + +adhoc +adhoc/* \ No newline at end of file diff --git a/.idea/Model.iml b/.idea/Model.iml index b03b31b1..4413bb06 100644 --- a/.idea/Model.iml +++ b/.idea/Model.iml @@ -7,7 +7,14 @@ - + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index ca0e1cd9..3b05c6ac 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/model_data/BaseUtility.py b/BaseUtility.py similarity index 97% rename from model_data/BaseUtility.py rename to BaseUtility.py index beece742..bd2f091e 100644 --- a/model_data/BaseUtility.py +++ b/BaseUtility.py @@ -43,7 +43,9 @@ class Definitions: # contained within the first of these multiple entries is being provided. As there are no restrictions on the # value in this first field it means that sometimes the first field in a multiple entry description field may # contain a ‘null’ value. A resolution to correct these anomalies will be considered for future data releases. - "NULL" + "NULL", + # We sometimes see fields populated with just an empty string. + "" } DATA_ANOMALY_SUBSTRINGS = { diff --git a/backend/Property.py b/backend/Property.py index 2358cbc2..2a201b97 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -1,9 +1,22 @@ from datetime import datetime import re +import os +import pandas as pd + +from etl.epc.DataProcessor import DataProcessor +from etl.epc_clean.epc_attributes.all_cleaners import all_cleaner_map +from utils.logger import setup_logger +from utils.s3 import read_dataframe_from_s3_parquet from epc_api.client import EpcClient -from model_data.config import EPC_AUTH_TOKEN -from model_data.BaseUtility import Definitions +from BaseUtility import Definitions from recommendations.rdsap_tables import england_wales_age_band_lookup +from recommendations.recommendation_utils import estimate_floors, estimate_perimeter, get_wall_type, estimate_wall_area + +ENVIRONMENT = os.environ.get('ENVIRONMENT', 'dev') +EPC_AUTH_TOKEN = os.environ.get('EPC_AUTH_TOKEN') +DATA_BUCKET = os.environ.get('DATA_BUCKET', 'retrofit-data-dev' if ENVIRONMENT == 'dev' else None) + +logger = setup_logger() class Property(Definitions): @@ -30,17 +43,27 @@ class Property(Definitions): lighting = None coordinates = None - age_band = None def __init__(self, id, postcode, address1, epc_client=None, data=None): self.id = id self.postcode = postcode self.address1 = address1 self.data = data + self.old_data = None + self.property_dimensions = None + + self.uprn = None self.full_sap_epc = None - self.in_conservation_area = None + self.in_conservation_area, self.is_listed, self.is_heritage = None, None, None + self.restricted_measures = False self.year_built = None self.number_of_rooms = None + self.age_band = None + self.construction_age_band = None + self.number_of_floors = None + self.perimeter = None + self.wall_type = None + self.floor_type = None self.energy = None self.ventilation = None @@ -83,9 +106,14 @@ class Property(Definitions): ] if len(newest_response) > 1: raise Exception("More than one result found for this address - investigate me") + + # We'll keep old EPCs in case it contains information, not present on the newest one + self.old_data = [epc for epc in response["rows"] if epc["lmk-key"] != newest_response[0]["lmk-key"]] + response["rows"] = newest_response self.data = response["rows"][0] + self.uprn = int(self.data["uprn"]) def set_coordinates(self, coordinates): """ @@ -127,7 +155,7 @@ class Property(Definitions): """ ventilation = self.data["mechanical-ventilation"] - # perform some simple cleaning - when checking 300k properties, the only unique values were + # perform some simple cleaning - when checking 300k epc, the only unique values were # {'', 'mechanical, supply and extract', 'NO DATA!', 'natural', 'mechanical, extract only'} if ventilation in self.DATA_ANOMALY_MATCHES or ventilation in [""]: ventilation = None @@ -145,7 +173,7 @@ class Property(Definitions): - solar_pv This is based on the "photo-supply" field in the EPC data. - When checking 100k properties, either the value was "" or a stringified number + When checking 100k epc, either the value was "" or a stringified number """ solar_pv = self.data["photo-supply"] @@ -244,11 +272,10 @@ class Property(Definitions): self.set_count_variables() self.set_heat_loss_corridor() self.set_mains_gas() - self.set_floor_height() - self.set_wall_area() - self.set_floor_area() self.set_age_band() + self.set_basic_property_dimensions() + for description, attribute in cleaned.items(): if self.data[description] in self.DATA_ANOMALY_MATCHES: @@ -262,10 +289,19 @@ class Property(Definitions): attributes = [ x for x in cleaned[description] if x["original_description"] == self.data[description] ] - if len(attributes) != 1: + if len(attributes) > 1: raise ValueError("Either No attributes or multiple found for %s" % description) + + if len(attributes) == 0: + # We attempt to perform the clean on the fly + cleaner_cls = all_cleaner_map[description] + attributes = [cleaner_cls(self.data[description]).process()] + setattr(self, self.ATTRIBUTE_MAP[description], attributes[0]) + self.set_wall_type() + self.set_floor_type() + def set_age_band(self): """ Sets a cleaned version of the age band of the property given the EPC data @@ -275,14 +311,20 @@ class Property(Definitions): if not self.data: raise ValueError("Property does not contain data") - self.age_band = england_wales_age_band_lookup[self.data["construction-age-band"]] + self.construction_age_band = DataProcessor.clean_construction_age_band(self.data["construction-age-band"]) + self.age_band = england_wales_age_band_lookup.get(self.construction_age_band) - def set_is_in_conservation_area(self, in_conservation_area): + def set_spatial(self, spatial: pd.DataFrame): """ Sets whether the property is in a conservation area given the output of the ConservationAreaClient - :param in_conservation_area: string value, indicating whether the property is in a conservation area + :param spatial: Dataframe, containing the spatial data for the property """ - self.in_conservation_area = in_conservation_area + self.in_conservation_area = spatial["conservation_status"].values[0] + self.is_listed = spatial["is_listed_building"].values[0] + self.is_heritage = spatial["is_heritage_building"].values[0] + + if self.in_conservation_area is True | self.is_listed is True | self.is_heritage is True: + self.restricted_measures = True def set_year_built(self): """ @@ -349,17 +391,6 @@ class Property(Definitions): else: self.mains_gas = map[self.data["mains-gas-flag"]] - def set_floor_height(self): - """ - Sets the floor height of the property - :return: - """ - - if self.data["floor-height"] == "" or self.data["floor-height"] in self.DATA_ANOMALY_MATCHES: - self.floor_height = None - else: - self.floor_height = float(self.data["floor-height"]) - def _clean_upload_data(self, to_update): for k, v in to_update.items(): if v in self.DATA_ANOMALY_MATCHES: @@ -443,21 +474,210 @@ class Property(Definitions): return property_details_epc - def set_wall_area(self): - """ - This method is placeholder - It implements our floor area model to produce an estimate of the property's insulatable wall area - """ - - import random - self.insulation_wall_area = random.uniform(60, 100) - - def set_floor_area(self): - """ - Sets the floor area based on the EPC data + def get_spatial_data(self, uprn_filenames): """ - # We don't know the number of floors at the moment so we're going to assume 1 - # however this is something we'll need to use Verisk data for + Given a property's UPRN, this method will pull the associated spatial data from s3 + :return: + """ + + if self.uprn is None: + raise ValueError("URPN is not set, run search_address_epc") + + # We get the file name for the uprn + filtered_df = uprn_filenames[(uprn_filenames['lower'] <= self.uprn) & (uprn_filenames['upper'] >= self.uprn)] + if filtered_df.empty: + logger.warning("Could not find file containing UPRNS") + return None + + filename = filtered_df.iloc[0]['filenames'] + + spatial_data = read_dataframe_from_s3_parquet( + bucket_name=DATA_BUCKET, file_key=f"spatial/{filename}" + ) + + spatial = spatial_data[spatial_data["UPRN"] == self.uprn] + + # Pull out spatial features + self.set_spatial(spatial) + + def _filter_property_dimensions(self, property_dimensions): + """ + Will filter the property dimensions dataframe to only include the relevant rows for the property + :param property_dimensions: + :return: filtered property dimensions dataframe + """ + + result = property_dimensions[(property_dimensions["PROPERTY_TYPE"] == self.data["property-type"])] + + if self.construction_age_band is not None and self.construction_age_band not in self.DATA_ANOMALY_MATCHES: + result = result[(result["CONSTRUCTION_AGE_BAND"] == self.construction_age_band)] + + if self.data["built-form"] not in self.DATA_ANOMALY_MATCHES and self.data["built-form"] in result["BUILT_FORM"]: + result = result[(result["BUILT_FORM"] == self.data["built-form"])] + + return result[["NUMBER_HABITABLE_ROOMS", "TOTAL_FLOOR_AREA", "FLOOR_HEIGHT"]].mean() + + def set_basic_property_dimensions(self): + """ + This method sets the number of floors of the property, using a simple approach based on an estimate for + average room size, number of rooms and total floor area + + It sets the perimeter of the property, using a simple approach based on an estimate for average room size, + number of rooms and total floor area + + Also sets floor area, number of rooms, using backup cleaned values if this data is not present, based on + medians across the EPC data + :return: + """ self.floor_area = float(self.data["total-floor-area"]) + + if not self.data["number-habitable-rooms"] or ( + self.data["floor-height"] == "" or self.data["floor-height"] in self.DATA_ANOMALY_MATCHES + ): + if self.property_dimensions is None: + property_dimensions = read_dataframe_from_s3_parquet( + bucket_name=DATA_BUCKET, file_key=f"property_dimensions/{self.data['local-authority']}.parquet" + ) + self.property_dimensions = self._filter_property_dimensions(property_dimensions) + + if not self.data["number-habitable-rooms"]: + self.number_of_rooms = float(self.property_dimensions["NUMBER_HABITABLE_ROOMS"].round()) + else: + self.number_of_rooms = float(self.data["number-habitable-rooms"]) + + if self.data["property-type"] == "House": + self.number_of_floors = estimate_floors(self.floor_area, self.number_of_rooms) + elif self.data["property-type"] == "Flat": + self.number_of_floors = 1 + else: + raise NotImplementedError("Implement me") + + if self.data["floor-height"] == "" or self.data["floor-height"] in self.DATA_ANOMALY_MATCHES: + self.floor_height = float(self.property_dimensions["FLOOR_HEIGHT"].round(2)) + else: + self.floor_height = float(self.data["floor-height"]) + + self.perimeter = estimate_perimeter( + self.floor_area / self.number_of_floors, self.number_of_rooms / self.number_of_floors + ) + + self.insulation_wall_area = estimate_wall_area( + num_floors=self.number_of_floors, floor_height=self.floor_height, perimeter=self.perimeter + ) + + def set_wall_type(self): + """ + This method sets the wall type of the property, using a simple approach based on the wall description + :return: + """ + self.wall_type = get_wall_type(**self.walls) + + def set_floor_type(self): + """ + This method sets the floor type of the property, which is used for calculating u-values + :return: + """ + self.floor_type = "suspended" if self.floor["is_suspended"] else "solid" + + @staticmethod + def _extract_component(component_data, component_rename_cols, component_drop_cols, rename_prefix=None): + for k in component_rename_cols: + component_data[f"{rename_prefix}_{k}"] = component_data[k] + + component_data = { + k: v for k, v in component_data.items() if k not in component_drop_cols + component_rename_cols + } + + return component_data + + def get_model_data(self): + """ + This method extracts cleaned data from the property object, which is used in our machine learning models + + This will use many of the cleaned properties, extracted from the epc data, or methods in DataProcessor. + + For future iterations of this, we probably want to implement a singular method in DataProcessor, which can + be used in the etl code and in here + + :return: dictionary of model data to be scored in the model + """ + + drop_cols = ["original_description", "clean_description"] + insulation_drop_cols = ["thermal_transmittance_unit", "is_assumed", "is_valid"] + insulation_rename_cols = ["thermal_transmittance", "insulation_thickness"] + + walls = self._extract_component(self.walls, insulation_rename_cols, insulation_drop_cols + drop_cols, "walls") + roof = self._extract_component(self.roof, insulation_rename_cols, insulation_drop_cols + drop_cols, "roof") + floor = self._extract_component(self.floor, insulation_rename_cols, insulation_drop_cols + drop_cols, "floor") + + windows = self._extract_component(self.windows, [], drop_cols + ["no_data"]) + fuel = self._extract_component(self.main_fuel, ["tariff_type"], drop_cols + ["tariff_type"], "main-fuel") + main_heating = self._extract_component(self.main_heating, [], drop_cols + ["has_assumed"]) + main_heating_controls = self._extract_component(self.main_heating_controls, [], drop_cols) + hotwater = self._extract_component(self.hotwater, ["tariff_type"], drop_cols + ['assumed'], "hotwater") + + # We'll need to clean second heating + second_heating = self.data["secondheat-description"] + + epc_raw_columns = [ + 'TRANSACTION_TYPE', + 'ENERGY_TARIFF', + 'PROPERTY_TYPE', + 'UPRN', + 'NUMBER_OPEN_FIREPLACES', + 'FIXED_LIGHTING_OUTLETS_COUNT', + 'MULTI_GLAZE_PROPORTION', + 'MECHANICAL_VENTILATION', + 'PHOTO_SUPPLY', + 'LOW_ENERGY_LIGHTING', + 'SOLAR_WATER_HEATING_FLAG', + 'GLAZED_TYPE', + 'CONSTITUENCY', + 'NUMBER_HEATED_ROOMS', + 'EXTENSION_COUNT', + ] + epc_raw_data = { + k: self.data[k.lower().replace("_", "-")] for k in epc_raw_columns + } + + built_form_cleaning_map = { + "Flat": "Mid-Terrace", + "House": "Semi-Detached", + "Bungalow": "Detached", + "Maisonette": "Mid-Terrace" + } + + built_form = self.data["built-form"] + if built_form in self.DATA_ANOMALY_MATCHES: + # TODO: If built form isn't captured, we use the most common value for that property type - we shall + # improve this methodology + built_form = built_form_cleaning_map.get(self.data["property-type"]) + if not built_form: + raise NotImplementedError("Not handled this property type when cleaning built form") + + property_data = { + **walls, + **roof, + **floor, + **fuel, + **main_heating, + **main_heating_controls, + **hotwater, + **windows, + "SECONDHEAT_DESCRIPTION": second_heating, + "DAYS_TO": DataProcessor.calculate_days_to(self.data["lodgement-date"]), + "SAP": float(self.data["current-energy-efficiency"]), + "CARBON": float(self.data["co2-emissions-current"]), + "HEAT_DEMAND": float(self.data["energy-consumption-current"]), + "estimated_perimeter": self.perimeter, + "CONSTRUCTION_AGE_BAND": self.construction_age_band, + "FLOOR_HEIGHT": self.floor_height, + "NUMBER_HABITABLE_ROOMS": self.number_of_rooms, + "TOTAL_FLOOR_AREA": self.floor_area, + **epc_raw_data, + "BUILT_FORM": built_form, + } + + return property_data diff --git a/backend/app/db/functions/materials_functions.py b/backend/app/db/functions/materials_functions.py index a9995cf4..f3c2f316 100644 --- a/backend/app/db/functions/materials_functions.py +++ b/backend/app/db/functions/materials_functions.py @@ -1,10 +1,17 @@ from backend.app.db.models.materials import Material +from functools import lru_cache +@lru_cache(maxsize=128) def get_materials(session): """ This function will retrieve all materials from the database. :return: A list of Material objects if successful, an empty list otherwise. + + + TODO: It might not be the best choice to store the materials data in a database table since thi + table probably won't be very large and won't be updated that often. It might be better to + store this data in s3 load it into memory when the app starts up. We will test this """ materials = session.query(Material).filter(Material.is_active).all() diff --git a/backend/app/db/models/materials.py b/backend/app/db/models/materials.py index 00430b1c..09d7369d 100644 --- a/backend/app/db/models/materials.py +++ b/backend/app/db/models/materials.py @@ -12,6 +12,7 @@ class MaterialType(enum.Enum): solid_floor_insulation = "solid_floor_insulation" external_wall_insulation = "external_wall_insulation" internal_wall_insulation = "internal_wall_insulation" + cavity_wall_insulation = "cavity_wall_insulation" class DepthUnit(enum.Enum): diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index a8ad04a7..50801b64 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -1,50 +1,41 @@ -from collections import defaultdict -from fastapi import APIRouter, Depends -from backend.app.db.models.portfolio import rating_lookup -from backend.app.dependencies import validate_token -from backend.app.plan.schemas import PlanTriggerRequest -from backend.app.utils import read_csv_from_s3 -from backend.app.config import get_settings -from backend.Property import Property -from epc_api.client import EpcClient -from utils.logger import setup_logger -from utils.s3 import read_from_s3 -from recommendations.FloorRecommendations import FloorRecommendations -from recommendations.WallRecommendations import WallRecommendations -from recommendations.config import UPGRADES_MAP -from utils.uvalue_estimates import classify_decile_newvalues -from backend.app.db.utils import row2dict -from starlette.responses import Response -from sqlalchemy.orm import sessionmaker -from sqlalchemy.exc import IntegrityError, OperationalError from datetime import datetime + import pandas as pd -import msgpack +from epc_api.client import EpcClient +from fastapi import APIRouter, Depends +from sqlalchemy.exc import IntegrityError, OperationalError +from sqlalchemy.orm import sessionmaker +from starlette.responses import Response -# model apis -from backend.ml_models.sap_change_model.api import SAPChangeModelAPI - -# database interaction functions -from backend.app.db.functions.property_functions import ( - create_property, create_property_targets, update_property_data, create_property_details_epc -) +from backend.app.config import get_settings +from backend.app.db.connection import db_engine from backend.app.db.functions.materials_functions import get_materials +from backend.app.db.functions.portfolio_functions import aggregate_portfolio_recommendations +from backend.app.db.functions.property_functions import ( + create_property, create_property_details_epc, create_property_targets, update_property_data +) from backend.app.db.functions.recommendations_functions import ( create_plan, create_plan_recommendations, upload_recommendations ) -from backend.app.db.functions.portfolio_functions import aggregate_portfolio_recommendations -from backend.app.db.connection import db_engine +from backend.app.db.models.portfolio import rating_lookup +from backend.app.dependencies import validate_token +from backend.app.plan.schemas import PlanTriggerRequest +from backend.app.plan.utils import ( + create_recommendation_scoring_data, filter_materials, get_cleaned, insert_temp_recommendation_id +) +from backend.app.utils import epc_to_sap_lower_bound, read_csv_from_s3, read_parquet_from_s3 -from model_data.optimiser.GainOptimiser import GainOptimiser -from model_data.optimiser.CostOptimiser import CostOptimiser -from backend.app.utils import epc_to_sap_lower_bound, read_parquet_from_s3 -from model_data.optimiser.optimiser_functions import prepare_input_measures -from model_data.simulation_system.core.DataProcessor import DataProcessor -from model_data.simulation_system.core.Settings import COLUMNS_TO_MERGE_ON - -# TODO: This is placeholder until data is stored in DB -from backend.app.plan.uvalue_estimates_walls import uvalue_estimates_walls -from backend.app.plan.uvalue_estimates_floors import uvalue_estimates_floors +from backend.ml_models.sap_change_model.api import SAPChangeModelAPI +from backend.Property import Property +from etl.epc.DataProcessor import DataProcessor +from etl.epc.settings import COLUMNS_TO_MERGE_ON +from recommendations.FloorRecommendations import FloorRecommendations +from recommendations.optimiser.CostOptimiser import CostOptimiser +from recommendations.optimiser.GainOptimiser import GainOptimiser +from recommendations.optimiser.optimiser_functions import prepare_input_measures +from recommendations.WallRecommendations import WallRecommendations +from utils.logger import setup_logger +from utils.s3 import read_dataframe_from_s3_parquet logger = setup_logger() @@ -55,147 +46,25 @@ router = APIRouter( responses={404: {"description": "Not found"}} ) -# TODO: Load this data from db -open_uprn_data = [ - {'UPRN': 6032920, 'X_COORDINATE': 535110.0, 'Y_COORDINATE': 181819.0, 'LATITUDE': 51.5191407, - 'LONGITUDE': -0.0540506}, - {'UPRN': 6038625, 'X_COORDINATE': 535374.0, 'Y_COORDINATE': 182784.0, 'LATITUDE': 51.5277492, - 'LONGITUDE': -0.0498772}, - {'UPRN': 34153991, 'X_COORDINATE': 523238.74, 'Y_COORDINATE': 178003.02, 'LATITUDE': 51.4875579, - 'LONGITUDE': -0.226392}, - {'UPRN': 10008299676, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629, - 'LONGITUDE': -0.0792445}, - {'UPRN': 10008299677, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629, - 'LONGITUDE': -0.0792445}, - {'UPRN': 100021039066, 'X_COORDINATE': 535506.0, 'Y_COORDINATE': 185624.0, 'LATITUDE': 51.5532385, - 'LONGITUDE': -0.0468833}, - {'UPRN': 100021226060, 'X_COORDINATE': 529247.0, 'Y_COORDINATE': 187959.0, 'LATITUDE': 51.5756908, - 'LONGITUDE': -0.1362513}, - {'UPRN': 200003489276, 'X_COORDINATE': 533210.0, 'Y_COORDINATE': 179442.0, 'LATITUDE': 51.4982309, - 'LONGITUDE': -0.0823165} -] - -in_conservation_area_data = [ - {'uprn': 6032920, 'is_in_conservation_area': 'not_in_conservation_area'}, - {'uprn': 6038625, 'is_in_conservation_area': 'not_in_conservation_area'}, - {'uprn': 34153991, 'is_in_conservation_area': 'unknown'}, - {'uprn': 10008299676, 'is_in_conservation_area': 'in_conservation_area'}, - {'uprn': 10008299677, 'is_in_conservation_area': 'in_conservation_area'}, - {'uprn': 100021039066, 'is_in_conservation_area': 'not_in_conservation_area'}, - {'uprn': 100021226060, 'is_in_conservation_area': 'in_conservation_area'}, - {'uprn': 200003489276, 'is_in_conservation_area': 'in_conservation_area'} -] - -# TODO: db -floors_decile_data = { - 'decile_labels': ['Decile 1', 'Decile 2', 'Decile 3', 'Decile 4', 'Decile 5', 'Decile 6', 'Decile 7', 'Decile 8', - 'Decile 9', 'Decile 10'], 'decile_boundaries': [6., 50., 56., 69., 77.6, 87., 98., 112., - 127., 150., 2279.]} - -walls_decile_data = { - 'decile_labels': ['Decile 1', 'Decile 2', 'Decile 3', 'Decile 4', 'Decile 5', 'Decile 6', 'Decile 7', 'Decile 8', - 'Decile 9', 'Decile 10'], 'decile_boundaries': [6., 49., 51., 55., 64., 71., 76., 83., 96., - 120., 2279.]} - - -def filter_materials(materials): - materials_by_type = defaultdict(list) - - for material in materials: - material = row2dict(material) - material_type = material["type"] - materials_by_type[material_type].append(material) - - # Optionally, you can convert the defaultdict to a normal dict if desired - materials_by_type = dict(materials_by_type) - - return materials_by_type - - -def insert_temp_recommendation_id(property_recommendations): - """ - Creates a temporary recommendation id which is needed for - filtering recommendations between default and no, after the optimiser has been - run - :param property_recommendations: nested list of recommendations, grouped by data_types - :return: Updated recommendations_to_upload, where where recommendation has a "recommendation_id" - integer inserted - """ - idx = 0 - - for recs in property_recommendations: - for rec in recs: - rec["recommendation_id"] = idx - idx += 1 - - return property_recommendations - - -def get_cleaned(): - """ - This function will retrieve the cleaned dataset from s3 which has the cleaned - descriptions for the epc dataset - - This data is stored in MessagePack format and therefore needs to be decoded - :return: - """ - - cleaned = read_from_s3( - s3_file_name="cleaned_epc_data/cleaned.bson", - bucket_name="retrofit-data-{environment}".format(environment=get_settings().ENVIRONMENT) - ) - - cleaned = msgpack.unpackb(cleaned, raw=False) - - return cleaned - - -def create_recommendation_scoring_data( - property: Property, - recommendation: dict, - starting_epc_data: pd.DataFrame, - ending_epc_data: pd.DataFrame, - fixed_data: pd.DataFrame, -): - """ - This wrapper function prepares data to be passed to the sap model api - :return: - """ - - scoring_dict = { - "UPRN": property.data["uprn"], - "id": "+".join([str(property.id), str(recommendation["recommendation_id"])]), - "LOCAL_AUTHORITY": property.data["local-authority"], - **starting_epc_data.to_dict("records")[0], - **ending_epc_data.to_dict("records")[0], - **fixed_data.to_dict("records")[0] - } - - # We update the description to indicate it's insulated - if recommendation["type"] == "wall_insulation": - scoring_dict["WALLS_DESCRIPTION_ENDING"] = UPGRADES_MAP[property.walls["clean_description"]] - elif recommendation["type"] == "floor_insulation": - scoring_dict["FLOOR_DESCRIPTION_ENDING"] = UPGRADES_MAP[property.floor["clean_description"]] - else: - raise NotImplementedError("Implement me") - - return scoring_dict - @router.post("/trigger") async def trigger_plan(body: PlanTriggerRequest): logger.info("Connecting to db") session = sessionmaker(bind=db_engine)() - created_at = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + created_at = datetime.now().isoformat() try: session.begin() logger.info("Getting the inputs") - # Read in the trigger file from s3 - bucket_name = get_settings().PLAN_TRIGGER_BUCKET epc_client = EpcClient(auth_token=get_settings().EPC_AUTH_TOKEN) + plan_input = read_csv_from_s3(bucket_name=get_settings().PLAN_TRIGGER_BUCKET, filepath=body.trigger_file_path) + uprn_filenames = read_dataframe_from_s3_parquet( + bucket_name=get_settings().DATA_BUCKET, file_key="spatial/filename_meta.parquet" + ) + cleaning_data = read_parquet_from_s3( + bucket_name=get_settings().DATA_BUCKET, file_key="sap_change_model/cleaning_dataset.parquet", + ) - plan_input = read_csv_from_s3(bucket_name=bucket_name, filepath=body.trigger_file_path) input_properties = [] for config in plan_input: # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly @@ -228,32 +97,21 @@ async def trigger_plan(body: PlanTriggerRequest): if not input_properties: return Response(status_code=204) - logger.info("Getting EPC, coordinates and conservation area data") + logger.info("Getting EPC, and spatial data") for p in input_properties: p.search_address_epc() p.set_year_built() - - coordinate_data = [x for x in open_uprn_data if x['UPRN'] == int(p.data['uprn'])][0] - p.set_coordinates(coordinate_data) - - in_conservation_area = [x for x in in_conservation_area_data if x['uprn'] == int(p.data['uprn'])][0].get( - "is_in_conservation_area" - ) - p.set_is_in_conservation_area(in_conservation_area) + p.get_spatial_data(uprn_filenames) # The materials data could be cached or local so we don't need to make # consistent requests to the backend for # the same data - # TODO: It might not be the best choice to store the materials data in a database table since thi - # table probably won't be very large and won't be updated that often. It might be better to - # store this data in s3 load it into memory when the app starts up. We will test this - logger.info("Reading in materials and cleaned datasets") materials = get_materials(session) materials_by_type = filter_materials(materials) cleaned = get_cleaned() - logger.info("Getting components and properties recommendations") + logger.info("Getting components and epc recommendations") # TODO: Move this to a class. We probably want a Recommender class which takes the injects the optimisers # in as a dependency and then the optimisers can take the input measures in as part of the setup() method @@ -263,34 +121,13 @@ async def trigger_plan(body: PlanTriggerRequest): for p in input_properties: property_recommendations = [] - # For each property, classiy floor area decide - total_floor_area_group_decile = classify_decile_newvalues( - decile_boundaries=floors_decile_data["decile_boundaries"], - decile_labels=floors_decile_data["decile_labels"], - new_values=[float(p.data["total-floor-area"])], - )[0] - # Property recommendations p.get_components(cleaned) - # This is placeholder, until the full dataset is loaded into the database and we just make a read to the - # database - floors_u_value_estimate = [ - x for x in uvalue_estimates_floors - if (x['local-authority'] == p.data["local-authority"]) & - (x['property-type'] == p.data["property-type"]) & - (x['built-form'] == p.data["built-form"]) & - (x['floor-energy-eff'] == p.data["floor-energy-eff"] if p.data[ - "floor-energy-eff"] != 'N/A' else True) & - (x['floor-env-eff'] == p.data["floor-env-eff"] if p.data["floor-env-eff"] != 'N/A' else True) - ] - # Floor recommendations floor_recommender = FloorRecommendations( property_instance=p, - uvalue_estimates=floors_u_value_estimate, - total_floor_area_group_decile=total_floor_area_group_decile, - materials=materials_by_type["suspended_floor_insulation"] + materials_by_type["solid_floor_insulation"], + materials=materials_by_type["floor"], ) floor_recommender.recommend() @@ -298,30 +135,10 @@ async def trigger_plan(body: PlanTriggerRequest): property_recommendations.append(floor_recommender.recommendations) # Wall recommendations - # We would make this u-value query directly to the database - total_floor_area_group_decile = classify_decile_newvalues( - decile_boundaries=walls_decile_data["decile_boundaries"], - decile_labels=walls_decile_data["decile_labels"], - new_values=[float(p.data["total-floor-area"])], - )[0] - - # This is placeholder, until the full dataset is loaded into the database and we just make a read to the - # database - walls_u_value_estimate = [ - x for x in uvalue_estimates_walls - if (x['local-authority'] == p.data["local-authority"]) & - (x['property-type'] == p.data["property-type"]) & - (x['built-form'] == p.data["built-form"]) & - (x['walls-energy-eff'] == p.data["walls-energy-eff"] if p.data[ - "walls-energy-eff"] != 'N/A' else True) & - (x['walls-env-eff'] == p.data["walls-env-eff"] if p.data["walls-env-eff"] != 'N/A' else True) - ] wall_recomender = WallRecommendations( property_instance=p, - uvalue_estimates=walls_u_value_estimate, - total_floor_area_group_decile=total_floor_area_group_decile, - materials=materials_by_type["external_wall_insulation"] + materials_by_type["internal_wall_insulation"] + materials=materials_by_type["walls"] ) wall_recomender.recommend() @@ -337,12 +154,8 @@ async def trigger_plan(body: PlanTriggerRequest): recommendations[p.id] = property_recommendations # Finally, we'll prepare data for predicting the impact on SAP - # TODO: We should use the cleaned data from get_components in the data rather than the raw - # values. We should create a method in Property which takes the EPC data and inserts the cleaned - # data - data_processor = DataProcessor(None, newdata=True) - data_processor.insert_data(pd.DataFrame([p.data.copy()])) + data_processor.insert_data(pd.DataFrame([p.get_model_data()])) data_processor.pre_process() starting_epc_data = data_processor.get_component_features(suffix="_STARTING") @@ -350,10 +163,10 @@ async def trigger_plan(body: PlanTriggerRequest): fixed_data = data_processor.get_fixed_features() # We update the ending record with the recommended updates and we set lodgement date to today - ending_epc_data["LODGEMENT_DATE_ENDING"] = created_at + ending_epc_data["DAYS_TO_ENDING"] = data_processor.calculate_days_to(created_at) for recommendations_by_type in property_recommendations: - for rec in recommendations_by_type: + for i, rec in enumerate(recommendations_by_type): scoring_dict = create_recommendation_scoring_data( property=p, recommendation=rec, @@ -370,15 +183,6 @@ async def trigger_plan(body: PlanTriggerRequest): logger.info("Preparing data for scoring in sap change api") recommendations_scoring_data = pd.DataFrame(recommendations_scoring_data) - # Clean the data - logger.info("Reading in cleaning dataset from s3") - cleaning_data = read_parquet_from_s3( - bucket_name=get_settings().DATA_BUCKET, - file_key="sap_change_model/cleaning_dataset.parquet", - ).rename(columns={"local-authority": "LOCAL_AUTHORITY"}) - - # Merge the cleaning data onto recommendations_scoring_data - # Perform the same cleaning as in the model recommendations_scoring_data = DataProcessor.apply_averages_cleaning( data_to_clean=recommendations_scoring_data, @@ -386,6 +190,13 @@ async def trigger_plan(body: PlanTriggerRequest): cols_to_merge_on=COLUMNS_TO_MERGE_ON + ["LOCAL_AUTHORITY"] ).drop(columns=["LOCAL_AUTHORITY"]) + recommendations_scoring_data = DataProcessor.clean_missings_after_description_process( + recommendations_scoring_data, [ + c for c in recommendations_scoring_data.columns if + ("thermal_transmittance" in c) or ("insulation_thickness" in c) + ] + ) + sap_change_model_api = SAPChangeModelAPI(portfolio_id=body.portfolio_id, timestamp=created_at) file_location = sap_change_model_api.upload_scoring_data( df=recommendations_scoring_data, bucket=get_settings().DATA_BUCKET @@ -396,14 +207,17 @@ async def trigger_plan(body: PlanTriggerRequest): # Retrieve the predictions predictions = pd.DataFrame( - read_csv_from_s3(bucket_name=get_settings().PREDICTIONS_BUCKET, filepath=response["storage_filepath"]) + read_parquet_from_s3( + bucket_name=get_settings().PREDICTIONS_BUCKET, + file_key=response["storage_filepath"].split(get_settings().PREDICTIONS_BUCKET + "/")[1] + ) ) - predictions["RDSAP_CHANGE"] = predictions["RDSAP_CHANGE"].astype(float).round(1) + predictions["predictions"] = predictions["predictions"].astype(float).round(1) predictions[['property_id', 'recommendation_id']] = predictions['id'].str.split('+', expand=True) # Insert the predictions into the recommendations and run the optimiser - logger.info("Storing recommendations") + logger.info("Optimising recommendations") for property_id in recommendations.keys(): property = [p for p in input_properties if p.id == property_id][0] @@ -411,9 +225,11 @@ async def trigger_plan(body: PlanTriggerRequest): for recommendations_by_type in recommendations[property_id]: for rec in recommendations_by_type: - rec["sap_points"] = property_predictions[property_predictions["recommendation_id"] == str( + new_sap = property_predictions[property_predictions["recommendation_id"] == str( rec["recommendation_id"] - )]["RDSAP_CHANGE"].values[0] + )]["predictions"].values[0] + + rec["sap_points"] = new_sap - float(property.data["current-energy-efficiency"]) if rec["sap_points"] is None: raise ValueError("Sap points missing") @@ -451,8 +267,6 @@ async def trigger_plan(body: PlanTriggerRequest): final_recommendations = [ rec for recommendations_by_type in final_recommendations for rec in recommendations_by_type ] - # We update recommendations[property_id] - recommendations[property_id] = final_recommendations # 1) the property data diff --git a/backend/app/plan/temp_script_for_flight.py b/backend/app/plan/temp_script_for_flight.py new file mode 100644 index 00000000..9170b4c1 --- /dev/null +++ b/backend/app/plan/temp_script_for_flight.py @@ -0,0 +1,176 @@ +from datetime import datetime + +import pandas as pd +from epc_api.client import EpcClient +from fastapi import APIRouter, Depends +from sqlalchemy.exc import IntegrityError, OperationalError +from sqlalchemy.orm import sessionmaker +from starlette.responses import Response + +from backend.app.config import get_settings +from backend.app.db.connection import db_engine +from backend.app.db.functions.materials_functions import get_materials +from backend.app.db.functions.portfolio_functions import aggregate_portfolio_recommendations +from backend.app.db.functions.property_functions import ( + create_property, create_property_details_epc, create_property_targets, update_property_data +) +from backend.app.db.functions.recommendations_functions import ( + create_plan, create_plan_recommendations, upload_recommendations +) +from backend.app.db.models.portfolio import rating_lookup +from backend.app.dependencies import validate_token +from backend.app.plan.schemas import PlanTriggerRequest +from backend.app.plan.utils import ( + create_recommendation_scoring_data, filter_materials, get_cleaned, insert_temp_recommendation_id +) +from backend.app.utils import epc_to_sap_lower_bound, read_csv_from_s3, read_parquet_from_s3 + +from backend.ml_models.sap_change_model.api import SAPChangeModelAPI +from backend.Property import Property +from etl.epc.DataProcessor import DataProcessor +from etl.epc.settings import COLUMNS_TO_MERGE_ON +from recommendations.FloorRecommendations import FloorRecommendations +from recommendations.optimiser.CostOptimiser import CostOptimiser +from recommendations.optimiser.GainOptimiser import GainOptimiser +from recommendations.optimiser.optimiser_functions import prepare_input_measures +from recommendations.WallRecommendations import WallRecommendations +from utils.logger import setup_logger +from utils.s3 import read_dataframe_from_s3_parquet + +logger = setup_logger() + +import pickle + +with open('local_data.pickle', 'rb') as f: + local_data = pickle.load(f) + +with open("property_dimensions.pickle", "rb") as f: + property_dimensions = pickle.load(f) + +with open("sap_change_dataset.pickle", "rb") as f: + sap_change_dataset = pickle.load(f) + +created_at = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + +plan_input = local_data["plan_input"] +uprn_filenames = local_data["uprn_filenames"] +local_property_data = local_data["local_property_data"] +materials = local_data["materials"] +materials_by_type = filter_materials(materials) +cleaned = local_data["cleaned"] +cleaning_data = local_data["cleaning_data"] + +# Need to find some proper materials +materials_by_type["walls"] += [ + {'id': 4, 'type': 'cavity_wall_insulation', 'description': 'Example Material 1', + 'depths': None, + 'depth_unit': None, 'cost': 20, + 'cost_unit': 'gbp_sq_meter', 'r_value_per_mm': 0.0278, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': 0.036, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', + 'link': None, 'created_at': None, 'is_active': True}, + {'id': 10, 'type': "cavity_wall_insulation", 'description': 'Example Material 2', + 'depths': None, 'depth_unit': None, 'cost': 25, 'cost_unit': 'gbp_sq_meter', + 'r_value_per_mm': 0.02631579, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.038, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', + 'link': None, + 'created_at': None, 'is_active': True} +] + +epc_client = EpcClient(auth_token="NO-TOKEN") + +input_properties = [] +for i, config in enumerate(plan_input): + property_id = local_property_data[i]["id"] + input_properties.append( + Property( + postcode=config['postcode'], + address1=config['address'], + epc_client=epc_client, + id=property_id + ) + ) + +logger.info("Getting EPC, and spatial data") +for i, p in enumerate(input_properties): + p.data = local_property_data[i]["data"] + p.uprn = local_property_data[i]["uprn"] + p.id = local_property_data[i]["id"] + p.full_sap_epc = local_property_data[i]["full_sap_epc"] + p.old_data = local_property_data[i]["old_data"] + p.is_listed = False + p.in_conservation_area = False + p.is_heritage = False + + p.set_year_built() + + # TODO: TESTING + p.data['number-habitable-rooms'] = 3 + +recommendations = {} +recommendations_scoring_data = [] + +for p in input_properties: + property_recommendations = [] + + # Property recommendations + p.get_components(cleaned) + + # Floor recommendations + floor_recommender = FloorRecommendations( + property_instance=p, + materials=materials_by_type["floor"], + ) + floor_recommender.recommend() + + if floor_recommender.recommendations: + property_recommendations.append(floor_recommender.recommendations) + + # Wall recommendations + + wall_recomender = WallRecommendations( + property_instance=p, + materials=materials_by_type["walls"] + ) + wall_recomender.recommend() + + if wall_recomender.recommendations: + property_recommendations.append(wall_recomender.recommendations) + + # We insert temporary ids into the recommendations which is important for the optimiser later + property_recommendations = insert_temp_recommendation_id(property_recommendations) + + if not property_recommendations: + continue + + recommendations[p.id] = property_recommendations + + # Finally, we'll prepare data for predicting the impact on SAP + # TODO: We should use the cleaned data from get_components in the data rather than the raw + # values. We should create a method in Property which takes the EPC data and inserts the cleaned + # data + + data_processor = DataProcessor(None, newdata=True) + data_processor.insert_data(pd.DataFrame([p.data.copy()])) + data_processor.pre_process() + + starting_epc_data = data_processor.get_component_features(suffix="_STARTING") + ending_epc_data = data_processor.get_component_features(suffix="_ENDING") + fixed_data = data_processor.get_fixed_features() + + # We update the ending record with the recommended updates and we set lodgement date to today + ending_epc_data["LODGEMENT_DATE_ENDING"] = created_at + + for recommendations_by_type in property_recommendations: + for rec in recommendations_by_type: + scoring_dict = create_recommendation_scoring_data( + property=p, + recommendation=rec, + starting_epc_data=starting_epc_data, + ending_epc_data=ending_epc_data, + fixed_data=fixed_data, + ) + + recommendations_scoring_data.append(scoring_dict) + +# cleanup +del data_processor diff --git a/backend/app/plan/utils.py b/backend/app/plan/utils.py new file mode 100644 index 00000000..2e5f204a --- /dev/null +++ b/backend/app/plan/utils.py @@ -0,0 +1,187 @@ +import pandas as pd +from backend.Property import Property +from collections import defaultdict +from utils.s3 import read_from_s3 + +from recommendations.config import UPGRADES_MAP +from recommendations.recommendation_utils import get_wall_u_value, get_floor_u_value, get_roof_u_value + +from backend.app.db.utils import row2dict +from backend.app.config import get_settings +import msgpack + + +def filter_materials(materials): + materials_by_type = defaultdict(list) + + mapping = { + "walls": ["internal_wall_insulation", "external_wall_insulation", "cavity_wall_insulation"], + "floor": ["suspended_floor_insulation", "solid_floor_insulation"] + } + + materials = [row2dict(material) for material in materials] + + for component, types in mapping.items(): + materials_by_type[component] = [part for part in materials if part["type"] in types] + + return dict(materials_by_type) + + +def insert_temp_recommendation_id(property_recommendations): + """ + Creates a temporary recommendation id which is needed for + filtering recommendations between default and no, after the optimiser has been + run + :param property_recommendations: nested list of recommendations, grouped by data_types + :return: Updated recommendations_to_upload, where where recommendation has a "recommendation_id" + integer inserted + """ + idx = 0 + + for recs in property_recommendations: + for rec in recs: + rec["recommendation_id"] = idx + idx += 1 + + return property_recommendations + + +def get_cleaned(): + """ + This function will retrieve the cleaned dataset from s3 which has the cleaned + descriptions for the epc dataset + + This data is stored in MessagePack format and therefore needs to be decoded + :return: + """ + + cleaned = read_from_s3( + s3_file_name="cleaned_epc_data/cleaned.bson", + bucket_name="retrofit-data-{environment}".format(environment=get_settings().ENVIRONMENT) + ) + + cleaned = msgpack.unpackb(cleaned, raw=False) + + return cleaned + + +def create_recommendation_scoring_data( + property: Property, + recommendation: dict, + starting_epc_data: pd.DataFrame, + ending_epc_data: pd.DataFrame, + fixed_data: pd.DataFrame, +): + """ + This wrapper function prepares data to be passed to the sap model api + :return: + """ + + scoring_dict = { + "UPRN": property.data["uprn"], + "id": "+".join([str(property.id), str(recommendation["recommendation_id"])]), + "LOCAL_AUTHORITY": property.data["local-authority"], + **starting_epc_data.to_dict("records")[0], + **ending_epc_data.to_dict("records")[0], + **fixed_data.to_dict("records")[0] + } + + # Set staring u-values if we don't have them + if not scoring_dict["walls_thermal_transmittance"]: + scoring_dict["walls_thermal_transmittance"] = get_wall_u_value( + clean_description=property.walls["clean_description"], + age_band=property.age_band, + is_granite_or_whinstone=property.walls["is_granite_or_whinstone"], + is_sandstone_or_limestone=property.walls["is_sandstone_or_limestone"] + ) + + if not scoring_dict["floor_thermal_transmittance"]: + scoring_dict["floor_thermal_transmittance"] = get_floor_u_value( + floor_type=property.floor_type, + area=property.floor_area, + perimeter=property.perimeter, + wall_type=property.wall_type, + insulation_thickness=property.floor["insulation_thickness"], + age_band=property.age_band, + ) + + if not scoring_dict["roof_thermal_transmittance"]: + scoring_dict["roof_thermal_transmittance"] = get_roof_u_value( + insulation_thickness=property.roof["insulation_thickness"], + has_dwelling_above=property.roof["has_dwelling_above"], + is_loft=property.roof["is_loft"], + is_roof_room=property.roof["is_roof_room"], + is_thatched=property.roof["is_thatched"], + age_band=property.age_band, + is_flat=property.roof["is_flat"], + is_pitched=property.roof["is_pitched"], + is_at_rafters=property.roof["is_at_rafters"], + ) + + for col in [ + "walls_insulation_thickness", "floor_insulation_thickness", "roof_insulation_thickness" + ]: + if scoring_dict[col] is None: + scoring_dict[col] = "none" + + # We update the description to indicate it's insulated + if recommendation["type"] == "wall_insulation": + # The upgrade made here is to the u-value of the walls and the description of the + # insulation thickness + scoring_dict["walls_thermal_transmittance_ENDING"] = recommendation["new_u_value"] + scoring_dict["walls_insulation_thickness_ENDING"] = "above average" + else: + if not scoring_dict["walls_thermal_transmittance_ENDING"]: + scoring_dict["walls_thermal_transmittance_ENDING"] = get_wall_u_value( + clean_description=property.walls["clean_description"], + age_band=property.age_band, + is_granite_or_whinstone=property.walls["is_granite_or_whinstone"], + is_sandstone_or_limestone=property.walls["is_sandstone_or_limestone"] + ) + + if scoring_dict["walls_insulation_thickness_ENDING"] is None: + scoring_dict["walls_insulation_thickness_ENDING"] = "none" + + # Update description to indicate it's insulate + if recommendation["type"] == "floor_insulation": + + if len(recommendation["parts"]) > 1: + raise NotImplementedError("Have more than 1 floor insulation part - handle this case") + + scoring_dict["floor_thermal_transmittance_ENDING"] = recommendation["new_u_value"] + # We don't really see above average for this in the training data + scoring_dict["floor_insulation_thickness_ENDING"] = "average" + else: + if not scoring_dict["floor_thermal_transmittance_ENDING"]: + scoring_dict["floor_thermal_transmittance_ENDING"] = get_floor_u_value( + floor_type=property.floor_type, + area=property.floor_area, + perimeter=property.perimeter, + wall_type=property.wall_type, + insulation_thickness=property.floor["insulation_thickness"], + age_band=property.age_band, + ) + + if scoring_dict["floor_insulation_thickness_ENDING"] is None: + scoring_dict["floor_insulation_thickness_ENDING"] = "none" + + if recommendation["type"] not in ["wall_insulation", "floor_insulation"]: + raise NotImplementedError("Implement me") + + if not scoring_dict["roof_thermal_transmittance_ENDING"]: + scoring_dict["roof_thermal_transmittance_ENDING"] = get_roof_u_value( + insulation_thickness=property.roof["insulation_thickness"], + has_dwelling_above=property.roof["has_dwelling_above"], + is_loft=property.roof["is_loft"], + is_roof_room=property.roof["is_roof_room"], + is_thatched=property.roof["is_thatched"], + age_band=property.age_band, + is_flat=property.roof["is_flat"], + is_pitched=property.roof["is_pitched"], + is_at_rafters=property.roof["is_at_rafters"], + ) + + if scoring_dict["roof_insulation_thickness_ENDING"] is None: + scoring_dict["roof_insulation_thickness_ENDING"] = "none" + + return scoring_dict diff --git a/backend/app/plan/uvalue_estimates_floors.py b/backend/app/plan/uvalue_estimates_floors.py deleted file mode 100644 index cba31508..00000000 --- a/backend/app/plan/uvalue_estimates_floors.py +++ /dev/null @@ -1,3707 +0,0 @@ -uvalue_estimates_floors = [ - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.09, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.34, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.38, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.43, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.38, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.38, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.39, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.43, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.38, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.35, 'n_samples': 24}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.35, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.31, 'n_samples': 11}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.38, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.35, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.41, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.38, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.41500000000000004, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.39, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.45, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.44, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.33, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.44, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.34, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.39, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 67}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.24, 'n_samples': 25}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.24, 'n_samples': 26}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 24}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.24, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.235, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.26, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.29, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.24, 'n_samples': 27}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.26, 'n_samples': 17}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.24, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.24, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.23, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.235, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 9}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.24, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.215, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.67, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.55, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.58, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.56, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.47, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.56, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.51, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.5449999999999999, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.66, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.56, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.6, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.48, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.6, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.46, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.58, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.515, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.58, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.625, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.46, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.6, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.6, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.46, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.69, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.64, 'n_samples': 25}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.58, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.7, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.515, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.57, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.57, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.67, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.08, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.125, 'n_samples': 156}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.13, 'n_samples': 152}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, 'n_samples': 193}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 134}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 133}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 117}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 149}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 66}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 50}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 13}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 36}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.135, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, 'n_samples': 13}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.1, 'n_samples': 26}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 9}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.1, 'n_samples': 24}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.1, 'n_samples': 21}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.095, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.10500000000000001, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 103}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.135, 'n_samples': 88}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 73}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, 'n_samples': 60}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.135, 'n_samples': 40}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 39}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 29}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 29}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.1, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 17}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 42}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 63}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 43}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.16, 'n_samples': 19}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14, 'n_samples': 13}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 13}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.14, - 'n_samples': 19}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.12, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.125, - 'n_samples': 20}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.12, 'n_samples': 21}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.125, - 'n_samples': 12}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.13, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.125, - 'n_samples': 20}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.12, 'n_samples': 18}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, - 'n_samples': 3}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.18, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.945, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.73, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.98, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.73, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.78, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.99, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.74, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.72, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.05, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.04, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.2, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.2, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.74, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.2, 'n_samples': 196}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.78, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.78, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.29, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.265, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.23, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.47, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.5, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.5, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.68, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.155, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.165, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 28}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, - 'n_samples': 4}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.14, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.14, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.135, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 52}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 32}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 28}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.115, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.11, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 60}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14, 'n_samples': 78}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.125, 'n_samples': 72}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 90}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 32}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 104}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.11, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.11, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, - 'n_samples': 12}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.14, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.155, - 'n_samples': 16}, {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.15, 'n_samples': 22}, - {'local-authority': 'E09000012', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.02, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.34, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.4, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.235, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.225, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.215, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.24, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.255, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.235, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.26, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.23, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.47, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.55, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.56, 'n_samples': 22}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.08, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.175, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.18, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 42}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 42}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 122}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 18}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.09, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.135, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.165, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.1, 'n_samples': 26}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.09, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.11, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, 'n_samples': 16}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 34}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 24}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16499999999999998, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.16499999999999998, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.18, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 1.2, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.76, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.86, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, - 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.44, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.36, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32999999999999996, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.31, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.42, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.4, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.4, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.355, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.38, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.39, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.42, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.38, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.24, 'n_samples': 32}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22499999999999998, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 9}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.24, 'n_samples': 5}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, 'n_samples': 11}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.29, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.24, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.255, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.23, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.3, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.235, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.3, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.28500000000000003, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.27, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.28, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.52, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.59, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.56, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.66, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.575, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.46, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.46, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.67, 'n_samples': 9}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.66, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.59, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, 'n_samples': 99}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.13, 'n_samples': 50}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 56}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.135, 'n_samples': 36}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.12, 'n_samples': 36}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.16, 'n_samples': 43}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.125, 'n_samples': 38}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.125, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 17}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 13}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, - 'n_samples': 1}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.175, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.195, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.15, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.115, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 13}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 14}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 9}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 5}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 26}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, 'n_samples': 37}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 33}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14, 'n_samples': 13}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 13}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 22}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 16}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 16}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 11}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 10}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, 'n_samples': 28}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, - 'n_samples': 36}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.15, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, - 'n_samples': 13}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 17}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, - 'n_samples': 10}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, - 'n_samples': 8}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.16, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.975, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.78, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.2, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.78, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.4, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 24}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.23, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.46, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.49, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.47, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15000000000000002, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.135, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.1, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.13, 'n_samples': 42}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 10}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 80}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 22}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 60}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, - 'n_samples': 8}, {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.155, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 26}, - {'local-authority': 'E09000013', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.42, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.42, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.28, 'n_samples': 20}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.5700000000000001, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.48, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.52, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.46, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.16499999999999998, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.165, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.09, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.115, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.09, 'n_samples': 14}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.09, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 10}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 16}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, - 'n_samples': 6}, {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.12, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.12, - 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.37, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.395, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.43, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.42, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.4, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.35, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.39, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.34, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.35, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.34, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.34, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 26}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.235, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.26, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.23, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.265, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.3, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.27, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.21, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.29, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.26, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.26, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.24, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.24, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.7, 'n_samples': 33}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.5, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.6, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.535, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.7, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.7, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.5, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.55, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.64, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.56, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.46, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.59, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.13, 'n_samples': 83}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 43}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.12, 'n_samples': 53}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, 'n_samples': 124}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 52}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 54}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 55}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 43}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 24}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, - 'n_samples': 3}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.15, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.16499999999999998, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.08, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16499999999999998, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, 'n_samples': 42}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 11}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 29}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.17, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.16, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 11}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.11, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.1, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.12, - 'n_samples': 19}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.12000000000000001, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, - 'n_samples': 13}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.16, 'n_samples': 11}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, - 'n_samples': 10}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.11, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 1.2, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.2, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.39, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.84, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.2, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.2, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.2, - 'n_samples': 1}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.24, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.24, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.6, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.54, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.51, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.125, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 22}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 106}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 24}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.13, 'n_samples': 28}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 20}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 24}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 62}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.175, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14, 'n_samples': 40}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, - 'n_samples': 4}, {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, - 'n_samples': 10}, {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.12, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, - 'n_samples': 24}, {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.15, 'n_samples': 52}, - {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.1, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.87, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.34, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.4, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.265, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.245, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.29, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.7, 'n_samples': 26}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.7, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.665, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.09, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.155, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.07, - 'n_samples': 6}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.095, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, - 'n_samples': 6}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': '', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.72, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.2, 'n_samples': 68}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.74, 'n_samples': 64}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.72, 'n_samples': 24}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.13, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Bungalow', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.48, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.38, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.43, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.37, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.44, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.45, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.4, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.34, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.39, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.44, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 19}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 18}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.28, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.28, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.28, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 17}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.225, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 7}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 14}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.62, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.65, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.63, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.56, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.6, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.61, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.13, 'n_samples': 52}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.13, 'n_samples': 85}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 100}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14, 'n_samples': 118}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 86}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 117}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 69}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 75}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, 'n_samples': 30}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.135, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.08, - 'n_samples': 1}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.14, 'n_samples': 17}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, - 'n_samples': 11}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, - 'n_samples': 3}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.15, 'n_samples': 7}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.1, - 'n_samples': 9}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.125, 'n_samples': 18}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.135, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.125, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, - 'n_samples': 4}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.155, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, - 'n_samples': 3}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.1, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.155, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.13, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.175, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.1, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.07, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.08, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.12, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.14, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.13, 'n_samples': 23}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 132}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, 'n_samples': 33}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, 'n_samples': 48}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.08, 'n_samples': 34}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 27}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.1, 'n_samples': 39}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 17}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 32}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15000000000000002, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 32}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 42}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 42}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 28}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 34}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.125, 'n_samples': 20}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.135, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.185, - 'n_samples': 14}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.15, 'n_samples': 50}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, - 'n_samples': 31}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.16, 'n_samples': 25}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, - 'n_samples': 27}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.11, 'n_samples': 19}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, - 'n_samples': 23}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.14, 'n_samples': 31}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.18, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.0, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.0, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.86, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.0, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.94, 'n_samples': 17}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.94, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.09, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.75, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.09, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.27, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.41, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 16}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.49, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.49, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.115, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 30}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.13, 'n_samples': 32}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.11, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.05, 'n_samples': 60}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.135, 'n_samples': 56}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.13, 'n_samples': 62}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.125, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.12, - 'n_samples': 10}, {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.12, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.14, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.75, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.26, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.1, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 1.0050000000000001, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.235, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 18}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 34}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 32}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 38}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 54}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, - 'n_samples': 4}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.11, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.11, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 28}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 38}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 60}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 24}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 26}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 44}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 54}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 20}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.11, - 'n_samples': 10}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'Bungalow', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.33, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.39, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.37, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.37, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.34, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.37, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Average', 'floor-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 21}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 9}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 19}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.215, 'n_samples': 14}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 11}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.245, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.235, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.28, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.24, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.235, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 13}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.24, 'n_samples': 11}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.225, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.235, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.235, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 7}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.6, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.47, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.49, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.47, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.53, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.51, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.51, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.55, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.51, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.12, 'n_samples': 156}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 127}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, 'n_samples': 144}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, 'n_samples': 124}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.1, 'n_samples': 112}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 62}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 94}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 45}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.1, 'n_samples': 19}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.13, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, - 'n_samples': 1}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.09, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, - 'n_samples': 3}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.1, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, - 'n_samples': 6}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, - 'n_samples': 1}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.15, 'n_samples': 22}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.15, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 22}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.08, 'n_samples': 28}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 22}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.11, 'n_samples': 17}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.1, 'n_samples': 29}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.12, 'n_samples': 17}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.135, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.13, 'n_samples': 53}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.13, 'n_samples': 68}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.1, 'n_samples': 26}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 41}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 33}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 23}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.11, 'n_samples': 37}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.165, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 17}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.16, 'n_samples': 38}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 11}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 26}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 13}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 13}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.17, - 'n_samples': 17}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.17, 'n_samples': 11}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, - 'n_samples': 9}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.19, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.12, - 'n_samples': 7}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.15, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, - 'n_samples': 6}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, - 'n_samples': 11}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.1, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.2, 'n_samples': 17}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.2, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.8, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.2, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.2, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.74, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'floor-energy-eff': 'Very Poor', - 'floor-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.2, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.11, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.12, 'n_samples': 14}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.11, 'n_samples': 18}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.13, 'n_samples': 26}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.13, 'n_samples': 34}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.1, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.12, 'n_samples': 20}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 18}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.12, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.16, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, - 'n_samples': 8}, {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.19, 'n_samples': 24}, - {'local-authority': 'E09000030', 'property-type': 'House', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, - 'n_samples': 14}, {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Average', - 'floor-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Good', 'floor-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Poor', 'floor-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.155, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.1, 'n_samples': 34}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 22}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.165, 'n_samples': 16}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 30}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 28}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'floor-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, - 'n_samples': 2} -] diff --git a/backend/app/plan/uvalue_estimates_walls.py b/backend/app/plan/uvalue_estimates_walls.py deleted file mode 100644 index edf114ce..00000000 --- a/backend/app/plan/uvalue_estimates_walls.py +++ /dev/null @@ -1,4003 +0,0 @@ -uvalue_estimates_walls = [ - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.71, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.8, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.71, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.96, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.73, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.98, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.95, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.85, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.9, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.85, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.865, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.825, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.87, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.745, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.78, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.83, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.62, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.78, 'n_samples': 21}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.0, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.0, 'n_samples': 129}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.0, 'n_samples': 93}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.0, 'n_samples': 26}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.84, 'n_samples': 55}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.0, 'n_samples': 94}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.0, 'n_samples': 57}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.0, 'n_samples': 49}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.0, 'n_samples': 29}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.93, 'n_samples': 24}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.97, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.62, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.68, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.88, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.38, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.44999999999999996, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.49, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.43, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.31, 'n_samples': 79}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.31, 'n_samples': 31}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.31, 'n_samples': 33}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.34, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.31, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.315, 'n_samples': 16}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 17}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 28}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.37, 'n_samples': 19}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.32, 'n_samples': 19}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.38, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.5, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.39, 'n_samples': 17}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.31, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.57, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.34, 'n_samples': 103}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.48, 'n_samples': 54}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.42, 'n_samples': 28}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.37, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.34, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.355, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.345, 'n_samples': 16}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 9}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.39, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.32, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': None, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.33, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.345, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.5, 'n_samples': 17}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.305, 'n_samples': 7}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 18}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.43, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.54, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.41, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.47, 'n_samples': 23}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.34, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.42, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 1.07, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 1.19, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.55, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.06, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.255, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.09, 'n_samples': 25}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.42, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.06, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.26, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.55, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.21, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.43, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.51, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.51, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.28, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.4, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.35, 'n_samples': 287}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.35, 'n_samples': 110}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.35, 'n_samples': 84}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.35, 'n_samples': 74}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.38, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.35, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.35, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.35, 'n_samples': 49}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.35, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.13, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.32, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.49, 'n_samples': 62}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.33, 'n_samples': 61}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.45, 'n_samples': 25}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.51, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.51, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.51, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.51, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.51, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.01, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.2850000000000001, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.36, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 577}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.19, 'n_samples': 649}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.18, 'n_samples': 541}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 567}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, 'n_samples': 548}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 689}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 695}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 578}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 463}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 218}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.22, - 'n_samples': 4}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.22, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, - 'n_samples': 1}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.2, 'n_samples': 116}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.18, 'n_samples': 45}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 44}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 67}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.16, 'n_samples': 130}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 89}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.165, 'n_samples': 92}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 158}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 136}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 52}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 249}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.17, 'n_samples': 369}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 179}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 145}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.17, 'n_samples': 199}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 191}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 162}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, 'n_samples': 107}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 106}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 41}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 15}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, 'n_samples': 67}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 66}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.21, 'n_samples': 158}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 185}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 142}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22, 'n_samples': 166}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 168}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 111}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 65}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, - 'n_samples': 70}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.22, 'n_samples': 93}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, - 'n_samples': 39}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.18, 'n_samples': 58}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, - 'n_samples': 47}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.21, 'n_samples': 86}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, - 'n_samples': 48}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.18, 'n_samples': 69}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, - 'n_samples': 63}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.18, 'n_samples': 59}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.72, 'n_samples': 5}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.81, 'n_samples': 3}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.96, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.67, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.96, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.65, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 2.1, - 'n_samples': 1}, {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 2.0, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.62, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.91, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.7, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.7, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 2.045, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 2.02, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.76, 'n_samples': 1}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.74, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 2.2350000000000003, 'n_samples': 64}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 2.0, 'n_samples': 100}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.87, 'n_samples': 145}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.92, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.64, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.68, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.71, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.73, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.44, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.55, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.435, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.305, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.45000000000000007, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.58, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.15, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.15, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.175, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.13, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 48}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, - 'n_samples': 4}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.24, - 'n_samples': 6}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.18, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.185, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.195, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 42}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 78}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.13, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 18}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 96}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 194}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 132}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, - 'n_samples': 4}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.195, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, - 'n_samples': 10}, {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.18, 'n_samples': 44}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.72, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.72, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.76, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.64, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 2.1, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.61, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.74, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.94, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.7849999999999999, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.87, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.66, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.61, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.68, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.7, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.47, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.4, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.44, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.54, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.32, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.37, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.52, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.43, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.48, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.305, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.39, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.44, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.5, 'n_samples': 26}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': None, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.01, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.44, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.18, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.12, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.08, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.35, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.04, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.24, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.32, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.53, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.25, 'n_samples': 14}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 20}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.23, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.24, 'n_samples': 10}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, 'n_samples': 30}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 84}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 104}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 190}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.195, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, 'n_samples': 22}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 46}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.255, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.225, 'n_samples': 12}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.28, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.195, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 16}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 64}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 50}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.29, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.135, 'n_samples': 8}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 6}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 44}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, - 'n_samples': 4}, {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.21000000000000002, 'n_samples': 4}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.72, 'n_samples': 2}, - {'local-authority': 'E09000012', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.69, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.87, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.68, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.77, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.63, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.8, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.93, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.98, 'n_samples': 54}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.98, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.95, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.69, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.98, 'n_samples': 28}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.675, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.63, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.92, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.28, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.28, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.28, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.28, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.28, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.31, 'n_samples': 56}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.32, 'n_samples': 9}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.455, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.3, 'n_samples': 13}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.31, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.385, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.33, 'n_samples': 5}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.39, 'n_samples': 11}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.495, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.51, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.51, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.33, 'n_samples': 24}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.3, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.54, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.3, 'n_samples': 11}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.35, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.3, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.41, 'n_samples': 5}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.36, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.35, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.51, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.305, 'n_samples': 7}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.38, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.37, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.34, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.4, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.31, 'n_samples': 15}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.39, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.45, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 1.2349999999999999, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.41, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.52, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.4, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.35, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.03, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.46, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.32, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, 'n_samples': 423}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 303}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 286}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 374}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.18, 'n_samples': 127}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 356}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 148}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 346}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 137}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 226}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, - 'n_samples': 1}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.21, 'n_samples': 46}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, - 'n_samples': 13}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.215, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21, - 'n_samples': 15}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.21, 'n_samples': 55}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, - 'n_samples': 25}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.21, 'n_samples': 44}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, - 'n_samples': 14}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.22, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 47}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 3}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 15}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.28, 'n_samples': 36}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 38}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 30}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 92}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.26, 'n_samples': 14}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.27, 'n_samples': 30}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 11}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 87}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 161}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.21, 'n_samples': 160}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 80}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 41}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 119}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 131}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 91}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 25}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 91}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 22}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.15, 'n_samples': 44}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 19}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 47}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.16, 'n_samples': 56}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 63}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 104}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 76}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, - 'n_samples': 86}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.195, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, - 'n_samples': 52}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.21, 'n_samples': 34}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.23, - 'n_samples': 31}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.2, 'n_samples': 64}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, - 'n_samples': 57}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.19, 'n_samples': 84}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, - 'n_samples': 39}, {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.22, 'n_samples': 54}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.805, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 11.26, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 2.05, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 2.02, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 2.1, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 2.1, 'n_samples': 1}, - {'local-authority': 'E09000013', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.95, - 'n_samples': 1}, {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.72, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.53, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.39, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.59, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.39, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.39, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.39, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.31, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.11, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.1, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.3050000000000002, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.16, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21000000000000002, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.14, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 14}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22000000000000003, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 50}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 10}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 96}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 106}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.16, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.16, - 'n_samples': 2}, {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.24, 'n_samples': 10}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, - 'n_samples': 4}, {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.19, 'n_samples': 28}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 2.1, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.75, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.86, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.83, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.26, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.335, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.42, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.41, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.05, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 20}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.26, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.185, 'n_samples': 12}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.185, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.12, 'n_samples': 6}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, 'n_samples': 18}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 8}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 26}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, - 'n_samples': 10}, {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.245, - 'n_samples': 4}, {'local-authority': 'E09000013', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.225, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.215, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.26, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.13, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Bungalow', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.16, - 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.74, 'n_samples': 31}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.81, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.69, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.71, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.915, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.69, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.64, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.91, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.64, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.71, 'n_samples': 28}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.61, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.64, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.83, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.62, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.6, 'n_samples': 97}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.44, 'n_samples': 27}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.3, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.52, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.58, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.37, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.33999999999999997, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.4, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.46, 'n_samples': 7}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.36, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.39, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.31, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.31, 'n_samples': 11}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.39, 'n_samples': 15}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.4, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.44, 'n_samples': 17}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.4, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.55, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.33, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.49, 'n_samples': 15}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.32, 'n_samples': 9}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.35, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.31, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.45, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.51, 'n_samples': 30}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.33999999999999997, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.32, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.305, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.3, 'n_samples': 13}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.32, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.32, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.44, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.32, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.3, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.33, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.325, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.32, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.35, 'n_samples': 5}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.19, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.36, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.39, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.39, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.28, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.15, 'n_samples': 11}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.58, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.55, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.36, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.41, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.37, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.41, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.41, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.41, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.24, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.26, 'n_samples': 301}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.26, 'n_samples': 386}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, 'n_samples': 201}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.26, 'n_samples': 197}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.26, 'n_samples': 446}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.25, 'n_samples': 288}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, 'n_samples': 181}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 215}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 160}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 101}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.27, - 'n_samples': 4}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.23, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, - 'n_samples': 1}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.28, - 'n_samples': 3}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.25, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.225, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 43}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 30}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.19, 'n_samples': 13}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 17}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.185, 'n_samples': 24}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 19}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 17}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.195, 'n_samples': 60}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.19, 'n_samples': 77}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 58}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 86}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, 'n_samples': 118}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 46}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 51}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 22}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 21}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.25, 'n_samples': 114}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.26, 'n_samples': 20}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 57}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 39}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 41}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 69}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.225, 'n_samples': 36}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 35}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 41}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 36}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, - 'n_samples': 62}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.22, 'n_samples': 19}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.22, - 'n_samples': 38}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.22, 'n_samples': 37}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, - 'n_samples': 52}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.19, 'n_samples': 65}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, - 'n_samples': 29}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.25, 'n_samples': 38}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, - 'n_samples': 12}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.19, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.82, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.64, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.92, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.9, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 2.09, 'n_samples': 3}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.65, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.96, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 2.05, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 2.05, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.72, - 'n_samples': 1}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 2.03, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.77, - 'n_samples': 1}, {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 1.68, 'n_samples': 1}, - {'local-authority': 'E09000014', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 2.1, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.69, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.97, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.71, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.315, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.38, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.435, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.1949999999999998, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.415, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.25, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.22000000000000003, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.175, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 134}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.27, - 'n_samples': 4}, {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.22, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.175, 'n_samples': 52}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, 'n_samples': 26}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 90}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 40}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, - 'n_samples': 4}, {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.18, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, - 'n_samples': 8}, {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.22000000000000003, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, - 'n_samples': 84}, {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 1.87, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.69, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': '', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 1.0, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.77, 'n_samples': 10}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.82, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.7, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.6, 'n_samples': 58}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.6, 'n_samples': 124}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.39, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.35, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.31, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.31, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.41000000000000003, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 1.17, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.41, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.28, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.195, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.155, 'n_samples': 16}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 26}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.24, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.24, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.19, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.21000000000000002, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 14}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21500000000000002, 'n_samples': 12}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.275, 'n_samples': 4}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.27, 'n_samples': 8}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 18}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 54}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.25, - 'n_samples': 2}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.17, 'n_samples': 6}, - {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, - 'n_samples': 8}, {'local-authority': 'E09000014', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.195, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Bungalow', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.17, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.75, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.97, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.87, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.905, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.0, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.98, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.97, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.83, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.61, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.67, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.95, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.96, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.62, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.92, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.96, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.62, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.63, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.97, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.97, 'n_samples': 40}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.96, 'n_samples': 176}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.65, 'n_samples': 24}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.97, 'n_samples': 31}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.97, 'n_samples': 17}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.42, 'n_samples': 23}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.42, 'n_samples': 21}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.31, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.5, 'n_samples': 36}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.42, 'n_samples': 52}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.3, 'n_samples': 61}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.3, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.42, 'n_samples': 97}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.42, 'n_samples': 153}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33999999999999997, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.35, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.35, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.35, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.35, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.35, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.35, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.35, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.35, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.35, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.35, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.33, 'n_samples': 40}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.385, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.45, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.57, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.34, 'n_samples': 55}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.52, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.395, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.43, 'n_samples': 16}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.31, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.37, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.49, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.31, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.51, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.31, 'n_samples': 220}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.31, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.35, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.32, 'n_samples': 76}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.33, 'n_samples': 85}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.31, 'n_samples': 46}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.31, 'n_samples': 38}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 49}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.35, 'n_samples': 55}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.35, 'n_samples': 52}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.34, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.42, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.35, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.45999999999999996, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.35, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.06, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.06, 'n_samples': 16}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.06, 'n_samples': 24}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.06, 'n_samples': 48}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 1.06, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.06, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.06, 'n_samples': 7}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.1800000000000002, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.06, 'n_samples': 18}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.06, 'n_samples': 153}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.34, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.34, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.27, 'n_samples': 20}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.33, 'n_samples': 11}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 1.4, 'n_samples': 22}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.11, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.08, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.19, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.18, 'n_samples': 52}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.49, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.04, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.13, 'n_samples': 194}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.41, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.13, 'n_samples': 188}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.11, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.045, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.37, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 1.16, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 1.16, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.16, 'n_samples': 3}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.12, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 1.03, 'n_samples': 176}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.53, 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.06, 'n_samples': 9}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 389}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.18, 'n_samples': 666}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 341}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 535}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.18, 'n_samples': 691}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 643}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.17, 'n_samples': 353}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 478}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 381}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 222}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, - 'n_samples': 4}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.15, 'n_samples': 55}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, - 'n_samples': 29}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.195, 'n_samples': 48}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.18, - 'n_samples': 29}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.18, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, - 'n_samples': 34}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.15, 'n_samples': 41}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, - 'n_samples': 38}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.15, 'n_samples': 46}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, - 'n_samples': 10}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.2, 'n_samples': 24}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.195, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.2, 'n_samples': 7}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.18, - 'n_samples': 19}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.18, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, - 'n_samples': 6}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.19, 'n_samples': 5}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.22, 'n_samples': 21}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.18, 'n_samples': 30}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.23, 'n_samples': 30}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 70}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 70}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 76}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.25, 'n_samples': 15}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 81}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 77}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 41}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.14, 'n_samples': 72}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, 'n_samples': 100}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.17, 'n_samples': 181}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.17, 'n_samples': 143}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.16, 'n_samples': 120}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 188}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 76}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 145}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 139}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 51}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.29, 'n_samples': 22}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.165, 'n_samples': 64}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 174}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, 'n_samples': 205}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 200}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.14, 'n_samples': 149}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 127}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 129}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 56}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.15, - 'n_samples': 60}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.155, 'n_samples': 174}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, - 'n_samples': 44}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.15, 'n_samples': 108}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.155, - 'n_samples': 96}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.22, 'n_samples': 135}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 84}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, - 'n_samples': 80}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.15, 'n_samples': 107}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, - 'n_samples': 43}, {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 2.1, 'n_samples': 22}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 2.1, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 2.1, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 2.1, 'n_samples': 14}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 2.1, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 2.1, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 2.1, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 2.1, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.96, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 2.03, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 2.09, - 'n_samples': 1}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.3, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33499999999999996, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33, 'n_samples': 16}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.55, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.55, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.24, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.27, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 14}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 64}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.23, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 58}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, 'n_samples': 132}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.14, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.15, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.225, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 32}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': None, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.21, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.16, - 'n_samples': 14}, {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 1.92, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 2.1, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.68, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': None, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.45, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.33, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': '', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 30}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 50}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.21, 'n_samples': 66}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.15, 'n_samples': 110}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.135, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.14, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22499999999999998, 'n_samples': 12}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.28, 'n_samples': 6}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.28, 'n_samples': 8}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.16, 'n_samples': 22}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 28}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 22}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, 'n_samples': 14}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.12, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 40}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.255, 'n_samples': 4}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.2, 'n_samples': 100}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 10}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 86}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 92}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, - 'n_samples': 8}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000028', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.22, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Bungalow', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.78, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.86, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.64, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.93, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.9, 'n_samples': 38}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.66, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.79, 'n_samples': 26}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.83, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.67, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.875, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.84, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.89, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.67, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Average', 'walls-env-eff': 'Average', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.7, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.41, 'n_samples': 46}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.34, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.43, 'n_samples': 9}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.495, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.375, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.31, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.42, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.405, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.45, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.49, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.42, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.35, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.35, 'n_samples': 8}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.35, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.32, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.52, 'n_samples': 45}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.52, 'n_samples': 42}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.35, 'n_samples': 13}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.36, 'n_samples': 9}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.33999999999999997, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.58, 'n_samples': 19}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.6, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.36, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.54, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.3, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.37, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.35, 'n_samples': 30}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.35, 'n_samples': 19}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.35, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.345, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.37, 'n_samples': 12}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.33, 'n_samples': 3}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.43, 'n_samples': 9}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.33, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.395, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 1.09, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 1.08, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': None, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 403}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.18, 'n_samples': 908}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, 'n_samples': 593}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 416}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.17, 'n_samples': 530}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.17, 'n_samples': 550}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 311}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.17, 'n_samples': 451}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 260}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, 'n_samples': 74}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, - 'n_samples': 9}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.19, 'n_samples': 5}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.2, - 'n_samples': 16}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.29, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.29, - 'n_samples': 6}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.19, 'n_samples': 11}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, - 'n_samples': 6}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.21, 'n_samples': 7}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, - 'n_samples': 19}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed End-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.22, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, - 'n_samples': 19}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', - 'median_thermal_transmittance': 0.19, 'n_samples': 28}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.13, - 'n_samples': 19}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.19, 'n_samples': 14}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, - 'n_samples': 9}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 0.19, 'n_samples': 15}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.19, - 'n_samples': 9}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.18, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, - 'n_samples': 15}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Enclosed Mid-Terrace', - 'number-habitable-rooms': '', 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.2, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.19, 'n_samples': 65}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.18, 'n_samples': 67}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.19, 'n_samples': 72}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.16, 'n_samples': 132}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.175, 'n_samples': 472}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.16, 'n_samples': 141}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 70}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.18, 'n_samples': 76}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 177}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 23}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.155, 'n_samples': 154}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.19, 'n_samples': 719}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.15, 'n_samples': 167}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.19, 'n_samples': 157}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.2, 'n_samples': 149}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 124}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 128}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 104}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.18, 'n_samples': 82}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.2, 'n_samples': 33}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': None, 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.14, 'n_samples': 20}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.24, 'n_samples': 21}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.16, 'n_samples': 65}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': 0.19, 'n_samples': 178}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.18, 'n_samples': 154}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.21, 'n_samples': 102}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.14500000000000002, 'n_samples': 128}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.2, 'n_samples': 75}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.07, 'n_samples': 33}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 0.20500000000000002, 'n_samples': 50}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.2, - 'n_samples': 82}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 3', - 'median_thermal_transmittance': 0.21, 'n_samples': 50}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.21, - 'n_samples': 87}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 5', - 'median_thermal_transmittance': 0.195, 'n_samples': 70}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.21, - 'n_samples': 26}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', - 'median_thermal_transmittance': 0.22, 'n_samples': 27}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.22, - 'n_samples': 63}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', - 'median_thermal_transmittance': 0.21, 'n_samples': 46}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.21, - 'n_samples': 30}, {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 1', - 'median_thermal_transmittance': 1.745, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 2.37, 'n_samples': 45}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 2.98, 'n_samples': 81}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 2.4, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Flat', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 2.1, - 'n_samples': 1}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.33, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.3, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 1.52, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.06, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.15, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.175, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.16, 'n_samples': 16}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.17, 'n_samples': 30}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.24, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.19, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.17, 'n_samples': 30}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.185, 'n_samples': 48}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.18, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.28, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 38}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.26, - 'n_samples': 4}, {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 4', - 'median_thermal_transmittance': 0.18, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, - 'n_samples': 10}, {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', - 'median_thermal_transmittance': 0.19, 'n_samples': 40}, - {'local-authority': 'E09000030', 'property-type': 'House', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 1.67, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.63, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.99, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Average', - 'walls-env-eff': 'Average', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.7, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.48, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': 0.32, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.31, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.32, 'n_samples': 6}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.38, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 5', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Good', 'walls-env-eff': 'Good', - 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Poor', 'walls-env-eff': 'Poor', - 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 1.14, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 1', 'median_thermal_transmittance': 0.2, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.22499999999999998, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.16, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.19, 'n_samples': 40}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Detached', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, 'n_samples': 118}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'End-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.19, 'n_samples': 18}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 2', 'median_thermal_transmittance': 0.21, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 4', 'median_thermal_transmittance': 0.18, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 6', 'median_thermal_transmittance': 0.22999999999999998, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.21, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.22, 'n_samples': 22}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Mid-Terrace', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.195, 'n_samples': 4}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 3', 'median_thermal_transmittance': None, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.26, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 8', 'median_thermal_transmittance': 0.2, 'n_samples': 10}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 9', 'median_thermal_transmittance': 0.23, 'n_samples': 30}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', 'number-heated-rooms': '', - 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.22, 'n_samples': 52}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 7', 'median_thermal_transmittance': 0.17, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 8', - 'median_thermal_transmittance': 0.17, 'n_samples': 2}, - {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Good', - 'walls-env-eff': 'Very Good', 'built-form': 'Semi-Detached', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 10', 'median_thermal_transmittance': 0.18, - 'n_samples': 2}, {'local-authority': 'E09000030', 'property-type': 'Maisonette', 'walls-energy-eff': 'Very Poor', - 'walls-env-eff': 'Very Poor', 'built-form': 'NO DATA!', 'number-habitable-rooms': '', - 'number-heated-rooms': '', 'total-floor-area_group': 'Decile 6', - 'median_thermal_transmittance': 2.1, 'n_samples': 2} -] diff --git a/backend/app/utils.py b/backend/app/utils.py index 7099eba1..b4ba1bb9 100644 --- a/backend/app/utils.py +++ b/backend/app/utils.py @@ -79,17 +79,17 @@ def sap_to_epc(sap_points: int): if sap_points <= 0 or sap_points > 100: raise ValueError("SAP points should be between 1 and 100.") - if sap_points > 91: + if sap_points >= 92: return "A" - elif sap_points > 80: + elif sap_points >= 81: return "B" - elif sap_points > 69: + elif sap_points >= 69: return "C" - elif sap_points > 55: + elif sap_points >= 55: return "D" - elif sap_points > 39: + elif sap_points >= 39: return "E" - elif sap_points > 21: + elif sap_points >= 21: return "F" else: return "G" @@ -108,13 +108,13 @@ def epc_to_sap_lower_bound(epc: str): elif epc == "B": return 81 elif epc == "C": - return 70 + return 69 elif epc == "D": - return 56 + return 55 elif epc == "E": - return 40 + return 39 elif epc == "F": - return 22 + return 21 elif epc == "G": return 1 else: diff --git a/backend/ml_models/sap_change_model/api.py b/backend/ml_models/sap_change_model/api.py index fd15ccd1..2eb7d706 100644 --- a/backend/ml_models/sap_change_model/api.py +++ b/backend/ml_models/sap_change_model/api.py @@ -62,14 +62,14 @@ class SAPChangeModelAPI: logger.info("Making request to sap change api") url = f"{self.base_url}/sapmodel/predict" payload = { - "file_location": f"s3://retrofit-data-dev/{file_location}", + "file_location": file_location, "property_id": "", # This should get removed "portfolio_id": self.portfolio_id, "created_at": self.timestamp } try: - response = requests.post(url, json=payload, headers={"Content-Type": "application/json"}) + response = requests.post(url, json=payload, headers={"Content-Type": "application/json"}, timeout=120) # Check if the response status code is 2xx (success) response.raise_for_status() diff --git a/backend/requirements/base.txt b/backend/requirements/base.txt index ce43ce0a..7a925030 100644 --- a/backend/requirements/base.txt +++ b/backend/requirements/base.txt @@ -34,4 +34,5 @@ pytz==2023.3 mip==1.15.0 boto3==1.28.3 pandas==1.5.3 -pyarrow==12.0.1 \ No newline at end of file +pyarrow==12.0.1 +textblob \ No newline at end of file diff --git a/backend/tests/test_property.py b/backend/tests/test_property.py index 8d392bab..76a299fc 100644 --- a/backend/tests/test_property.py +++ b/backend/tests/test_property.py @@ -1,15 +1,17 @@ import pytest -import pandas as pd from unittest.mock import Mock from epc_api.client import EpcClient from backend.Property import Property -from open_uprn.OpenUprnClient import OpenUprnClient -from model_data.EpcClean import EpcClean +from etl.epc_clean.EpcClean import EpcClean # Define some test data mock_epc_response = { "rows": [ { + "lmk-key": 1, + "uprn": 1, + "number-habitable-rooms": 5, + "property-type": "House", "inspection-date": "2023-06-01", "some-other-key": "some-value", "roof-description": "Roof Description", @@ -34,6 +36,10 @@ mock_epc_response = { "construction-age-band": "England and Wales: 1967-1975" }, { + "lmk-key": 2, + "uprn": 2, + "number-habitable-rooms": 5, + "property-type": "House", "inspection-date": "2023-05-01", "some-other-key": "some-other-value", "roof-description": "Roof Description", @@ -63,6 +69,10 @@ mock_epc_response = { mock_epc_response_dupe = { 'rows': [ { + "lmk-key": 1, + "uprn": 1, + "number-habitable-rooms": 5, + "property-type": "House", 'inspection-date': '2023-06-01', 'some-other-key': 'some-value', 'roof-description': 'Roof Description', 'walls-description': 'Walls Description', 'windows-description': 'Windows Description', 'mainheat-description': 'Main Heating Description', 'hotwater-description': 'Hot Water Description', @@ -83,6 +93,10 @@ mock_epc_response_dupe = { "construction-age-band": "England and Wales: 1967-1975" }, { + "lmk-key": 2, + "uprn": 2, + "number-habitable-rooms": 5, + "property-type": "House", 'inspection-date': '2023-05-01', 'some-other-key': 'some-other-value', 'roof-description': 'Roof Description', 'walls-description': 'Walls Description', 'windows-description': 'Windows Description', 'mainheat-description': 'Main Heating Description', @@ -104,6 +118,10 @@ mock_epc_response_dupe = { "construction-age-band": "England and Wales: 1967-1975" }, { + "lmk-key": 3, + "uprn": 3, + "number-habitable-rooms": 5, + "property-type": "House", 'inspection-date': '2023-06-01', 'some-other-key': 'duplicate-date', 'roof-description': 'Roof Description', 'walls-description': 'Walls Description', 'windows-description': 'Windows Description', @@ -130,7 +148,7 @@ mock_epc_response_dupe = { class TestProperty: @pytest.fixture(autouse=True) - def property_instance(self, mock_epc_client, mock_open_uprn_client, mock_cleaner): + def property_instance(self, mock_epc_client, mock_cleaner): property_instance = Property(1, "AB12CD", "Test Address", epc_client=mock_epc_client) return property_instance @@ -141,29 +159,18 @@ class TestProperty: @pytest.fixture def mock_epc_client(self): - mock_epc_client = Mock(spec=EpcClient()) + mock_epc_client = Mock(spec=EpcClient(auth_token="mocked_auth_token")) mock_epc_client.domestic.search.return_value = mock_epc_response.copy() mock_epc_client.auth_token = "mocked_auth_token" return mock_epc_client @pytest.fixture def mock_epc_client_dupe_data(self): - mock_epc_client_dupe_data = Mock(spec=EpcClient()) + mock_epc_client_dupe_data = Mock(spec=EpcClient(auth_token="mocked_auth_token")) mock_epc_client_dupe_data.domestic.search.return_value = mock_epc_response_dupe.copy() mock_epc_client_dupe_data.auth_token = "mocked_auth_token" return mock_epc_client_dupe_data - @pytest.fixture - def mock_open_uprn_client(self): - mock_open_uprn_client = Mock(spec=OpenUprnClient(path=None, uprns=[12345])) - mock_open_uprn_client.data = pd.DataFrame( - [ - {"UPRN": 12345, "longitude": 1.2345, "latitude": 2.3456}, - {"UPRN": 12346, "longitude": 3.4567, "latitude": 4.5678} - ] - ) - return mock_open_uprn_client - @pytest.fixture def mock_cleaner(self): lighting_averages = [ @@ -186,9 +193,22 @@ class TestProperty: ) mock_cleaner = Mock(spec=cleaner_spec) + + walls_data = { + "original_description": "Walls Description", + "is_cavity_wall": True, + "is_solid_brick": False, + "is_timber_frame": False, + "is_system_built": False, + "is_park_home": False, + "is_cob": False, + "is_sandstone_or_limestone": False, + "is_granite_or_whinstone": False, + } + mock_cleaner.cleaned = { "roof-description": [{"original_description": "Roof Description"}], - "walls-description": [{"original_description": "Walls Description"}], + "walls-description": [walls_data], "windows-description": [{"original_description": "Windows Description"}], "mainheat-description": [{"original_description": "Main Heating Description"}], "hotwater-description": [{"original_description": "Hot Water Description"}], @@ -201,10 +221,10 @@ class TestProperty: # Should be mocked auth token assert inst1.epc_client.auth_token == "mocked_auth_token" - inst2 = Property(3, "AB12CD", "Test Address") + inst2 = Property(3, "AB12CD", "Test Address", epc_client=mock_epc_client) assert inst2.epc_client.auth_token - inst3 = Property(4, "AB12CD", "Test Address", data={"some": "data"}) + inst3 = Property(4, "AB12CD", "Test Address", data={"some": "data"}, epc_client=mock_epc_client) assert inst3.data == {"some": "data"} data = inst3.search_address_epc() @@ -227,11 +247,23 @@ class TestProperty: # Verify that the components are set correctly assert property_instance.roof == {"original_description": "Roof Description"} - assert property_instance.walls == {"original_description": "Walls Description"} + assert property_instance.walls == { + "original_description": "Walls Description", + "is_cavity_wall": True, + "is_solid_brick": False, + "is_timber_frame": False, + "is_system_built": False, + "is_park_home": False, + "is_cob": False, + "is_sandstone_or_limestone": False, + "is_granite_or_whinstone": False, + } assert property_instance.windows == {"original_description": "Windows Description"} assert property_instance.main_heating == {"original_description": "Main Heating Description"} assert property_instance.hotwater == {"original_description": "Hot Water Description"} + assert property_instance.wall_type == "cavity" + def test_get_components_without_cleaned_data(self, property_instance, mock_cleaner): # Modify the mock EpcClean to not have cleaned data mock_cleaner.cleaned = {} diff --git a/land_registry/__init__.py b/backend/tests/test_sap_model_prep.py similarity index 100% rename from land_registry/__init__.py rename to backend/tests/test_sap_model_prep.py diff --git a/conservation_areas/app.py b/conservation_areas/app.py deleted file mode 100644 index 1038bcfe..00000000 --- a/conservation_areas/app.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -This application reads in the open uprn data from a static location and loads it into -our database for querying from other services -""" - -import os -from conservation_areas.ConservationAreaClient import ConservationAreaClient -from datatypes.datatypes import OpenUprnCoordinateData - - -def app(): - conservation_area_client = ConservationAreaClient( - historic_england_path=os.path.abspath( - os.path.dirname(__file__) - ) + "/model_data/local_data/Historic_Eng_Conservation_Areas/Conservation_Areas.shp", - gov_path=os.path.abspath( - os.path.dirname(__file__) - ) + "/model_data/local_data/gov-conservation-area.geojson" - ) - conservation_area_client.read() - - # We need to iterate through the open uprn data and check if the coordinates are in a conservation area - open_uprn_data = [ - {'UPRN': 6032920, 'X_COORDINATE': 535110.0, 'Y_COORDINATE': 181819.0, 'LATITUDE': 51.5191407, - 'LONGITUDE': -0.0540506}, - {'UPRN': 6038625, 'X_COORDINATE': 535374.0, 'Y_COORDINATE': 182784.0, 'LATITUDE': 51.5277492, - 'LONGITUDE': -0.0498772}, - {'UPRN': 34153991, 'X_COORDINATE': 523238.74, 'Y_COORDINATE': 178003.02, 'LATITUDE': 51.4875579, - 'LONGITUDE': -0.226392}, - {'UPRN': 10008299676, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629, - 'LONGITUDE': -0.0792445}, - {'UPRN': 10008299677, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629, - 'LONGITUDE': -0.0792445}, - {'UPRN': 100021039066, 'X_COORDINATE': 535506.0, 'Y_COORDINATE': 185624.0, 'LATITUDE': 51.5532385, - 'LONGITUDE': -0.0468833}, - {'UPRN': 100021226060, 'X_COORDINATE': 529247.0, 'Y_COORDINATE': 187959.0, 'LATITUDE': 51.5756908, - 'LONGITUDE': -0.1362513}, - {'UPRN': 200003489276, 'X_COORDINATE': 533210.0, 'Y_COORDINATE': 179442.0, 'LATITUDE': 51.4982309, - 'LONGITUDE': -0.0823165} - ] - - result = [ - { - "uprn": coordinates["UPRN"], - "is_in_conservation_area": conservation_area_client.is_in_conservation_area( - OpenUprnCoordinateData(**coordinates)) - } for coordinates in - open_uprn_data - ] - - # TODO: Add a method to write to the database diff --git a/data_collection/README.md b/data_collection/README.md deleted file mode 100644 index 1e42378d..00000000 --- a/data_collection/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Data Collection - -This service is specifically focused on the collection of data external sources which aren't easily -accessed via api or via downloadable data sources. For example, wages data requires a specific application to -pull that data from websites, e.g. from Adzuna's api \ No newline at end of file diff --git a/data_collection/adzuna.py b/data_collection/adzuna.py deleted file mode 100644 index d053a2bb..00000000 --- a/data_collection/adzuna.py +++ /dev/null @@ -1,86 +0,0 @@ -import requests -import json -from data_collection.config import ADZUNA_API_KEY, ADZUNA_APP_ID - -import pandas as pd -import os -import time -from tqdm import tqdm - -""" -Table of constituencies and their codes can be downloaded from the Office of National Statistics, found here: -https://geoportal.statistics.gov.uk/datasets/ons::westminster-parliamentary-constituencies-december-2022-names-and --codes-in-the-united-kingdom/explore -""" - -constituencies = pd.read_csv( - os.path.abspath( - os.path.dirname( - __file__)) + "/data_collection/data/Westminster_Parliamentary_Constituencies_(" - "December_2022)_Names_and_Codes_in_the_United_Kingdom.csv" -) - -constituencies["location_type"] = "constituency" - - -def retry_api_call(job_title, location, max_retries=10): - for i in range(max_retries): - try: - response = get_adzuna_jobs(job_title, location) - return response - except (requests.HTTPError, requests.ConnectionError): - print(f"Attempt {i + 1} failed. Retrying in 2 seconds...") - time.sleep(2) - print(f"Failed after {max_retries} attempts.") - return None - - -def get_adzuna_jobs(job_title, location): - base_url = "https://api.adzuna.com/v1/api/jobs" - country_code = "gb" - - url = f"{base_url}/{country_code}/search/1" - - params = { - "app_id": ADZUNA_APP_ID, - "app_key": ADZUNA_API_KEY, - "results_per_page": 25, - "what": job_title, - "where": location, - "content-type": "application/json", - "distance": 10 - } - - response = requests.get(url, params=params) - response.raise_for_status() - - jobs = json.loads(response.text) - return jobs - - -JOB_TITLES = [ - "insulation installer", "internal wall insulation installer", "external wall insulation installer", - "cavity wall insulation installer", "loft insulation installer", "roof insulation installer", - "spray foam insulation installer", "insulation technician", "insulation engineer", "iwi insulation installer", - "iwi installer", "ewi insulation installer", "ewi installer", "cwi insulation installer", "cwi installer", -] - -results = [] -for i, job_title in enumerate(JOB_TITLES): - print("Pulling job title %s of %s" % (str(i + 1), str(len(JOB_TITLES)))) - for _, location_config in tqdm(constituencies.iterrows(), total=constituencies.shape[0]): - - location = location_config["PCON22NM"] - jobs = retry_api_call(job_title, location) - time.sleep(0.5) - if jobs["results"]: - for job in jobs['results']: - to_append = { - "job_title": job_title, - "search_location": location, - "search_location_code": location_config["PCON22CD"], - **job - } - results.append(to_append) - -results_df = pd.DataFrame(results) diff --git a/data_collection/config.py b/data_collection/config.py deleted file mode 100644 index b2d5a363..00000000 --- a/data_collection/config.py +++ /dev/null @@ -1,7 +0,0 @@ -import os -from dotenv import load_dotenv - -load_dotenv(dotenv_path='data_collection/.env') - -ADZUNA_API_KEY = os.environ.get('ADZUNA_API_KEY') -ADZUNA_APP_ID = os.environ.get('ADZUNA_APP_ID') diff --git a/data_collection/data/.DS_Store b/data_collection/data/.DS_Store deleted file mode 100644 index 469b1421..00000000 Binary files a/data_collection/data/.DS_Store and /dev/null differ diff --git a/data_collection/data/Westminster_Parliamentary_Constituencies_(December_2022)_Names_and_Codes_in_the_United_Kingdom.csv b/data_collection/data/Westminster_Parliamentary_Constituencies_(December_2022)_Names_and_Codes_in_the_United_Kingdom.csv deleted file mode 100644 index d0158806..00000000 --- a/data_collection/data/Westminster_Parliamentary_Constituencies_(December_2022)_Names_and_Codes_in_the_United_Kingdom.csv +++ /dev/null @@ -1,651 +0,0 @@ -PCON22CD,PCON22NM,ObjectId -E14000530,Aldershot,1 -E14000531,Aldridge-Brownhills,2 -E14000532,Altrincham and Sale West,3 -E14000533,Amber Valley,4 -E14000534,Arundel and South Downs,5 -E14000535,Ashfield,6 -E14000536,Ashford,7 -E14000537,Ashton-under-Lyne,8 -E14000538,Aylesbury,9 -E14000539,Banbury,10 -E14000540,Barking,11 -E14000541,Barnsley Central,12 -E14000542,Barnsley East,13 -E14000543,Barrow and Furness,14 -E14000544,Basildon and Billericay,15 -E14000545,Basingstoke,16 -E14000546,Bassetlaw,17 -E14000547,Bath,18 -E14000548,Batley and Spen,19 -E14000549,Battersea,20 -E14000550,Beaconsfield,21 -E14000551,Beckenham,22 -E14000552,Bedford,23 -E14000553,Bermondsey and Old Southwark,24 -E14000554,Berwick-upon-Tweed,25 -E14000555,Bethnal Green and Bow,26 -E14000556,Beverley and Holderness,27 -E14000557,Bexhill and Battle,28 -E14000558,Bexleyheath and Crayford,29 -E14000559,Birkenhead,30 -E14000560,"Birmingham, Edgbaston",31 -E14000561,"Birmingham, Erdington",32 -E14000562,"Birmingham, Hall Green",33 -E14000563,"Birmingham, Hodge Hill",34 -E14000564,"Birmingham, Ladywood",35 -E14000565,"Birmingham, Northfield",36 -E14000566,"Birmingham, Perry Barr",37 -E14000567,"Birmingham, Selly Oak",38 -E14000568,"Birmingham, Yardley",39 -E14000569,Bishop Auckland,40 -E14000570,Blackburn,41 -E14000571,Blackley and Broughton,42 -E14000572,Blackpool North and Cleveleys,43 -E14000573,Blackpool South,44 -E14000574,Blaydon,45 -E14000575,Blyth Valley,46 -E14000576,Bognor Regis and Littlehampton,47 -E14000577,Bolsover,48 -E14000578,Bolton North East,49 -E14000579,Bolton South East,50 -E14000830,Newbury,51 -E14000831,Newcastle upon Tyne Central,52 -E14000832,Newcastle upon Tyne East,53 -E14000833,Newcastle upon Tyne North,54 -E14000834,Newcastle-under-Lyme,55 -E14000835,Newton Abbot,56 -E14000836,"Normanton, Pontefract and Castleford",57 -E14000837,North Cornwall,58 -E14000838,North Devon,59 -E14000839,North Dorset,60 -E14000840,North Durham,61 -E14000841,North East Bedfordshire,62 -E14000842,North East Cambridgeshire,63 -E14000843,North East Derbyshire,64 -E14000844,North East Hampshire,65 -E14000845,North East Hertfordshire,66 -E14000846,North East Somerset,67 -E14000847,North Herefordshire,68 -E14000848,North Norfolk,69 -E14000849,North Shropshire,70 -E14000850,North Somerset,71 -E14000851,North Swindon,72 -E14000852,North Thanet,73 -E14000853,North Tyneside,74 -E14000854,North Warwickshire,75 -E14000855,North West Cambridgeshire,76 -E14000856,North West Durham,77 -E14000857,North West Hampshire,78 -E14000858,North West Leicestershire,79 -E14000859,North West Norfolk,80 -E14000860,North Wiltshire,81 -E14000861,Northampton North,82 -E14000862,Northampton South,83 -E14000863,Norwich North,84 -E14000864,Norwich South,85 -E14000865,Nottingham East,86 -E14000866,Nottingham North,87 -E14000867,Nottingham South,88 -E14000868,Nuneaton,89 -E14000869,Old Bexley and Sidcup,90 -E14000870,Oldham East and Saddleworth,91 -E14000871,Oldham West and Royton,92 -E14000872,Orpington,93 -E14000873,Oxford East,94 -E14000874,Oxford West and Abingdon,95 -E14000875,Pendle,96 -E14000876,Penistone and Stocksbridge,97 -E14000877,Penrith and The Border,98 -E14000878,Peterborough,99 -E14000879,"Plymouth, Moor View",100 -E14000580,Bolton West,101 -E14000581,Bootle,102 -E14000582,Boston and Skegness,103 -E14000583,Bosworth,104 -E14000584,Bournemouth East,105 -E14000585,Bournemouth West,106 -E14000586,Bracknell,107 -E14000587,Bradford East,108 -E14000588,Bradford South,109 -E14000589,Bradford West,110 -E14000590,Braintree,111 -E14000591,Brent Central,112 -E14000592,Brent North,113 -E14000593,Brentford and Isleworth,114 -E14000594,Brentwood and Ongar,115 -E14000595,Bridgwater and West Somerset,116 -E14000596,Brigg and Goole,117 -E14000597,"Brighton, Kemptown",118 -E14000598,"Brighton, Pavilion",119 -E14000599,Bristol East,120 -E14000600,Bristol North West,121 -E14000601,Bristol South,122 -E14000602,Bristol West,123 -E14000603,Broadland,124 -E14000604,Bromley and Chislehurst,125 -E14000605,Bromsgrove,126 -E14000606,Broxbourne,127 -E14000607,Broxtowe,128 -E14000608,Buckingham,129 -E14000609,Burnley,130 -E14000610,Burton,131 -E14000611,Bury North,132 -E14000612,Bury South,133 -E14000613,Bury St Edmunds,134 -E14000614,Calder Valley,135 -E14000615,Camberwell and Peckham,136 -E14000616,Camborne and Redruth,137 -E14000617,Cambridge,138 -E14000618,Cannock Chase,139 -E14000619,Canterbury,140 -E14000620,Carlisle,141 -E14000621,Carshalton and Wallington,142 -E14000622,Castle Point,143 -E14000623,Central Devon,144 -E14000624,Central Suffolk and North Ipswich,145 -E14000625,Charnwood,146 -E14000626,Chatham and Aylesford,147 -E14000627,Cheadle,148 -E14000628,Chelmsford,149 -E14000629,Chelsea and Fulham,150 -E14000630,Cheltenham,151 -E14000631,Chesham and Amersham,152 -E14000632,Chesterfield,153 -E14000633,Chichester,154 -E14000634,Chingford and Woodford Green,155 -E14000635,Chippenham,156 -E14000636,Chipping Barnet,157 -E14000637,Chorley,158 -E14000638,Christchurch,159 -E14000639,Cities of London and Westminster,160 -E14000640,City of Chester,161 -E14000641,City of Durham,162 -E14000642,Clacton,163 -E14000643,Cleethorpes,164 -E14000644,Colchester,165 -E14000645,Colne Valley,166 -E14000646,Congleton,167 -E14000647,Copeland,168 -E14000648,Corby,169 -E14000649,Coventry North East,170 -E14000650,Coventry North West,171 -E14000651,Coventry South,172 -E14000652,Crawley,173 -E14000653,Crewe and Nantwich,174 -E14000654,Croydon Central,175 -E14000655,Croydon North,176 -E14000656,Croydon South,177 -E14000657,Dagenham and Rainham,178 -E14000658,Darlington,179 -E14000659,Dartford,180 -E14000660,Daventry,181 -E14000661,Denton and Reddish,182 -E14000662,Derby North,183 -E14000663,Derby South,184 -E14000664,Derbyshire Dales,185 -E14000665,Devizes,186 -E14000666,Dewsbury,187 -E14000667,Don Valley,188 -E14000668,Doncaster Central,189 -E14000669,Doncaster North,190 -E14000670,Dover,191 -E14000671,Dudley North,192 -E14000672,Dudley South,193 -E14000673,Dulwich and West Norwood,194 -E14000674,Ealing Central and Acton,195 -E14000675,Ealing North,196 -E14000676,"Ealing, Southall",197 -E14000677,Easington,198 -E14000678,East Devon,199 -E14000679,East Ham,200 -E14000780,Leeds North West,201 -E14000781,Leeds West,202 -E14000782,Leicester East,203 -E14000783,Leicester South,204 -E14000784,Leicester West,205 -E14000785,Leigh,206 -E14000786,Lewes,207 -E14000787,Lewisham East,208 -E14000788,Lewisham West and Penge,209 -E14000789,"Lewisham, Deptford",210 -E14000790,Leyton and Wanstead,211 -E14000791,Lichfield,212 -E14000792,Lincoln,213 -E14000793,"Liverpool, Riverside",214 -E14000794,"Liverpool, Walton",215 -E14000795,"Liverpool, Wavertree",216 -E14000796,"Liverpool, West Derby",217 -E14000797,Loughborough,218 -E14000798,Louth and Horncastle,219 -E14000799,Ludlow,220 -E14000800,Luton North,221 -E14000801,Luton South,222 -E14000802,Macclesfield,223 -E14000803,Maidenhead,224 -E14000804,Maidstone and The Weald,225 -E14000805,Makerfield,226 -E14000806,Maldon,227 -E14000807,Manchester Central,228 -E14000808,"Manchester, Gorton",229 -E14000809,"Manchester, Withington",230 -E14000810,Mansfield,231 -E14000811,Meon Valley,232 -E14000812,Meriden,233 -E14000813,Mid Bedfordshire,234 -E14000814,Mid Derbyshire,235 -E14000815,Mid Dorset and North Poole,236 -E14000816,Mid Norfolk,237 -E14000817,Mid Sussex,238 -E14000818,Mid Worcestershire,239 -E14000819,Middlesbrough,240 -E14000820,Middlesbrough South and East Cleveland,241 -E14000821,Milton Keynes North,242 -E14000822,Milton Keynes South,243 -E14000823,Mitcham and Morden,244 -E14000824,Mole Valley,245 -E14000825,Morecambe and Lunesdale,246 -E14000826,Morley and Outwood,247 -E14000827,New Forest East,248 -E14000828,New Forest West,249 -E14000829,Newark,250 -E14000680,East Hampshire,251 -E14000681,East Surrey,252 -E14000682,East Worthing and Shoreham,253 -E14000683,East Yorkshire,254 -E14000880,"Plymouth, Sutton and Devonport",255 -E14000684,Eastbourne,256 -E14000685,Eastleigh,257 -E14000881,Poole,258 -E14000686,Eddisbury,259 -E14000882,Poplar and Limehouse,260 -E14000687,Edmonton,261 -E14000883,Portsmouth North,262 -E14000688,Ellesmere Port and Neston,263 -E14000884,Portsmouth South,264 -E14000689,Elmet and Rothwell,265 -E14000885,Preston,266 -E14000690,Eltham,267 -E14000886,Pudsey,268 -E14000691,Enfield North,269 -E14000887,Putney,270 -E14000692,"Enfield, Southgate",271 -E14000888,Rayleigh and Wickford,272 -E14000693,Epping Forest,273 -E14000889,Reading East,274 -E14000694,Epsom and Ewell,275 -E14000890,Reading West,276 -E14000695,Erewash,277 -E14000891,Redcar,278 -E14000696,Erith and Thamesmead,279 -E14000892,Redditch,280 -E14000697,Esher and Walton,281 -E14000893,Reigate,282 -E14000698,Exeter,283 -E14000894,Ribble Valley,284 -E14000699,Fareham,285 -E14000895,Richmond (Yorks),286 -E14000700,Faversham and Mid Kent,287 -E14000896,Richmond Park,288 -E14000701,Feltham and Heston,289 -E14000897,Rochdale,290 -E14000702,Filton and Bradley Stoke,291 -E14000898,Rochester and Strood,292 -E14000703,Finchley and Golders Green,293 -E14000899,Rochford and Southend East,294 -E14000704,Folkestone and Hythe,295 -E14000900,Romford,296 -E14000705,Forest of Dean,297 -E14000901,Romsey and Southampton North,298 -E14000706,Fylde,299 -E14000902,Rossendale and Darwen,300 -E14000707,Gainsborough,301 -E14000903,Rother Valley,302 -E14000904,Rotherham,303 -E14000905,Rugby,304 -E14000906,"Ruislip, Northwood and Pinner",305 -E14000907,Runnymede and Weybridge,306 -E14000908,Rushcliffe,307 -E14000909,Rutland and Melton,308 -E14000910,Saffron Walden,309 -E14000911,Salford and Eccles,310 -E14000912,Salisbury,311 -E14000913,Scarborough and Whitby,312 -E14000914,Scunthorpe,313 -E14000915,Sedgefield,314 -E14000916,Sefton Central,315 -E14000917,Selby and Ainsty,316 -E14000918,Sevenoaks,317 -E14000919,Sheffield Central,318 -E14000920,Sheffield South East,319 -E14000921,"Sheffield, Brightside and Hillsborough",320 -E14000922,"Sheffield, Hallam",321 -E14000923,"Sheffield, Heeley",322 -E14000924,Sherwood,323 -E14000925,Shipley,324 -E14000926,Shrewsbury and Atcham,325 -E14000927,Sittingbourne and Sheppey,326 -E14000928,Skipton and Ripon,327 -E14000929,Sleaford and North Hykeham,328 -E14000730,Harrogate and Knaresborough,329 -E14000731,Harrow East,330 -E14000732,Harrow West,331 -E14000733,Hartlepool,332 -E14000734,Harwich and North Essex,333 -E14000735,Hastings and Rye,334 -E14000736,Havant,335 -E14000737,Hayes and Harlington,336 -E14000738,Hazel Grove,337 -E14000739,Hemel Hempstead,338 -E14000740,Hemsworth,339 -E14000741,Hendon,340 -E14000742,Henley,341 -E14000743,Hereford and South Herefordshire,342 -E14000744,Hertford and Stortford,343 -E14000745,Hertsmere,344 -E14000746,Hexham,345 -E14000747,Heywood and Middleton,346 -E14000748,High Peak,347 -E14000749,Hitchin and Harpenden,348 -E14000750,Holborn and St Pancras,349 -E14000751,Hornchurch and Upminster,350 -E14000752,Hornsey and Wood Green,351 -E14000753,Horsham,352 -E14000754,Houghton and Sunderland South,353 -E14000755,Hove,354 -E14000756,Huddersfield,355 -E14000757,Huntingdon,356 -E14000758,Hyndburn,357 -E14000759,Ilford North,358 -E14000760,Ilford South,359 -E14000761,Ipswich,360 -E14000762,Isle of Wight,361 -E14000763,Islington North,362 -E14000764,Islington South and Finsbury,363 -E14000765,Jarrow,364 -E14000766,Keighley,365 -E14000767,Kenilworth and Southam,366 -E14000768,Kensington,367 -E14000769,Kettering,368 -E14000770,Kingston and Surbiton,369 -E14000771,Kingston upon Hull East,370 -E14000772,Kingston upon Hull North,371 -E14000773,Kingston upon Hull West and Hessle,372 -E14000774,Kingswood,373 -E14000775,Knowsley,374 -E14000776,Lancaster and Fleetwood,375 -E14000777,Leeds Central,376 -E14000778,Leeds East,377 -E14000779,Leeds North East,378 -E14000708,Garston and Halewood,379 -E14000709,Gateshead,380 -E14000710,Gedling,381 -E14000711,Gillingham and Rainham,382 -E14000712,Gloucester,383 -E14000713,Gosport,384 -E14000714,Grantham and Stamford,385 -E14000715,Gravesham,386 -E14000716,Great Grimsby,387 -E14000717,Great Yarmouth,388 -E14000718,Greenwich and Woolwich,389 -E14000719,Guildford,390 -E14000720,Hackney North and Stoke Newington,391 -E14000721,Hackney South and Shoreditch,392 -E14000722,Halesowen and Rowley Regis,393 -E14000723,Halifax,394 -E14000724,Haltemprice and Howden,395 -E14000725,Halton,396 -E14000726,Hammersmith,397 -E14000727,Hampstead and Kilburn,398 -E14000728,Harborough,399 -E14000729,Harlow,400 -E14000930,Slough,401 -E14000931,Solihull,402 -E14000932,Somerton and Frome,403 -E14000933,South Basildon and East Thurrock,404 -E14000934,South Cambridgeshire,405 -E14000935,South Derbyshire,406 -E14000936,South Dorset,407 -E14000937,South East Cambridgeshire,408 -E14000938,South East Cornwall,409 -E14000939,South Holland and The Deepings,410 -E14000940,South Leicestershire,411 -E14000941,South Norfolk,412 -E14000942,South Northamptonshire,413 -E14000943,South Ribble,414 -E14000944,South Shields,415 -E14000945,South Staffordshire,416 -E14000946,South Suffolk,417 -E14000947,South Swindon,418 -E14000948,South Thanet,419 -E14000949,South West Bedfordshire,420 -E14000950,South West Devon,421 -E14000951,South West Hertfordshire,422 -E14000952,South West Norfolk,423 -E14000953,South West Surrey,424 -E14000954,South West Wiltshire,425 -E14000955,"Southampton, Itchen",426 -E14000956,"Southampton, Test",427 -E14000957,Southend West,428 -E14000958,Southport,429 -E14000959,Spelthorne,430 -E14000960,St Albans,431 -E14000961,St Austell and Newquay,432 -E14000962,St Helens North,433 -E14000963,St Helens South and Whiston,434 -E14000964,St Ives,435 -E14000965,Stafford,436 -E14000966,Staffordshire Moorlands,437 -E14000967,Stalybridge and Hyde,438 -E14000968,Stevenage,439 -E14000969,Stockport,440 -E14000970,Stockton North,441 -E14000971,Stockton South,442 -E14000972,Stoke-on-Trent Central,443 -E14000973,Stoke-on-Trent North,444 -E14000974,Stoke-on-Trent South,445 -E14000975,Stone,446 -E14000976,Stourbridge,447 -E14000977,Stratford-on-Avon,448 -E14000978,Streatham,449 -E14000979,Stretford and Urmston,450 -E14000980,Stroud,451 -E14000981,Suffolk Coastal,452 -E14000982,Sunderland Central,453 -E14000983,Surrey Heath,454 -E14000984,Sutton and Cheam,455 -E14000985,Sutton Coldfield,456 -E14000986,Tamworth,457 -E14000987,Tatton,458 -E14000988,Taunton Deane,459 -E14000989,Telford,460 -E14000990,Tewkesbury,461 -E14000991,The Cotswolds,462 -E14000992,The Wrekin,463 -E14000993,Thirsk and Malton,464 -E14000994,Thornbury and Yate,465 -E14000995,Thurrock,466 -E14000996,Tiverton and Honiton,467 -E14000997,Tonbridge and Malling,468 -E14000998,Tooting,469 -E14000999,Torbay,470 -E14001000,Torridge and West Devon,471 -E14001001,Totnes,472 -E14001002,Tottenham,473 -E14001003,Truro and Falmouth,474 -E14001004,Tunbridge Wells,475 -E14001005,Twickenham,476 -E14001006,Tynemouth,477 -E14001007,Uxbridge and South Ruislip,478 -E14001008,Vauxhall,479 -E14001009,Wakefield,480 -E14001010,Wallasey,481 -E14001011,Walsall North,482 -E14001012,Walsall South,483 -E14001013,Walthamstow,484 -E14001014,Wansbeck,485 -E14001015,Wantage,486 -E14001016,Warley,487 -E14001017,Warrington North,488 -E14001018,Warrington South,489 -E14001019,Warwick and Leamington,490 -E14001020,Washington and Sunderland West,491 -E14001021,Watford,492 -E14001022,Waveney,493 -E14001023,Wealden,494 -E14001024,Weaver Vale,495 -E14001025,Wellingborough,496 -E14001026,Wells,497 -E14001027,Welwyn Hatfield,498 -E14001028,Wentworth and Dearne,499 -E14001029,West Bromwich East,500 -E14001030,West Bromwich West,501 -E14001031,West Dorset,502 -E14001032,West Ham,503 -E14001033,West Lancashire,504 -E14001034,West Suffolk,505 -E14001035,West Worcestershire,506 -E14001036,Westminster North,507 -E14001037,Westmorland and Lonsdale,508 -E14001038,Weston-Super-Mare,509 -E14001039,Wigan,510 -E14001040,Wimbledon,511 -E14001041,Winchester,512 -E14001042,Windsor,513 -E14001043,Wirral South,514 -E14001044,Wirral West,515 -E14001045,Witham,516 -E14001046,Witney,517 -E14001047,Woking,518 -E14001048,Wokingham,519 -E14001049,Wolverhampton North East,520 -E14001050,Wolverhampton South East,521 -E14001051,Wolverhampton South West,522 -E14001052,Worcester,523 -E14001053,Workington,524 -E14001054,Worsley and Eccles South,525 -E14001055,Worthing West,526 -E14001056,Wycombe,527 -E14001057,Wyre and Preston North,528 -E14001058,Wyre Forest,529 -E14001059,Wythenshawe and Sale East,530 -E14001060,Yeovil,531 -E14001061,York Central,532 -E14001062,York Outer,533 -N06000001,Belfast East,534 -N06000002,Belfast North,535 -N06000003,Belfast South,536 -N06000004,Belfast West,537 -N06000005,East Antrim,538 -N06000006,East Londonderry,539 -N06000007,Fermanagh and South Tyrone,540 -N06000008,Foyle,541 -N06000009,Lagan Valley,542 -N06000010,Mid Ulster,543 -N06000011,Newry and Armagh,544 -N06000012,North Antrim,545 -N06000013,North Down,546 -N06000014,South Antrim,547 -N06000015,South Down,548 -N06000016,Strangford,549 -N06000017,Upper Bann,550 -S14000050,Ochil and South Perthshire,551 -S14000051,Orkney and Shetland,552 -S14000052,Paisley and Renfrewshire North,553 -S14000053,Paisley and Renfrewshire South,554 -S14000054,Perth and North Perthshire,555 -S14000055,"Ross, Skye and Lochaber",556 -S14000056,Rutherglen and Hamilton West,557 -S14000057,Stirling,558 -S14000058,West Aberdeenshire and Kincardine,559 -S14000059,West Dunbartonshire,560 -W07000041,Ynys Môn,561 -W07000042,Delyn,562 -W07000043,Alyn and Deeside,563 -W07000044,Wrexham,564 -W07000045,Llanelli,565 -W07000046,Gower,566 -W07000047,Swansea West,567 -W07000048,Swansea East,568 -W07000049,Aberavon,569 -W07000050,Cardiff Central,570 -W07000051,Cardiff North,571 -W07000052,Rhondda,572 -W07000053,Torfaen,573 -W07000054,Monmouth,574 -W07000055,Newport East,575 -W07000056,Newport West,576 -W07000057,Arfon,577 -W07000058,Aberconwy,578 -W07000059,Clwyd West,579 -W07000060,Vale of Clwyd,580 -W07000061,Dwyfor Meirionnydd,581 -W07000062,Clwyd South,582 -W07000063,Montgomeryshire,583 -W07000064,Ceredigion,584 -W07000065,Preseli Pembrokeshire,585 -W07000066,Carmarthen West and South Pembrokeshire,586 -W07000067,Carmarthen East and Dinefwr,587 -W07000068,Brecon and Radnorshire,588 -W07000069,Neath,589 -W07000070,Cynon Valley,590 -W07000071,Merthyr Tydfil and Rhymney,591 -W07000072,Blaenau Gwent,592 -W07000073,Bridgend,593 -W07000074,Ogmore,594 -W07000075,Pontypridd,595 -W07000076,Caerphilly,596 -W07000077,Islwyn,597 -W07000078,Vale of Glamorgan,598 -W07000079,Cardiff West,599 -W07000080,Cardiff South and Penarth,600 -N06000018,West Tyrone,601 -S14000001,Aberdeen North,602 -S14000002,Aberdeen South,603 -S14000003,Airdrie and Shotts,604 -S14000004,Angus,605 -S14000005,Argyll and Bute,606 -S14000006,"Ayr, Carrick and Cumnock",607 -S14000007,Banff and Buchan,608 -S14000008,"Berwickshire, Roxburgh and Selkirk",609 -S14000009,"Caithness, Sutherland and Easter Ross",610 -S14000010,Central Ayrshire,611 -S14000011,"Coatbridge, Chryston and Bellshill",612 -S14000012,"Cumbernauld, Kilsyth and Kirkintilloch East",613 -S14000013,Dumfries and Galloway,614 -S14000014,"Dumfriesshire, Clydesdale and Tweeddale",615 -S14000015,Dundee East,616 -S14000016,Dundee West,617 -S14000017,Dunfermline and West Fife,618 -S14000018,East Dunbartonshire,619 -S14000019,"East Kilbride, Strathaven and Lesmahagow",620 -S14000020,East Lothian,621 -S14000021,East Renfrewshire,622 -S14000022,Edinburgh East,623 -S14000023,Edinburgh North and Leith,624 -S14000024,Edinburgh South,625 -S14000025,Edinburgh South West,626 -S14000026,Edinburgh West,627 -S14000027,Na h-Eileanan an Iar,628 -S14000028,Falkirk,629 -S14000029,Glasgow Central,630 -S14000030,Glasgow East,631 -S14000031,Glasgow North,632 -S14000032,Glasgow North East,633 -S14000033,Glasgow North West,634 -S14000034,Glasgow South,635 -S14000035,Glasgow South West,636 -S14000036,Glenrothes,637 -S14000037,Gordon,638 -S14000038,Inverclyde,639 -S14000039,"Inverness, Nairn, Badenoch and Strathspey",640 -S14000040,Kilmarnock and Loudoun,641 -S14000041,Kirkcaldy and Cowdenbeath,642 -S14000042,Lanark and Hamilton East,643 -S14000043,Linlithgow and East Falkirk,644 -S14000044,Livingston,645 -S14000045,Midlothian,646 -S14000046,Moray,647 -S14000047,Motherwell and Wishaw,648 -S14000048,North Ayrshire and Arran,649 -S14000049,North East Fife,650 diff --git a/data_collection/local_authority.py b/data_collection/local_authority.py deleted file mode 100644 index 8b137891..00000000 --- a/data_collection/local_authority.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/data_collection/requirements.txt b/data_collection/requirements.txt deleted file mode 100644 index 12973ef7..00000000 --- a/data_collection/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -requests -python-dotenv -pandas -tqdm \ No newline at end of file diff --git a/model_data/__init__.py b/etl/__init__.py similarity index 100% rename from model_data/__init__.py rename to etl/__init__.py diff --git a/model_data/simulation_system/core/DataProcessor.py b/etl/epc/DataProcessor.py similarity index 66% rename from model_data/simulation_system/core/DataProcessor.py rename to etl/epc/DataProcessor.py index 439ce2e0..e9c84c3c 100644 --- a/model_data/simulation_system/core/DataProcessor.py +++ b/etl/epc/DataProcessor.py @@ -1,26 +1,61 @@ from pathlib import Path import numpy as np import pandas as pd -from model_data.BaseUtility import Definitions -from model_data.simulation_system.core.Settings import ( +from BaseUtility import Definitions +from etl.epc.settings import ( DATA_PROCESSOR_SETTINGS, EARLIEST_EPC_DATE, FULLY_GLAZED_DESCRIPTIONS, AVERAGE_FIXED_FEATURES, - FLOOR_LEVEL_MAP, BUILT_FORM_REMAP, COLUMNS_TO_MERGE_ON, - COMPONENT_FEATURES, FIXED_FEATURES, COLUMNTYPES, RDSAP_RESPONSE, MAX_SAP_SCORE, fill_na_map, - FIXED_DESCRIPTON_MAPPED_FEATURES + STARTING_SUFFIX_COMPONENT_COLS, + NO_SUFFIX_COMPONENT_COLS, + ENDING_SUFFIX_COMPONENT_COLS ) +from recommendations.rdsap_tables import FLOOR_LEVEL_MAP from typing import List +# These lookups are used to clean the construction age band +bounds_map = { + "England and Wales: before 1900": {"l": 0, "u": 1899}, + "England and Wales: 1930-1949": {"l": 1930, "u": 1949}, + "England and Wales: 1900-1929": {"l": 1900, "u": 1929}, + "England and Wales: 1950-1966": {"l": 1950, "u": 1966}, + "England and Wales: 1967-1975": {"l": 1967, "u": 1975}, + "England and Wales: 1976-1982": {"l": 1976, "u": 1982}, + "England and Wales: 1983-1990": {"l": 1983, "u": 1990}, + "England and Wales: 1991-1995": {"l": 1991, "u": 1995}, + "England and Wales: 1996-2002": {"l": 1996, "u": 2002}, + "England and Wales: 2003-2006": {"l": 2003, "u": 2006}, + "England and Wales: 2007-2011": {"l": 2007, "u": 2011}, + "England and Wales: 2012 onwards": {"l": 2012, "u": 3000}, +} + +remap = { + "England and Wales: 2007 onwards": "England and Wales: 2007-2011" +} + +expanded_map = { + i: [ + label for label, bounds in bounds_map.items() if (i <= bounds["u"]) and (i >= bounds['l']) + ][0] for i in range(0, 3001) +} + + +def is_int(x): + try: + int(x) + return True + except: + return False + class DataProcessor: """ @@ -46,66 +81,36 @@ class DataProcessor: def insert_data(self, data: pd.DataFrame) -> None: self.data = data + @staticmethod + def clean_construction_age_band(x): + # Firstly, we check if it's an error value + if x in Definitions.DATA_ANOMALY_MATCHES or x in [None, np.nan]: + return x + + # Next, we check if it's a value in our map + if bounds_map.get(x): + return x + + # We check if it's a standard remap value + remap_value = remap.get(x, None) + if remap_value: + return remap_value + + # We check if it's a number + if is_int(x): + x_int = int(x) + return expanded_map[x_int] + + raise NotImplementedError("Not handled the case for value %s" % x) + def standardise_construction_age_band(self): """ This function will tidy up some of the non-standard values that are populated in the construction age band, which is useful for cleaning """ - bounds_map = { - "England and Wales: before 1900": {"l": 0, "u": 1899}, - "England and Wales: 1930-1949": {"l": 1930, "u": 1949}, - "England and Wales: 1900-1929": {"l": 1900, "u": 1929}, - "England and Wales: 1950-1966": {"l": 1950, "u": 1966}, - "England and Wales: 1967-1975": {"l": 1967, "u": 1975}, - "England and Wales: 1976-1982": {"l": 1976, "u": 1982}, - "England and Wales: 1983-1990": {"l": 1983, "u": 1990}, - "England and Wales: 1991-1995": {"l": 1991, "u": 1995}, - "England and Wales: 1996-2002": {"l": 1996, "u": 2002}, - "England and Wales: 2003-2006": {"l": 2003, "u": 2006}, - "England and Wales: 2007-2011": {"l": 2007, "u": 2011}, - "England and Wales: 2012 onwards": {"l": 2012, "u": 3000}, - } - - remap = { - "England and Wales: 2007 onwards": "England and Wales: 2007-2011" - } - - expanded_map = { - i: [ - label for label, bounds in bounds_map.items() if (i <= bounds["u"]) and (i >= bounds['l']) - ][0] for i in range(0, 3001) - } - - def is_int(x): - try: - int(x) - return True - except: - return False - - def clean_construction_age_band(x): - # Firstly, we check if it's an error value - if x in Definitions.DATA_ANOMALY_MATCHES or x in [None, np.nan]: - return x - - # Next, we check if it's a value in our map - if bounds_map.get(x): - return x - - # We check if it's a standard remap value - remap_value = remap.get(x, None) - if remap_value: - return remap_value - - # We check if it's a number - if is_int(x): - x_int = int(x) - return expanded_map[x_int] - - raise NotImplementedError("Not handled the case for value %s" % x) self.data["CONSTRUCTION_AGE_BAND"] = self.data["CONSTRUCTION_AGE_BAND"].apply( - lambda x: clean_construction_age_band(x) + lambda x: self.clean_construction_age_band(x) ) self.data = self.data[ @@ -157,18 +162,6 @@ class DataProcessor: break to_index -= 1 - def reformat_columns(self): - """ - This function applies the re-formattng of columns from lower case to capitalised - - When requesting the epc data from the api, the columns are lower case - and separated by a hyphen, whereas in the bulk download, the columns - are capitalised and separated by underscores. If rename_columns is True - we convert the columns from lower case to capitalised format - :return: - """ - self.data.columns = [col.upper().replace("-", "_") for col in self.data.columns] - def pre_process(self) -> pd.DataFrame: """ Load data and begin initial cleaning @@ -176,22 +169,24 @@ class DataProcessor: if self.data is None: self.load_data(low_memory=DATA_PROCESSOR_SETTINGS["low_memory"]) - if self.newdata: - self.reformat_columns() - if not self.newdata: self.confine_data() self.remap_columns() # We have some non-standard construction age bands which we'll clean for matching - self.standardise_construction_age_band() - self.clean_missing_rooms() + if not self.newdata: + self.standardise_construction_age_band() + + self.clean_missing_rooms() self.recast_df_columns( column_mappings=DATA_PROCESSOR_SETTINGS["column_mappings"] ) - self.clean_multi_glaze_proportion() + + if not self.newdata: + self.clean_multi_glaze_proportion() + self.clean_photo_supply() if not self.newdata: @@ -203,16 +198,24 @@ class DataProcessor: # If we have multiple EPC records, we can try and do filling self.fill_na_fields() - self.data = self.data.sort_values(["UPRN", "LODGEMENT_DATE"], ascending=True) + if not self.newdata: + self.data = self.data.sort_values(["UPRN", "LODGEMENT_DATE"], ascending=True) + # Final re-casting after data transformed and prepared - self.data = self.data.astype(COLUMNTYPES) + coltypes = {k: v for k, v in COLUMNTYPES.items() if k in self.data.columns} if self.newdata else COLUMNTYPES + self.data = self.data.astype(coltypes) self.na_remapping() return self.data def na_remapping(self): - for column, fill_value in fill_na_map.items(): + + fill_na_map_apply = { + k: v for k, v in fill_na_map.items() if k in self.data.columns + } if self.newdata else fill_na_map + + for column, fill_value in fill_na_map_apply.items(): self.data[column] = self.data[column].fillna(fill_value) def fill_na_fields(self, columns_to_fill: List = COLUMNS_TO_MERGE_ON): @@ -255,7 +258,8 @@ class DataProcessor: data = data.replace(np.NAN, None) # Remap certain columns - data["FLOOR_LEVEL"] = data["FLOOR_LEVEL"].replace(FLOOR_LEVEL_MAP) + if not self.newdata: + data["FLOOR_LEVEL"] = data["FLOOR_LEVEL"].replace(FLOOR_LEVEL_MAP) data["BUILT_FORM"] = data["BUILT_FORM"].replace(BUILT_FORM_REMAP) convert_to_lower = ["TRANSACTION_TYPE"] @@ -348,7 +352,7 @@ class DataProcessor: cleaning_averages_filled = cleaning_averages_filled.drop(columns=f"{variable}_BUILT_FORM_AVERAGE") - # If there still is na values, use average across all properties in consituecy + # If there still is na values, use average across all epc in consituecy cleaning_averages_filled[variable] = cleaning_averages_filled[ variable ].fillna(cleaning_averages_filled[variable].mean()) @@ -497,9 +501,15 @@ class DataProcessor: """ if suffix not in ["_STARTING", "_ENDING"]: - raise Exception("Suffix should be one of _STARTING or _ENFING") + raise Exception("Suffix should be one of _STARTING or _ENDING") - return self.data[COMPONENT_FEATURES + ["LODGEMENT_DATE"]].copy().add_suffix(suffix) + if suffix == "_STARTING": + starting_cols = self.data[STARTING_SUFFIX_COMPONENT_COLS].copy().add_suffix(suffix) + fixed_cols = self.data[NO_SUFFIX_COMPONENT_COLS].copy() + + return pd.concat([starting_cols, fixed_cols], axis=1) + + return self.data[ENDING_SUFFIX_COMPONENT_COLS].copy().add_suffix(suffix) def get_fixed_features(self) -> pd.DataFrame: """ @@ -529,125 +539,33 @@ class DataProcessor: return df - @classmethod - def difference_data(cls, df: pd.DataFrame): + @staticmethod + def calculate_days_to(lodgement_date): - """ - Given a dataframe and starting and ending columns, this function will convert the features to - differenced the ending subtract the starting value, which is useful for modelling the difference responces - """ + if isinstance(lodgement_date, str): + return ( + pd.to_datetime(lodgement_date) - pd.to_datetime(EARLIEST_EPC_DATE) + ).days - # We ensure that the u value columns are co-erced to a numerical format - uvalue_columns = [col for col in df.columns if "thermal_transmittance" in col] - for uvalue_col in uvalue_columns: - df[uvalue_col] = pd.to_numeric(df[uvalue_col]) + return ( + pd.to_datetime(lodgement_date) - pd.to_datetime(EARLIEST_EPC_DATE) + ).dt.days - key_columns = [ - "RDSAP_CHANGE", "HEAT_DEMAND_CHANGE", "CARBON_CHANGE", - "SAP_STARTING", "HEAT_DEMAND_STARTING", - "CARBON_STARTING", "UPRN", "CONSTITUENCY", - "SAP_ENDING", "CARBON_ENDING", "HEAT_DEMAND_ENDING", - "DAYS_TO_STARTING", "DAYS_TO_ENDING" - ] + @staticmethod + def clean_missings_after_description_process(df, ignore_cols=None): + missings = pd.isnull(df).sum() + missings = missings[missings > 0] - ignore_cols = FIXED_FEATURES + FIXED_DESCRIPTON_MAPPED_FEATURES + key_columns + if ignore_cols: + missings = missings[~missings.index.isin(ignore_cols)] - columns = {x for x in df.columns if x not in ignore_cols} - - non_numerical_columns = df.select_dtypes(exclude=['number']).columns.tolist() - non_numerical_columns = [col for col in non_numerical_columns if col in columns] - levels = {col: df[col].unique().tolist() for col in non_numerical_columns} - - df = pd.get_dummies(df, columns=non_numerical_columns) - - # We make sure there is a starting and ending version of the column - diff_columns = [] - no_diff_columns = [] # Store for debugging - for col in columns: - if "_ENDING" in col: - # Don't keep the endings - continue + for col in missings.index: + unique_values = df[col].unique() + if True in unique_values or False in unique_values: + df[col] = df[col].fillna(False) + if "none" in unique_values: + df[col] = df[col].fillna("none") else: - # We have a starting column so check if we have an ending - if col.replace("_STARTING", "") + "_ENDING" in columns: - diff_columns.append(col) - else: - no_diff_columns.append(col) - - if any(c not in FIXED_DESCRIPTON_MAPPED_FEATURES for c in no_diff_columns): - raise Exception("Something went wrong, potentially missed a differencing column") - - datatypes = df.dtypes - - # Note: We also difference columns like floor area and floor height. We should experiement with this. - # Starting floor area will heavily impact the starting sap value so that feature may be encapsulated by - # the starting value, therefore to explain any differences in the new floor area, it may be enough to - # just consider the difference however we can play around with this. - - # Do the differencing - cols_to_append = {} - for starting_col in diff_columns: - - base_col = starting_col.replace("_STARTING", "") - - if "_STARTING" in starting_col: - ending_col = starting_col.replace("_STARTING", "_ENDING") - else: - ending_col = starting_col + "_ENDING" - - if starting_col not in non_numerical_columns: - cols_to_append[f"{base_col}_DIFF"] = df[ending_col] - df[starting_col] - df = df.drop(columns=[starting_col, ending_col]) - continue - - level_values = list(set(levels[starting_col] + levels[ending_col])) - - level_cols = [] - for level in level_values: - starting_level_col = "_".join([starting_col, str(level)]) - ending_level_col = "_".join([ending_col, str(level)]) - - if starting_level_col not in df.columns: - # We have no starting, just ending - col_type = datatypes[ending_level_col].name - - if col_type == "bool": - cols_to_append[f"{base_col}_{level}_DIFF"] = df[ending_level_col].astype(int) - else: - cols_to_append[f"{base_col}_{level}_DIFF"] = df[ending_level_col] - - level_cols.append(ending_level_col) - - elif ending_level_col not in df.columns: - # We have no ending, just starting - col_type = datatypes[starting_level_col].name - - if col_type == "bool": - cols_to_append[f"{base_col}_{level}_DIFF"] = -1 * df[starting_level_col].astype(int) - else: - cols_to_append[f"{base_col}_{level}_DIFF"] = -1 * df[ending_level_col] - - level_cols.append(starting_level_col) - - else: - col_type = datatypes[starting_level_col].name - - if col_type == "bool": - cols_to_append[f"{base_col}_{level}_DIFF"] = ( - df[ending_level_col].astype(int) - df[starting_level_col].astype(int) - ) - else: - cols_to_append[f"{base_col}_{level}_DIFF"] = df[ending_level_col] - df[starting_level_col] - - level_cols.extend([starting_level_col, ending_level_col]) - - # Drop the columns - df = df.drop(columns=level_cols) - - cols_to_append = pd.DataFrame(cols_to_append) - df = pd.concat([df, cols_to_append], axis=1) - - # Perform a final coercing of string True/False columns to boolean - df = cls.coerce_boolean_columns(df, cols_to_ignore=key_columns) + df[col] = df[col].fillna("Unknown") return df diff --git a/model_data/simulation_system/core/FeatureProcessor.py b/etl/epc/FeatureProcessor.py similarity index 100% rename from model_data/simulation_system/core/FeatureProcessor.py rename to etl/epc/FeatureProcessor.py diff --git a/model_data/analysis/__init__.py b/etl/epc/__init__.py similarity index 100% rename from model_data/analysis/__init__.py rename to etl/epc/__init__.py diff --git a/model_data/simulation_system/generate_rdsap_change.py b/etl/epc/property_change_app.py similarity index 93% rename from model_data/simulation_system/generate_rdsap_change.py rename to etl/epc/property_change_app.py index b317e52c..d7dce61c 100644 --- a/model_data/simulation_system/generate_rdsap_change.py +++ b/etl/epc/property_change_app.py @@ -4,25 +4,24 @@ from tqdm import tqdm import msgpack from pathlib import Path -from model_data.simulation_system.core.Settings import ( +from etl.epc.settings import ( MANDATORY_FIXED_FEATURES, LATEST_FIELD, COMPONENT_FEATURES, RDSAP_RESPONSE, HEAT_DEMAND_RESPONSE, COLUMNS_TO_MERGE_ON, - EARLIEST_EPC_DATE, CARBON_RESPONSE, ) -from model_data.simulation_system.core.DataProcessor import DataProcessor -from utils.s3 import save_dataframe_to_s3_parquet, read_from_s3, read_dataframe_from_s3_parquet +from etl.epc.DataProcessor import DataProcessor +from utils.s3 import save_dataframe_to_s3_parquet, read_from_s3 from recommendations.rdsap_tables import england_wales_age_band_lookup from recommendations.recommendation_utils import ( get_wall_u_value, get_roof_u_value, get_floor_u_value, estimate_perimeter, get_wall_type ) -DATA_DIRECTORY = Path(__file__).parent / "model_data" / "simulation_system" / "data" / "all-domestic-certificates" +DATA_DIRECTORY = Path(__file__).parent / "local_data" / "all-domestic-certificates" def get_cleaned(): @@ -364,21 +363,6 @@ def make_uvalues(df): return df -def clean_missings_after_description_process(df): - missings = pd.isnull(df).sum() - missings = missings[missings > 0] - for col in missings.index: - unique_values = df[col].unique() - if True in unique_values or False in unique_values: - df[col] = df[col].fillna(False) - if "none" in unique_values: - df[col] = df[col].fillna("none") - else: - df[col] = df[col].fillna("Unknown") - - return df - - def app(): # Get all the files in the directory @@ -400,6 +384,8 @@ def app(): data_processor = DataProcessor(filepath=filepath) df = data_processor.pre_process() + df[df["WALLS_DESCRIPTION"].str.contains("Cavity")]["WALLS_DESCRIPTION"].unique() + cleaning_averages = data_processor.make_cleaning_averages() # We have some odd cases with missing constituency so we fill @@ -512,12 +498,11 @@ def app(): # Add some temporal features - we look at the days from the standard starting point in time # for the starting and ending date so all records are from a fixed point - data_by_urpn_df["DAYS_TO_STARTING"] = ( - pd.to_datetime(data_by_urpn_df["LODGEMENT_DATE_STARTING"]) - pd.to_datetime(EARLIEST_EPC_DATE) - ).dt.days - data_by_urpn_df["DAYS_TO_ENDING"] = ( - pd.to_datetime(data_by_urpn_df["LODGEMENT_DATE_ENDING"]) - pd.to_datetime(EARLIEST_EPC_DATE) - ).dt.days + data_by_urpn_df["DAYS_TO_STARTING"] = DataProcessor.calculate_days_to( + data_by_urpn_df["LODGEMENT_DATE_STARTING"]) + + data_by_urpn_df["DAYS_TO_ENDING"] = DataProcessor.calculate_days_to( + data_by_urpn_df["LODGEMENT_DATE_ENDING"]) data_by_urpn_df = data_by_urpn_df.drop(columns=["LODGEMENT_DATE_STARTING", "LODGEMENT_DATE_ENDING"]) @@ -544,7 +529,7 @@ def app(): # Those nulls should be False. clean_missings_after_description_process handles this but shouldn't # need to - data_by_urpn_df = clean_missings_after_description_process(data_by_urpn_df) + data_by_urpn_df = DataProcessor.clean_missings_after_description_process(data_by_urpn_df) if pd.isnull(data_by_urpn_df).sum().sum(): raise ValueError("Null values found in dataset after process_and_prune_desriptions") @@ -564,6 +549,12 @@ def app(): output = pd.concat(dataset) + # Remove any records that have huge swings in their floor area + output["tfa_diff_abs"] = abs(output["TOTAL_FLOOR_AREA_ENDING"] - output["TOTAL_FLOOR_AREA_STARTING"]) + output["tfa_diff_prop"] = output["tfa_diff_abs"] / output["TOTAL_FLOOR_AREA_STARTING"] + output = output[output["tfa_diff_prop"] < 0.5] + output = output.drop(columns=["tfa_diff_abs", "tfa_diff_prop"]) + uvalue_columns = [col for col in output.columns if "thermal_transmittance" in col] for uvalue_col in uvalue_columns: output[uvalue_col] = pd.to_numeric(output[uvalue_col]) @@ -571,15 +562,7 @@ def app(): save_dataframe_to_s3_parquet( df=output, bucket_name="retrofit-data-dev", - file_key="sap_change_model/dataset_without_differencing.parquet", - ) - - output = DataProcessor.difference_data(output) - - save_dataframe_to_s3_parquet( - df=output, - bucket_name="retrofit-data-dev", - file_key="sap_change_model/dataset_with_differencing.parquet", + file_key="sap_change_model/dataset.parquet", ) diff --git a/land_registry/app.py b/etl/epc/requirements.txt similarity index 100% rename from land_registry/app.py rename to etl/epc/requirements.txt diff --git a/model_data/simulation_system/core/Settings.py b/etl/epc/settings.py similarity index 51% rename from model_data/simulation_system/core/Settings.py rename to etl/epc/settings.py index 8b5252c5..fb8e464d 100644 --- a/model_data/simulation_system/core/Settings.py +++ b/etl/epc/settings.py @@ -133,28 +133,6 @@ RDSAP_RESPONSE = "CURRENT_ENERGY_EFFICIENCY" HEAT_DEMAND_RESPONSE = "ENERGY_CONSUMPTION_CURRENT" CARBON_RESPONSE = "CO2_EMISSIONS_CURRENT" - -def ordinal(n): - if 10 <= n % 100 <= 20: - suffix = "th" - else: - suffix = {1: "st", 2: "nd", 3: "rd"}.get(n % 10, "th") - - return str(n) + suffix - - -FLOOR_LEVEL_MAP = { - "Basement": -1, - "Ground": 0, - "ground floor": 0, - "20+": 20, - "21st or above": 21, - **{str(i).zfill(2): i for i in range(0, 21)}, - **{ordinal(i): i for i in range(-1, 21)}, - **{str(i): i for i in range(-1, 21)}, - **{i: i for i in range(-1, 21)}, -} - BUILT_FORM_REMAP = { "Enclosed End-Terrace": "End-Terrace", "Enclosed Mid-Terrace": "Mid-Terrace", @@ -212,10 +190,66 @@ fill_na_map = { "NUMBER_OPEN_FIREPLACES": 0 } -# After the property descriptions have been re-remapped, we expect these features to be fixed -FIXED_DESCRIPTON_MAPPED_FEATURES = [ - 'another_property_below', 'is_roof_room', 'is_granite_or_whinstone', 'is_flat', 'is_suspended', - 'has_dwelling_above', 'is_as_built', 'is_to_external_air', 'is_cob', 'is_pitched', 'is_solid', 'is_at_rafters', - 'is_solid_brick', 'is_loft', 'is_system_built', 'is_timber_frame', 'is_sandstone_or_limestone', 'is_filled_cavity', - 'is_cavity_wall', 'is_thatched', 'is_to_unheated_space' +################################################################################################ +# These are the features we need for scoring +# We'll likely change how we do this in the future +################################################################################################ + +STARTING_SUFFIX_COMPONENT_COLS = [ + "SAP", "HEAT_DEMAND", "CARBON", "TRANSACTION_TYPE", "MECHANICAL_VENTILATION", + "SECONDHEAT_DESCRIPTION", "ENERGY_TARIFF", "SOLAR_WATER_HEATING_FLAG", "PHOTO_SUPPLY", + "GLAZED_TYPE", "MULTI_GLAZE_PROPORTION", "LOW_ENERGY_LIGHTING", "NUMBER_OPEN_FIREPLACES", + "EXTENSION_COUNT", "TOTAL_FLOOR_AREA", "FLOOR_HEIGHT", "DAYS_TO", "estimated_perimeter" +] +NO_SUFFIX_COMPONENT_COLS = ['walls_thermal_transmittance', 'is_cavity_wall', + 'is_filled_cavity', 'is_solid_brick', 'is_system_built', 'is_timber_frame', + 'is_granite_or_whinstone', 'is_as_built', 'is_cob', 'is_sandstone_or_limestone', + 'is_park_home', 'walls_insulation_thickness', 'external_insulation', 'internal_insulation', + 'floor_thermal_transmittance', 'is_to_unheated_space', 'is_to_external_air', 'is_suspended', + 'is_solid', 'another_property_below', 'floor_insulation_thickness', + 'roof_thermal_transmittance', 'is_pitched', 'is_roof_room', 'is_loft', 'is_flat', + 'is_thatched', 'is_at_rafters', 'has_dwelling_above', 'roof_insulation_thickness', + 'heater_type', 'system_type', 'thermostat_characteristics', 'heating_scope', + 'energy_recovery', + 'hotwater_tariff_type', 'extra_features', 'chp_systems', 'distribution_system', + 'no_system_present', 'appliance', 'has_radiators', 'has_fan_coil_units', + 'has_pipes_in_screed_above_insulation', 'has_pipes_in_insulated_timber_floor', + 'has_pipes_in_concrete_slab', 'has_boiler', 'has_air_source_heat_pump', 'has_room_heaters', + 'has_electric_storage_heaters', 'has_warm_air', 'has_electric_underfloor_heating', + 'has_electric_ceiling_heating', 'has_community_scheme', 'has_ground_source_heat_pump', + 'has_no_system_present', 'has_portable_electric_heaters', 'has_water_source_heat_pump', + 'has_electric_heat_pump', 'has_micro-cogeneration', 'has_solar_assisted_heat_pump', + 'has_exhaust_source_heat_pump', 'has_community_heat_pump', 'has_electric', 'has_mains_gas', + 'has_wood_logs', 'has_coal', 'has_oil', 'has_wood_pellets', 'has_anthracite', + 'has_dual_fuel_mineral_and_wood', 'has_smokeless_fuel', 'has_lpg', 'has_b30k', + 'has_electricaire', 'has_assumed_for_most_rooms', 'has_underfloor_heating', + 'thermostatic_control', 'charging_system', 'switch_system', 'no_control', 'dhw_control', + 'community_heating', 'multiple_room_thermostats', 'auxiliary_systems', 'trvs', + 'rate_control', + 'glazing_type', 'fuel_type', 'main-fuel_tariff_type', 'is_community', + 'no_individual_heating_or_community_network', 'complex_fuel_type', + ] + +ENDING_SUFFIX_COMPONENT_COLS = [ + 'SAP', 'HEAT_DEMAND', 'CARBON', 'TRANSACTION_TYPE', 'MECHANICAL_VENTILATION', 'SECONDHEAT_DESCRIPTION', + 'ENERGY_TARIFF', 'SOLAR_WATER_HEATING_FLAG', 'PHOTO_SUPPLY', 'GLAZED_TYPE', 'MULTI_GLAZE_PROPORTION', + 'LOW_ENERGY_LIGHTING', 'NUMBER_OPEN_FIREPLACES', 'EXTENSION_COUNT', 'TOTAL_FLOOR_AREA', 'FLOOR_HEIGHT', + 'DAYS_TO', 'walls_thermal_transmittance', 'is_park_home', 'walls_insulation_thickness', + 'external_insulation', 'internal_insulation', 'floor_thermal_transmittance', 'floor_insulation_thickness', + 'roof_thermal_transmittance', 'roof_insulation_thickness', 'heater_type', 'system_type', + 'thermostat_characteristics', 'heating_scope', 'energy_recovery', 'hotwater_tariff_type', 'extra_features', + 'chp_systems', 'distribution_system', 'no_system_present', 'appliance', 'has_radiators', + 'has_fan_coil_units', 'has_pipes_in_screed_above_insulation', 'has_pipes_in_insulated_timber_floor', + 'has_pipes_in_concrete_slab', 'has_boiler', 'has_air_source_heat_pump', 'has_room_heaters', + 'has_electric_storage_heaters', 'has_warm_air', 'has_electric_underfloor_heating', + 'has_electric_ceiling_heating', 'has_community_scheme', 'has_ground_source_heat_pump', + 'has_no_system_present', 'has_portable_electric_heaters', 'has_water_source_heat_pump', + 'has_electric_heat_pump', 'has_micro-cogeneration', 'has_solar_assisted_heat_pump', + 'has_exhaust_source_heat_pump', 'has_community_heat_pump', 'has_electric', 'has_mains_gas', 'has_wood_logs', + 'has_coal', 'has_oil', 'has_wood_pellets', 'has_anthracite', 'has_dual_fuel_mineral_and_wood', + 'has_smokeless_fuel', 'has_lpg', 'has_b30k', 'has_electricaire', 'has_assumed_for_most_rooms', + 'has_underfloor_heating', 'thermostatic_control', 'charging_system', 'switch_system', 'no_control', + 'dhw_control', 'community_heating', 'multiple_room_thermostats', 'auxiliary_systems', 'trvs', + 'rate_control', 'glazing_type', 'fuel_type', 'main-fuel_tariff_type', 'is_community', + 'no_individual_heating_or_community_network', 'complex_fuel_type', 'estimated_perimeter' ] diff --git a/model_data/EpcClean.py b/etl/epc_clean/EpcClean.py similarity index 83% rename from model_data/EpcClean.py rename to etl/epc_clean/EpcClean.py index 9d3c4d74..10b5095d 100644 --- a/model_data/EpcClean.py +++ b/etl/epc_clean/EpcClean.py @@ -4,16 +4,16 @@ from collections import defaultdict import pandas as pd -from model_data.utils import correct_spelling -from model_data.epc_attributes.FloorAttributes import FloorAttributes -from model_data.epc_attributes.HotWaterAttributes import HotWaterAttributes -from model_data.epc_attributes.MainFuelAttributes import MainFuelAttributes -from model_data.epc_attributes.MainheatAttributes import MainHeatAttributes -from model_data.epc_attributes.MainheatControlAttributes import MainheatControlAttributes -from model_data.epc_attributes.RoofAttributes import RoofAttributes -from model_data.epc_attributes.WallAttributes import WallAttributes -from model_data.epc_attributes.WindowAttributes import WindowAttributes -from model_data.epc_attributes.LightingAttributes import LightingAttributes +from etl.epc_clean.utils import correct_spelling +from etl.epc_clean.epc_attributes.FloorAttributes import FloorAttributes +from etl.epc_clean.epc_attributes.HotWaterAttributes import HotWaterAttributes +from etl.epc_clean.epc_attributes.MainFuelAttributes import MainFuelAttributes +from etl.epc_clean.epc_attributes.MainheatAttributes import MainHeatAttributes +from etl.epc_clean.epc_attributes.MainheatControlAttributes import MainheatControlAttributes +from etl.epc_clean.epc_attributes.RoofAttributes import RoofAttributes +from etl.epc_clean.epc_attributes.WallAttributes import WallAttributes +from etl.epc_clean.epc_attributes.WindowAttributes import WindowAttributes +from etl.epc_clean.epc_attributes.LightingAttributes import LightingAttributes class EpcClean: @@ -130,7 +130,7 @@ class EpcClean: self.cleaned[field].append( { "original_description": description, - "clean_description": cln.description.capitalize(), + "clean_description": cln.description.replace("(assumed)", "").rstrip().capitalize(), **cln.process() } ) diff --git a/model_data/plotting/__init__.py b/etl/epc_clean/__init__.py similarity index 100% rename from model_data/plotting/__init__.py rename to etl/epc_clean/__init__.py diff --git a/model_data/cleaner_app.py b/etl/epc_clean/app.py similarity index 82% rename from model_data/cleaner_app.py rename to etl/epc_clean/app.py index 40011404..593559e0 100644 --- a/model_data/cleaner_app.py +++ b/etl/epc_clean/app.py @@ -3,8 +3,8 @@ import os import pandas as pd import msgpack -from model_data.EpcClean import EpcClean -from model_data.simulation_system.core.Settings import EARLIEST_EPC_DATE +from etl.epc_clean.EpcClean import EpcClean +from etl.epc.settings import EARLIEST_EPC_DATE from pathlib import Path from utils.s3 import save_data_to_s3 @@ -19,7 +19,7 @@ LAND_REGISTRY_PATHS = [ os.path.abspath(os.path.dirname(__file__)) + "/model_data/local_data/pp-2017-part2.csv", ] -EPC_DIRECTORY = Path(__file__).parent / "model_data" / "simulation_system" / "data" / "all-domestic-certificates" +EPC_DIRECTORY = Path(__file__).parent / "local_data" / "all-domestic-certificates" ENVIRONMENT = os.getenv("ENVIRONMENT", "dev") @@ -27,7 +27,7 @@ ENVIRONMENT = os.getenv("ENVIRONMENT", "dev") def app(): """ For a pre-defined list of constituencies and property data_types, we'll download EPC data from the API - and produce a dataset of cleaned fields so that when we get new properties, we can quickly + and produce a dataset of cleaned fields so that when we get new epc, we can quickly sanitise any description data Currently, this application is just run on a local machine @@ -36,9 +36,6 @@ def app(): cleaned_data = {} epc_directories = [entry for entry in EPC_DIRECTORY.iterdir() if entry.is_dir()] for directory in tqdm(epc_directories): - directory_destructured = str(directory).split("/")[-1].split("-") - gss_code = directory_destructured[1] - local_authority = directory_destructured[2] data = pd.read_csv(directory / "certificates.csv", low_memory=False) # Rename the columns to the same format as the api returns @@ -62,14 +59,6 @@ def app(): new_data = [x for x in data if x["original_description"] not in existing_descriptions] cleaned_data[k].extend(new_data) - # TODO: Add property age band into this - # uvalue_estimates = UvalueEstimations(data=data) - # uvalue_estimates.get_estimates(cleaner=cleaner) - # # TODO: Store these to a s3 - # uvalue_estimates.walls - # uvalue_estimates.floors - # uvalue_estimates.roofs - # Basic check to make sure all descriptions are unique for _, cleaned in cleaned_data.items(): descriptions = [x["original_description"] for x in cleaned] diff --git a/model_data/epc_attributes/FloorAttributes.py b/etl/epc_clean/epc_attributes/FloorAttributes.py similarity index 96% rename from model_data/epc_attributes/FloorAttributes.py rename to etl/epc_clean/epc_attributes/FloorAttributes.py index 847b183a..6631b4d5 100644 --- a/model_data/epc_attributes/FloorAttributes.py +++ b/etl/epc_clean/epc_attributes/FloorAttributes.py @@ -1,7 +1,7 @@ import re from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import extract_thermal_transmittance, extract_component_types +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import extract_thermal_transmittance, extract_component_types class FloorAttributes(Definitions): diff --git a/model_data/epc_attributes/HotWaterAttributes.py b/etl/epc_clean/epc_attributes/HotWaterAttributes.py similarity index 98% rename from model_data/epc_attributes/HotWaterAttributes.py rename to etl/epc_clean/epc_attributes/HotWaterAttributes.py index c7353ab2..e8bce0bb 100644 --- a/model_data/epc_attributes/HotWaterAttributes.py +++ b/etl/epc_clean/epc_attributes/HotWaterAttributes.py @@ -1,6 +1,6 @@ from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import clean_description, find_keyword +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import clean_description, find_keyword class HotWaterAttributes(Definitions): diff --git a/model_data/epc_attributes/LightingAttributes.py b/etl/epc_clean/epc_attributes/LightingAttributes.py similarity index 95% rename from model_data/epc_attributes/LightingAttributes.py rename to etl/epc_clean/epc_attributes/LightingAttributes.py index 83e9ef5f..0fe3db16 100644 --- a/model_data/epc_attributes/LightingAttributes.py +++ b/etl/epc_clean/epc_attributes/LightingAttributes.py @@ -1,6 +1,6 @@ import re -from model_data.epc_attributes.attribute_utils import clean_description -from model_data.utils import correct_spelling +from etl.epc_clean.epc_attributes.attribute_utils import clean_description +from etl.epc_clean.utils import correct_spelling class LightingAttributes: @@ -27,7 +27,7 @@ class LightingAttributes: lel_match2 = re.search(r"goleuadau ynni-isel mewn (\d+)%? o'r mannau gosod", self.description) if lel_match is not None or lel_match2 is not None: - + # Perform the actual translation percentage = lel_match.group(1) if lel_match is not None else lel_match2.group(1) self.description = f"low energy lighting in {percentage}% of fixed outlets" diff --git a/model_data/epc_attributes/MainFuelAttributes.py b/etl/epc_clean/epc_attributes/MainFuelAttributes.py similarity index 96% rename from model_data/epc_attributes/MainFuelAttributes.py rename to etl/epc_clean/epc_attributes/MainFuelAttributes.py index 35059865..72b86482 100644 --- a/model_data/epc_attributes/MainFuelAttributes.py +++ b/etl/epc_clean/epc_attributes/MainFuelAttributes.py @@ -1,6 +1,6 @@ from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import clean_description, remove_punctuation, find_keyword +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import clean_description, remove_punctuation, find_keyword class MainFuelAttributes(Definitions): diff --git a/model_data/epc_attributes/MainheatAttributes.py b/etl/epc_clean/epc_attributes/MainheatAttributes.py similarity index 98% rename from model_data/epc_attributes/MainheatAttributes.py rename to etl/epc_clean/epc_attributes/MainheatAttributes.py index 9471ee1d..e21f0d37 100644 --- a/model_data/epc_attributes/MainheatAttributes.py +++ b/etl/epc_clean/epc_attributes/MainheatAttributes.py @@ -1,5 +1,5 @@ -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import clean_description, process_part, switch_chars +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import clean_description, process_part, switch_chars from typing import Dict, Union diff --git a/model_data/epc_attributes/MainheatControlAttributes.py b/etl/epc_clean/epc_attributes/MainheatControlAttributes.py similarity index 98% rename from model_data/epc_attributes/MainheatControlAttributes.py rename to etl/epc_clean/epc_attributes/MainheatControlAttributes.py index 64f5afba..23f39d08 100644 --- a/model_data/epc_attributes/MainheatControlAttributes.py +++ b/etl/epc_clean/epc_attributes/MainheatControlAttributes.py @@ -1,6 +1,6 @@ from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import clean_description, find_keyword +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import clean_description, find_keyword class MainheatControlAttributes(Definitions): diff --git a/model_data/epc_attributes/RoofAttributes.py b/etl/epc_clean/epc_attributes/RoofAttributes.py similarity index 97% rename from model_data/epc_attributes/RoofAttributes.py rename to etl/epc_clean/epc_attributes/RoofAttributes.py index c83ad98a..9e400235 100644 --- a/model_data/epc_attributes/RoofAttributes.py +++ b/etl/epc_clean/epc_attributes/RoofAttributes.py @@ -1,7 +1,7 @@ import re from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import extract_component_types, extract_thermal_transmittance +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import extract_component_types, extract_thermal_transmittance class RoofAttributes(Definitions): diff --git a/model_data/epc_attributes/WallAttributes.py b/etl/epc_clean/epc_attributes/WallAttributes.py similarity index 98% rename from model_data/epc_attributes/WallAttributes.py rename to etl/epc_clean/epc_attributes/WallAttributes.py index e2f7be07..03fe6d67 100644 --- a/model_data/epc_attributes/WallAttributes.py +++ b/etl/epc_clean/epc_attributes/WallAttributes.py @@ -1,7 +1,7 @@ import re from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import ( +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import ( extract_component_types, extract_thermal_transmittance ) diff --git a/model_data/epc_attributes/WindowAttributes.py b/etl/epc_clean/epc_attributes/WindowAttributes.py similarity index 96% rename from model_data/epc_attributes/WindowAttributes.py rename to etl/epc_clean/epc_attributes/WindowAttributes.py index 361df4d9..e962cd31 100644 --- a/model_data/epc_attributes/WindowAttributes.py +++ b/etl/epc_clean/epc_attributes/WindowAttributes.py @@ -1,6 +1,6 @@ from typing import Dict, Union -from model_data.BaseUtility import Definitions -from model_data.epc_attributes.attribute_utils import clean_description +from BaseUtility import Definitions +from etl.epc_clean.epc_attributes.attribute_utils import clean_description class WindowAttributes(Definitions): diff --git a/model_data/simulation_system/MLModel/__init__.py b/etl/epc_clean/epc_attributes/__init__.py similarity index 100% rename from model_data/simulation_system/MLModel/__init__.py rename to etl/epc_clean/epc_attributes/__init__.py diff --git a/etl/epc_clean/epc_attributes/all_cleaners.py b/etl/epc_clean/epc_attributes/all_cleaners.py new file mode 100644 index 00000000..e4e0a0ba --- /dev/null +++ b/etl/epc_clean/epc_attributes/all_cleaners.py @@ -0,0 +1,21 @@ +from etl.epc_clean.epc_attributes.FloorAttributes import FloorAttributes +from etl.epc_clean.epc_attributes.HotWaterAttributes import HotWaterAttributes +from etl.epc_clean.epc_attributes.MainFuelAttributes import MainFuelAttributes +from etl.epc_clean.epc_attributes.MainheatAttributes import MainHeatAttributes +from etl.epc_clean.epc_attributes.MainheatControlAttributes import MainheatControlAttributes +from etl.epc_clean.epc_attributes.RoofAttributes import RoofAttributes +from etl.epc_clean.epc_attributes.WallAttributes import WallAttributes +from etl.epc_clean.epc_attributes.WindowAttributes import WindowAttributes +from etl.epc_clean.epc_attributes.LightingAttributes import LightingAttributes + +all_cleaner_map = { + 'floor-description': FloorAttributes, + 'hotwater-description': HotWaterAttributes, + 'main-fuel': MainFuelAttributes, + 'mainheat-description': MainHeatAttributes, + 'mainheatcont-description': MainheatControlAttributes, + 'roof-description': RoofAttributes, + 'walls-description': WallAttributes, + 'windows-description': WindowAttributes, + 'lighting-description:': LightingAttributes, +} diff --git a/model_data/epc_attributes/attribute_utils.py b/etl/epc_clean/epc_attributes/attribute_utils.py similarity index 100% rename from model_data/epc_attributes/attribute_utils.py rename to etl/epc_clean/epc_attributes/attribute_utils.py diff --git a/model_data/simulation_system/__init__.py b/etl/epc_clean/requirements.txt similarity index 100% rename from model_data/simulation_system/__init__.py rename to etl/epc_clean/requirements.txt diff --git a/model_data/tests/test_attribute_utils.py b/etl/epc_clean/tests/test_attribute_utils.py similarity index 96% rename from model_data/tests/test_attribute_utils.py rename to etl/epc_clean/tests/test_attribute_utils.py index 132c4857..f4e74da3 100644 --- a/model_data/tests/test_attribute_utils.py +++ b/etl/epc_clean/tests/test_attribute_utils.py @@ -1,5 +1,5 @@ import pytest -import model_data.epc_attributes.attribute_utils as attribute_utils +import etl.epc_clean.epc_attributes.attribute_utils as attribute_utils def test_extract_thermal_transmittance(): diff --git a/model_data/tests/test_data/EpcClean_inputs.obj b/etl/epc_clean/tests/test_data/EpcClean_inputs.obj similarity index 100% rename from model_data/tests/test_data/EpcClean_inputs.obj rename to etl/epc_clean/tests/test_data/EpcClean_inputs.obj diff --git a/model_data/tests/test_data/test_floor_attributes_cases.py b/etl/epc_clean/tests/test_data/test_floor_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_floor_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_floor_attributes_cases.py diff --git a/model_data/tests/test_data/test_hot_water_attributes_cases.py b/etl/epc_clean/tests/test_data/test_hot_water_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_hot_water_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_hot_water_attributes_cases.py diff --git a/model_data/tests/test_data/test_lighting_attributes_cases.py b/etl/epc_clean/tests/test_data/test_lighting_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_lighting_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_lighting_attributes_cases.py diff --git a/model_data/tests/test_data/test_main_fuel_attributes_cases.py b/etl/epc_clean/tests/test_data/test_main_fuel_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_main_fuel_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_main_fuel_attributes_cases.py diff --git a/model_data/tests/test_data/test_mainheat_attributes_cases.py b/etl/epc_clean/tests/test_data/test_mainheat_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_mainheat_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_mainheat_attributes_cases.py diff --git a/model_data/tests/test_data/test_mainheat_control_attributes_cases.py b/etl/epc_clean/tests/test_data/test_mainheat_control_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_mainheat_control_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_mainheat_control_attributes_cases.py diff --git a/model_data/tests/test_data/test_roof_attributes_cases.py b/etl/epc_clean/tests/test_data/test_roof_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_roof_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_roof_attributes_cases.py diff --git a/model_data/tests/test_data/test_wall_attributes_cases.py b/etl/epc_clean/tests/test_data/test_wall_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_wall_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_wall_attributes_cases.py diff --git a/model_data/tests/test_data/test_window_attributes_cases.py b/etl/epc_clean/tests/test_data/test_window_attributes_cases.py similarity index 100% rename from model_data/tests/test_data/test_window_attributes_cases.py rename to etl/epc_clean/tests/test_data/test_window_attributes_cases.py diff --git a/model_data/tests/test_epc_clean.py b/etl/epc_clean/tests/test_epc_clean.py similarity index 95% rename from model_data/tests/test_epc_clean.py rename to etl/epc_clean/tests/test_epc_clean.py index eaa51cb1..a92fe12f 100644 --- a/model_data/tests/test_epc_clean.py +++ b/etl/epc_clean/tests/test_epc_clean.py @@ -1,6 +1,6 @@ import pytest import pickle -from model_data.EpcClean import EpcClean +from etl.epc_clean.EpcClean import EpcClean from pathlib import Path # For local testing diff --git a/model_data/tests/test_floor_attributes.py b/etl/epc_clean/tests/test_floor_attributes.py similarity index 92% rename from model_data/tests/test_floor_attributes.py rename to etl/epc_clean/tests/test_floor_attributes.py index 4b3b2c85..fc60c343 100644 --- a/model_data/tests/test_floor_attributes.py +++ b/etl/epc_clean/tests/test_floor_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.tests.test_data.test_floor_attributes_cases import clean_floor_cases -from model_data.epc_attributes.FloorAttributes import FloorAttributes +from etl.epc_clean.tests.test_data.test_floor_attributes_cases import clean_floor_cases +from etl.epc_clean.epc_attributes.FloorAttributes import FloorAttributes class TestCleanFloor: diff --git a/model_data/tests/test_hotwater_attributes.py b/etl/epc_clean/tests/test_hotwater_attributes.py similarity index 89% rename from model_data/tests/test_hotwater_attributes.py rename to etl/epc_clean/tests/test_hotwater_attributes.py index 2df31c51..2809b805 100644 --- a/model_data/tests/test_hotwater_attributes.py +++ b/etl/epc_clean/tests/test_hotwater_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.HotWaterAttributes import HotWaterAttributes -from model_data.tests.test_data.test_hot_water_attributes_cases import hotwater_cases +from etl.epc_clean.epc_attributes.HotWaterAttributes import HotWaterAttributes +from etl.epc_clean.tests.test_data.test_hot_water_attributes_cases import hotwater_cases class TestHotWaterAttributes: diff --git a/model_data/tests/test_lighting_attributes.py b/etl/epc_clean/tests/test_lighting_attributes.py similarity index 94% rename from model_data/tests/test_lighting_attributes.py rename to etl/epc_clean/tests/test_lighting_attributes.py index 38219e86..f3c23e8f 100644 --- a/model_data/tests/test_lighting_attributes.py +++ b/etl/epc_clean/tests/test_lighting_attributes.py @@ -1,7 +1,7 @@ import pandas as pd import pytest -from model_data.tests.test_data.test_lighting_attributes_cases import test_cases -from model_data.epc_attributes.LightingAttributes import LightingAttributes +from etl.epc_clean.tests.test_data.test_lighting_attributes_cases import test_cases +from etl.epc_clean.epc_attributes.LightingAttributes import LightingAttributes # An example averages dataset to use in tests. It is a dictionary where the key is a lighting description and the # value is the expected proportion. diff --git a/model_data/tests/test_mainfuel_attributes.py b/etl/epc_clean/tests/test_mainfuel_attributes.py similarity index 88% rename from model_data/tests/test_mainfuel_attributes.py rename to etl/epc_clean/tests/test_mainfuel_attributes.py index cf23cb9f..bface6e2 100644 --- a/model_data/tests/test_mainfuel_attributes.py +++ b/etl/epc_clean/tests/test_mainfuel_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.MainFuelAttributes import MainFuelAttributes -from model_data.tests.test_data.test_main_fuel_attributes_cases import mainfuel_cases +from etl.epc_clean.epc_attributes.MainFuelAttributes import MainFuelAttributes +from etl.epc_clean.tests.test_data.test_main_fuel_attributes_cases import mainfuel_cases class TestMainHeatControlAttributes: diff --git a/model_data/tests/test_mainheat_attributes.py b/etl/epc_clean/tests/test_mainheat_attributes.py similarity index 91% rename from model_data/tests/test_mainheat_attributes.py rename to etl/epc_clean/tests/test_mainheat_attributes.py index 7f70ec6b..f175e821 100644 --- a/model_data/tests/test_mainheat_attributes.py +++ b/etl/epc_clean/tests/test_mainheat_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.MainheatAttributes import MainHeatAttributes -from model_data.tests.test_data.test_mainheat_attributes_cases import mainheat_cases +from etl.epc_clean.epc_attributes.MainheatAttributes import MainHeatAttributes +from etl.epc_clean.tests.test_data.test_mainheat_attributes_cases import mainheat_cases class TestMainHeatAttributes: diff --git a/model_data/tests/test_mainheat_controls_attributes.py b/etl/epc_clean/tests/test_mainheat_controls_attributes.py similarity index 92% rename from model_data/tests/test_mainheat_controls_attributes.py rename to etl/epc_clean/tests/test_mainheat_controls_attributes.py index 3570bafe..7b114107 100644 --- a/model_data/tests/test_mainheat_controls_attributes.py +++ b/etl/epc_clean/tests/test_mainheat_controls_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.MainheatControlAttributes import MainheatControlAttributes -from model_data.tests.test_data.test_mainheat_control_attributes_cases import mainheat_control_cases +from etl.epc_clean.epc_attributes.MainheatControlAttributes import MainheatControlAttributes +from etl.epc_clean.tests.test_data.test_mainheat_control_attributes_cases import mainheat_control_cases class TestMainHeatControlAttributes: diff --git a/model_data/tests/test_roof_attributes.py b/etl/epc_clean/tests/test_roof_attributes.py similarity index 96% rename from model_data/tests/test_roof_attributes.py rename to etl/epc_clean/tests/test_roof_attributes.py index 5b010d90..54b59f1a 100644 --- a/model_data/tests/test_roof_attributes.py +++ b/etl/epc_clean/tests/test_roof_attributes.py @@ -1,7 +1,7 @@ import pytest from pathlib import Path -from model_data.tests.test_data.test_roof_attributes_cases import clean_roof_test_cases -from model_data.epc_attributes.RoofAttributes import RoofAttributes +from etl.epc_clean.tests.test_data.test_roof_attributes_cases import clean_roof_test_cases +from etl.epc_clean.epc_attributes.RoofAttributes import RoofAttributes # For local testing if __file__ == "": diff --git a/model_data/tests/test_utils.py b/etl/epc_clean/tests/test_utils.py similarity index 92% rename from model_data/tests/test_utils.py rename to etl/epc_clean/tests/test_utils.py index 224471b8..eb813031 100644 --- a/model_data/tests/test_utils.py +++ b/etl/epc_clean/tests/test_utils.py @@ -1,4 +1,4 @@ -from model_data.utils import is_percentage_or_number, correct_spelling +from etl.epc_clean.utils import is_percentage_or_number, correct_spelling class TestUtils: diff --git a/model_data/tests/test_wall_attributes.py b/etl/epc_clean/tests/test_wall_attributes.py similarity index 93% rename from model_data/tests/test_wall_attributes.py rename to etl/epc_clean/tests/test_wall_attributes.py index c8d5eb24..01a60615 100644 --- a/model_data/tests/test_wall_attributes.py +++ b/etl/epc_clean/tests/test_wall_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.WallAttributes import WallAttributes -from model_data.tests.test_data.test_wall_attributes_cases import wall_cases +from etl.epc_clean.epc_attributes.WallAttributes import WallAttributes +from etl.epc_clean.tests.test_data.test_wall_attributes_cases import wall_cases class TestWallAttributes: diff --git a/model_data/tests/test_window_attributes.py b/etl/epc_clean/tests/test_window_attributes.py similarity index 85% rename from model_data/tests/test_window_attributes.py rename to etl/epc_clean/tests/test_window_attributes.py index 137c2313..46ebde45 100644 --- a/model_data/tests/test_window_attributes.py +++ b/etl/epc_clean/tests/test_window_attributes.py @@ -1,6 +1,6 @@ import pytest -from model_data.epc_attributes.WindowAttributes import WindowAttributes -from model_data.tests.test_data.test_window_attributes_cases import windows_cases +from etl.epc_clean.epc_attributes.WindowAttributes import WindowAttributes +from etl.epc_clean.tests.test_data.test_window_attributes_cases import windows_cases class TestWindowAttributes: diff --git a/model_data/utils.py b/etl/epc_clean/utils.py similarity index 100% rename from model_data/utils.py rename to etl/epc_clean/utils.py diff --git a/model_data/LandRegistryClient.py b/etl/land_registry/LandRegistryClient.py similarity index 100% rename from model_data/LandRegistryClient.py rename to etl/land_registry/LandRegistryClient.py diff --git a/model_data/simulation_system/core/__init__.py b/etl/land_registry/__init__.py similarity index 100% rename from model_data/simulation_system/core/__init__.py rename to etl/land_registry/__init__.py diff --git a/model_data/tests/__init__.py b/etl/land_registry/app.py similarity index 100% rename from model_data/tests/__init__.py rename to etl/land_registry/app.py diff --git a/land_registry/sample_addresses.pkl b/etl/land_registry/sample_addresses.pkl similarity index 100% rename from land_registry/sample_addresses.pkl rename to etl/land_registry/sample_addresses.pkl diff --git a/model_data/tests/test_land_registry_client.py b/etl/land_registry/tests/test_land_registry_client.py similarity index 96% rename from model_data/tests/test_land_registry_client.py rename to etl/land_registry/tests/test_land_registry_client.py index 97a30641..c03a32fc 100644 --- a/model_data/tests/test_land_registry_client.py +++ b/etl/land_registry/tests/test_land_registry_client.py @@ -1,6 +1,6 @@ import pandas as pd from unittest.mock import patch, call -from model_data.LandRegistryClient import LandRegistryClient +from etl.land_registry.LandRegistryClient import LandRegistryClient class TestLandRegistryClient: diff --git a/open_uprn/__init__.py b/etl/property_dimensions/__init__.py similarity index 100% rename from open_uprn/__init__.py rename to etl/property_dimensions/__init__.py diff --git a/etl/property_dimensions/app.py b/etl/property_dimensions/app.py new file mode 100644 index 00000000..876d67e2 --- /dev/null +++ b/etl/property_dimensions/app.py @@ -0,0 +1,54 @@ +""" +This is a simple application which estimates some of the basic dimensions of a property based on EPC +data which we can use as a proxy value if we don't have this information on the EPC +""" +import os +from pathlib import Path +import pandas as pd +from tqdm import tqdm +from etl.epc.settings import EARLIEST_EPC_DATE +from etl.epc.DataProcessor import DataProcessor +from BaseUtility import Definitions +from utils.s3 import save_dataframe_to_s3_parquet + +DATA_DIRECTORY = Path(__file__).parent / "local_data" / "all-domestic-certificates" + +GROUPBY = ["PROPERTY_TYPE", "BUILT_FORM", "CONSTITUENCY", "CONSTRUCTION_AGE_BAND"] + +BUCKET = os.environ.get("BUCKET", "retrofit-data-dev") + + +def app(): + directories = [entry for entry in DATA_DIRECTORY.iterdir() if entry.is_dir()] + + for directory in tqdm(directories): + data = pd.read_csv(directory / "certificates.csv", low_memory=False) + data = data[data["LODGEMENT_DATE"] >= EARLIEST_EPC_DATE] + data = data[~pd.isnull(data["UPRN"])] + data["TOTAL_FLOOR_AREA"] = data["TOTAL_FLOOR_AREA"].astype(float) + + data["CONSTRUCTION_AGE_BAND"] = data["CONSTRUCTION_AGE_BAND"].apply( + lambda x: DataProcessor.clean_construction_age_band(x) + ) + data = data[~pd.isnull(data["CONSTRUCTION_AGE_BAND"])] + data = data[~data["CONSTRUCTION_AGE_BAND"].isin(Definitions.DATA_ANOMALY_MATCHES)] + data = data[~pd.isnull(data["TOTAL_FLOOR_AREA"])] + data = data[~pd.isnull(data["NUMBER_HABITABLE_ROOMS"])] + data = data[~pd.isnull(data["FLOOR_HEIGHT"])] + + df = ( + data.groupby(GROUPBY) + .agg({"NUMBER_HABITABLE_ROOMS": "median", "TOTAL_FLOOR_AREA": "mean", "FLOOR_HEIGHT": "mean"}) + .reset_index() + ) + + local_authority = data["LOCAL_AUTHORITY"].unique() + if len(local_authority) > 1: + raise Exception("More than one la in data") + local_authority = local_authority[0] + + save_dataframe_to_s3_parquet( + df=df, + bucket_name=BUCKET, + file_key=f"property_dimensions/{local_authority}.parquet", + ) diff --git a/model_data/BoreholeClient.py b/etl/spatial/BoreholeClient.py similarity index 98% rename from model_data/BoreholeClient.py rename to etl/spatial/BoreholeClient.py index 831440df..24399775 100644 --- a/model_data/BoreholeClient.py +++ b/etl/spatial/BoreholeClient.py @@ -56,7 +56,7 @@ class BoreholeClient: # EXAMPLE # There are ~1.4 million entries in this dataset and so we firstly want to reduce the number of - # entries in here if possible before we produce any form of comparison between our properties, to infer + # entries in here if possible before we produce any form of comparison between our epc, to infer # the distance from the property to the nearest borehole # Let's take a sample diff --git a/conservation_areas/ConservationAreaClient.py b/etl/spatial/ConservationAreaClient.py similarity index 55% rename from conservation_areas/ConservationAreaClient.py rename to etl/spatial/ConservationAreaClient.py index 164042f9..57e94df8 100644 --- a/conservation_areas/ConservationAreaClient.py +++ b/etl/spatial/ConservationAreaClient.py @@ -1,12 +1,55 @@ -from enum import Enum +import boto3 +import os +import tempfile import geopandas as gpd +import numpy as np +from enum import Enum from shapely.geometry import Point from utils.logger import setup_logger +from utils.s3 import read_io_from_s3 from datatypes.datatypes import OpenUprnCoordinateData logger = setup_logger() +def read_shapefile_from_s3(bucket_name, s3_file_key): + """ + Read a shapefile from S3 into a GeoDataFrame. + + :param bucket_name: The name of the S3 bucket + :param s3_file_key: The file path of the shape file + :return: GeoDataFrame containing the shapefile data + """ + + s3_folder_key = "/".join(s3_file_key.split("/")[:-1]) + shape_file_key = s3_file_key.split("/")[-1] + # Create a temporary directory + with tempfile.TemporaryDirectory() as tmpdirname: + s3_client = boto3.client('s3') + + # Ensure the temporary directory exists + logger.info("Creating temporary directory at %s" % tmpdirname) + os.makedirs(tmpdirname, exist_ok=True) + + # List all files in the given S3 folder + s3_objects = s3_client.list_objects(Bucket=bucket_name, Prefix=s3_folder_key)['Contents'] + + # Download each file to the temporary directory + for s3_object in s3_objects: + file_key = s3_object['Key'] + file_name = os.path.basename(file_key) + local_file_path = os.path.join(tmpdirname, file_name) + # Explicitly create the temporary file + with open(local_file_path, 'wb') as tmpfile: + s3_client.download_fileobj(bucket_name, file_key, tmpfile) + + # Read the shapefile from the temporary directory into a GeoDataFrame + shapefile_path = os.path.join(tmpdirname, shape_file_key) + gdf = gpd.read_file(shapefile_path) + + return gdf + + class ConservationAreaClient: """ Class to interact and manupulate convervation area data. The historic england data @@ -18,13 +61,14 @@ class ConservationAreaClient: """ SOURCES = ["historic_england"] - IN_CONSERVATION_AREA = "in_conservation_area" - NOT_IN_CONSERVATION_AREA = "not_in_conservation_area" - UNKNOWN = "unknown" + IN_CONSERVATION_AREA = True + NOT_IN_CONSERVATION_AREA = False + UNKNOWN = None - def __init__(self, historic_england_path, gov_path): + def __init__(self, historic_england_path, gov_path, bucket): self.historic_england_path = historic_england_path self.gov_path = gov_path + self.bucket = bucket self.historic_england_data = None self.gov_data = None @@ -34,11 +78,21 @@ class ConservationAreaClient: Read the data """ logger.info("Reading in historic england conservation area shapefile") - self.historic_england_data = gpd.read_file(self.historic_england_path) + self.historic_england_data = read_shapefile_from_s3( + bucket_name=self.bucket, s3_file_key=self.historic_england_path + ) logger.info("Reading in Govenment conservation area geojson") - self.gov_data = gpd.read_file(self.gov_path) + + self.gov_data = gpd.read_file( + read_io_from_s3( + bucket_name=self.bucket, + file_key=self.gov_path + ) + ) self.gov_data = self.gov_data.drop(columns=["dataset"]) + # Convert the gov data to british national grid co-ordinates + self.gov_data = self.gov_data.to_crs("EPSG:27700") def is_in_conservation_area(self, coordinates: OpenUprnCoordinateData): @@ -71,6 +125,43 @@ class ConservationAreaClient: else: return ConservationAreaClient.UNKNOWN + def is_in_conservation_area_vectorised(self, uprn_gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: + + joined_gdf_he = gpd.sjoin(uprn_gdf, self.historic_england_data, how="left", predicate="within") + + # Identify where we have definitive information (not "unknown") + in_conservation_he = ~joined_gdf_he.index_right.isna() & ( + joined_gdf_he["NAME"] != "No data available for publication by HE" + ) + + uprn_in_conservation_he = joined_gdf_he[in_conservation_he]["UPRN"].unique() + # The right index will be missing when we don't have a match so the uprn is not in a conservation + # area + uprn_not_in_conservation_he = joined_gdf_he.loc[ + ~joined_gdf_he["UPRN"].isin(uprn_in_conservation_he) & joined_gdf_he.index_right.isna(), + "UPRN" + ].unique() + + # For unknowns, check against government data + unknown_uprns = uprn_gdf.loc[~uprn_gdf["UPRN"].isin(uprn_in_conservation_he)]["UPRN"] + unknown_gdf = uprn_gdf[uprn_gdf["UPRN"].isin(unknown_uprns)] + + joined_gdf_gov = gpd.sjoin(unknown_gdf, self.gov_data, how="left", predicate="within") + uprn_in_conservation_gov = joined_gdf_gov.loc[~joined_gdf_gov.index_right.isna(), "UPRN"].unique() + + uprn_gdf['conservation_status'] = self.UNKNOWN + uprn_gdf.loc[ + uprn_gdf["UPRN"].isin(uprn_in_conservation_he), 'conservation_status' + ] = self.IN_CONSERVATION_AREA + uprn_gdf.loc[ + uprn_gdf["UPRN"].isin(uprn_not_in_conservation_he), 'conservation_status' + ] = self.NOT_IN_CONSERVATION_AREA + uprn_gdf.loc[ + uprn_gdf["UPRN"].isin(uprn_in_conservation_gov), 'conservation_status' + ] = self.IN_CONSERVATION_AREA + + return uprn_gdf + def is_in_conservation_area_historic_england(self, x_bng: float, y_bng: float) -> str: """ Check if a property is in a conservation area diff --git a/etl/spatial/OpenUprnClient.py b/etl/spatial/OpenUprnClient.py new file mode 100644 index 00000000..7392c4ac --- /dev/null +++ b/etl/spatial/OpenUprnClient.py @@ -0,0 +1,118 @@ +import os +from tqdm import tqdm +import pandas as pd +import geopandas as gpd +from utils.logger import setup_logger +from utils.s3 import read_io_from_s3, save_dataframe_to_s3_parquet + +logger = setup_logger() + + +class OpenUprnClient: + """ + + This client reads in the Open UPRN data from s3 which can be downloaded from here: + https://osdatahub.os.uk/downloads/open/OpenUPRN + + This dataset contains a lookup of UPRNs to coordinates. + + Specs for this dataset can be found here: + https://www.ordnancesurvey.co.uk/documents/product-support/tech-spec/open-uprn-techspec-v1.pdf + """ + + def __init__(self, path, bucket, uprns=None): + self.path = path + self.bucket = bucket + self.uprns = [int(x) for x in uprns] if uprns else None + self.data = None + + # This will be stored in S3 and will be the complete list of filenames + # We'll then use this to determine which file the UPRN's data is contained in + self.filenames = None + + def read(self): + """ + This methodology is placeholder, while data sits localls + :return: + """ + logger.info("Reading in open uprn data") + + df = pd.read_csv( + read_io_from_s3( + bucket_name=self.bucket, + file_key=self.path + ) + ) + if self.uprns: + df = df[df["UPRN"].isin(self.uprns)] + + self.data = df + + def read_local(self): + """ + For local testing + :return: + """ + logger.info("Reading in open uprn data") + + df = pd.read_csv(self.path) + if self.uprns: + df = df[df["UPRN"].isin(self.uprns)] + + self.data = df + + def create_file_partitions(self, partition_size=50000): + logger.info("Sorting data by UPRN ascending") + self.data = self.data.sort_values("UPRN", ascending=True) + + logger.info("Creating partitions") + self.data['partition'] = self.data.index // partition_size + + self.filenames = {} + for partition, group in tqdm(self.data.groupby('partition')): + min_uprn = group['UPRN'].min() + max_uprn = group['UPRN'].max() + self.filenames[partition] = f"{min_uprn}_{max_uprn}.parquet" + + self.data['filename'] = self.data['partition'].map(self.filenames) + + @staticmethod + def find_filename_for_uprn(uprn, filenames): + for filename in filenames: + min_uprn, max_uprn = map(int, filename.replace(".parquet", "").split("_")) + if min_uprn <= uprn <= max_uprn: + return filename + return None + + @staticmethod + def convert_bng_data_to_gpd(df): + + gpd_data = gpd.GeoDataFrame( + df, + geometry=gpd.points_from_xy(df.X_COORDINATE, df.Y_COORDINATE), + crs="EPSG:27700" # British National Grid + ) + + return gpd_data + + def save_filenames_to_s3(self, bucket_name): + """ + Save the filenames to s3 + :param bucket_name: + :return: + """ + file_key = os.path.join("spatial", "filename_meta.parquet") + + filenames = pd.DataFrame({"filenames": list(self.filenames.values())}) + filenames[['lower', 'upper']] = filenames['filenames'].str.replace('.parquet', '').str.extract( + '(\d+)_(\d+)' + ) + filenames['lower'] = filenames['lower'].astype(int) + filenames['upper'] = filenames['upper'].astype(int) + + logger.info("Saving filenames to s3 at {}".format(file_key)) + save_dataframe_to_s3_parquet( + df=filenames, + file_key=file_key, + bucket_name=bucket_name + ) diff --git a/etl/spatial/README.md b/etl/spatial/README.md new file mode 100644 index 00000000..ab68fcd5 --- /dev/null +++ b/etl/spatial/README.md @@ -0,0 +1,48 @@ +# Spatial - Geospatial Data Processing Service + +## Overview + +The Spatial service is designed to read, process, and analyze geospatial data related to +conservation areas and special buildings. It uses datasets from Historic England and the +UK government to determine whether a given UPRN (Unique Property Reference Number) is within +a conservation area or is a listed building. The processed data is saved back to an S3 bucket +in a parquet format for easy retrieval and further analysis. + +## Dependencies + +Dependencies are listed in requirements.txt. To install them, run: + +``` +pip install -r requirements.txt +``` + +## Data Sources + +1. **Historic England Conservation Areas**: Shapefile containing polygons of conservation areas. +2. **UK Government Conservation Areas**: GeoJSON file containing polygons of conservation areas. +3. **Open UPRN Data**: CSV file with UPRN and corresponding geospatial data. +4. **Historic England Listed Buildings**: Shapefile with information on listed buildings. +5. **Historic England Heritage Buildings at Risk**: Shapefile with information on heritage buildings at risk. + +## Files + +- app.py: Main application file that orchestrates the data processing flow. +- ConservationAreaClient.py: Handles reading and processing of conservation area data. +- OpenUprnClient.py: Manages reading and partitioning of Open UPRN data. +- SpecialBuildingsClient.py: Takes care of reading and processing data related to special buildings. +- requirements.txt: Lists all Python package dependencies. + +## How to Run + +1. Make sure you have all the required packages installed. +2. Update the S3 bucket and file path constants in app.py. +3. Run app.py. + +## Workflow + +1. Read the datasets for conservation areas and special buildings. +2. Read the Open UPRN dataset and partition it into smaller chunks based on UPRN. +3. For each partition: + - Convert UPRN data to geopandas DataFrame. + - Check if each UPRN is within a conservation area or is a special building. + - Save the processed data back to S3 in parquet format. \ No newline at end of file diff --git a/etl/spatial/SpecialBuildingsClient.py b/etl/spatial/SpecialBuildingsClient.py new file mode 100644 index 00000000..16a9d2d4 --- /dev/null +++ b/etl/spatial/SpecialBuildingsClient.py @@ -0,0 +1,114 @@ +import geopandas as gpd +from shapely.geometry import Point +from utils.logger import setup_logger +from etl.spatial.ConservationAreaClient import read_shapefile_from_s3 +from datatypes.datatypes import OpenUprnCoordinateData + +logger = setup_logger() + + +class SpecialBuildingsClient: + """ + This class reads in data from Historic England, which can be used to determine if specific buildings are + listed or heritage buildings + """ + + def __init__(self, historic_england_listed_buildings_path, historic_england_heritage_buildings_path, bucket): + self.historic_england_listed_buildings_path = historic_england_listed_buildings_path + self.historic_england_heritage_buildings_path = historic_england_heritage_buildings_path + self.bucket = bucket + + self.historic_england_listed_buildings = None + self.historic_england_heritage_buildings = None + + def read(self): + """ + Read the data + """ + logger.info("Reading in historic england listed buildings shapefile") + self.historic_england_listed_buildings = read_shapefile_from_s3( + bucket_name=self.bucket, s3_file_key=self.historic_england_listed_buildings_path + ) + + logger.info("Reading in historic england heritage buildings shapefile") + self.historic_england_heritage_buildings = read_shapefile_from_s3( + bucket_name=self.bucket, s3_file_key=self.historic_england_heritage_buildings_path + ) + + # Convert the gov data to british national grid co-ordinates + self.historic_england_heritage_buildings = self.historic_england_heritage_buildings.to_crs("EPSG:27700") + + def is_listed_building(self, coordinates: OpenUprnCoordinateData) -> bool: + """ + Check if a location specified by British National Grid coordinates is a listed building. + + :param coordinates: dictionary, which should have the OpenUprnCoordinateData format + :return: "listed_building" if the location is within a listed building polygon, "not_listed_building" otherwise + """ + # Convert the coordinates to a Shapely Point object + point = Point(coordinates.X_COORDINATE, coordinates.Y_COORDINATE) + + # Check if the point is within any of the listed building polygons + within_listed_buildings = self.historic_england_listed_buildings.contains(point) + + if within_listed_buildings.any(): + # If the point is within any listed building polygon, log the names of the buildings and return + # "listed_building" + names = self.historic_england_listed_buildings.loc[within_listed_buildings, "Name"] + logger.info(f"The location is within the following listed buildings: {names.values}") + return True + + # If the point is not within any listed building polygon, return "not_listed_building" + return False + + def is_listed_building_vectorised(self, uprn_gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: + # Check against historic England listed buildings data + joined_gdf_listed = gpd.sjoin(uprn_gdf, self.historic_england_listed_buildings, how="left", predicate="within") + + # Identify where we have matches + uprn_is_listed = joined_gdf_listed[~joined_gdf_listed.index_right.isna()]["UPRN"].unique() + + # Populate the results in the input GeoDataFrame + uprn_gdf['is_listed_building'] = False + uprn_gdf.loc[uprn_gdf["UPRN"].isin(uprn_is_listed), 'is_listed_building'] = True + + return uprn_gdf + + def is_heritage_building_at_risk(self, coordinates: OpenUprnCoordinateData) -> bool: + """ + Check if a location specified by British National Grid coordinates is a heritage building at risk. + + :param coordinates: dictionary, which should have the OpenUprnCoordinateData format + :return: "heritage_building_at_risk" if the location is within a heritage building at risk polygon, + "not_heritage_building_at_risk" otherwise + """ + # Convert the coordinates to a Shapely Point object + point = Point(coordinates.X_COORDINATE, coordinates.Y_COORDINATE) + + # Check if the point is within any of the heritage building at risk polygons + within_heritage_buildings_at_risk = self.historic_england_heritage_buildings.contains(point) + + if within_heritage_buildings_at_risk.any(): + # If the point is within any heritage building at risk polygon, log the names of the buildings and return + # "heritage_building_at_risk" + names = self.historic_england_heritage_buildings.loc[within_heritage_buildings_at_risk, "EntryName"] + logger.info(f"The location is within the following heritage buildings at risk: {names.values}") + return True + + # If the point is not within any heritage building at risk polygon, return "not_heritage_building_at_risk" + return False + + def is_heritage_building_at_risk_vectorised(self, uprn_gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: + # Check against historic England heritage buildings data + joined_gdf_heritage = gpd.sjoin( + uprn_gdf, self.historic_england_heritage_buildings, how="left", predicate="within" + ) + + # Identify where we have matches + uprn_is_heritage = joined_gdf_heritage[~joined_gdf_heritage.index_right.isna()]["UPRN"].unique() + + # Populate the results in the input GeoDataFrame + uprn_gdf['is_heritage_building'] = False + uprn_gdf.loc[uprn_gdf["UPRN"].isin(uprn_is_heritage), 'is_heritage_building'] = True + + return uprn_gdf diff --git a/etl/spatial/__init__.py b/etl/spatial/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/etl/spatial/app.py b/etl/spatial/app.py new file mode 100644 index 00000000..d58509dd --- /dev/null +++ b/etl/spatial/app.py @@ -0,0 +1,103 @@ +""" +This application reads in the open uprn data from a static location and loads it into +our database for querying from other services +""" + +import os +from tqdm import tqdm +import pandas as pd +from etl.spatial.ConservationAreaClient import ConservationAreaClient +from etl.spatial.OpenUprnClient import OpenUprnClient +from etl.spatial.SpecialBuildingsClient import SpecialBuildingsClient +from utils.logger import setup_logger +from utils.s3 import save_dataframe_to_s3_parquet + +BUCKET = "retrofit-datalake-dev" +OUTPUT_BUCKET = "retrofit-data-dev" +HISTORIC_ENGLAND_CONSERVARION_AREAS_PATHNAME = "spatial/Historic_England_Conservation_Areas/Conservation_Areas.shp" +GOV_CONSERVARION_AREAS_PATHNAME = "spatial/gov-conservation-area.geojson" +OPEN_UPRN_PATHNAME = "spatial/osopenuprn_202309_csv/osopenuprn_202308.csv" +HISTORIC_ENGLAND_LISTED_BUILDINGS_PATHNAME = "spatial/National_Heritage_List_for_England_(" \ + "NHLE)/Listed_Building_polygons.shp" +HISTORIC_ENGLAND_HERITAGE_BUILDINGS_PATHNAME = \ + "spatial/Historic_England_Heritage_at_Risk_Register_2022/Historic_England_Heritage_at_Risk_Register_2022.shp" + +logger = setup_logger() + + +def app(): + """ + This application uses the conservation area datasets to determine if a UPRN is + in a conservation area or now + + We use two sources of data for determining if homes are in conservation areas. + The first is the Historic England dataset, which is a shapefile containing + polygons of conservation areas. The second is the gov.uk dataset, which is a + geojson file containing polygons of conservation areas. + + The Historic England dataset can be found here: + https://historicengland.org.uk/listing/the-list/data-downloads/#aa33785e + + The listed building dataset is also found at Historic England at: + https://historicengland.org.uk/listing/the-list/data-downloads/#aa33785e + + The hertitige buildings dataset is also found at Historic England at: + https://historicengland.org.uk/listing/the-list/data-downloads/#aa33785e + + The Gov.uk dataset can be found here: + https://www.planning.data.gov.uk/dataset/conservation-area + + The open UPRN data can be found here: + https://osdatahub.os.uk/downloads/open/OpenUPRN + + The Office for National Statistics Postcode Lookup can be found here: + https://geoportal.statistics.gov.uk/datasets/9ac0331178b0435e839f62f41cc61c16/about + + For the moment, these data sources are downloaded manually and uploaded to S3. + This application then processes those files and writes the results to s3 + """ + + conservation_area_client = ConservationAreaClient( + historic_england_path=HISTORIC_ENGLAND_CONSERVARION_AREAS_PATHNAME, + gov_path=GOV_CONSERVARION_AREAS_PATHNAME, + bucket=BUCKET + ) + conservation_area_client.read() + + special_buildings_client = SpecialBuildingsClient( + historic_england_listed_buildings_path=HISTORIC_ENGLAND_LISTED_BUILDINGS_PATHNAME, + historic_england_heritage_buildings_path=HISTORIC_ENGLAND_HERITAGE_BUILDINGS_PATHNAME, + bucket=BUCKET + ) + special_buildings_client.read() + + open_uprn_client = OpenUprnClient( + path=OPEN_UPRN_PATHNAME, + bucket=BUCKET + ) + open_uprn_client.read() + + # We want to sort the data and split it into filenames on UPRN. + # We'll split the data into chunks of 50,000 + open_uprn_client.create_file_partitions() + + logger.info("Extracting spatial data for uprn partitions") + to_loop_over = open_uprn_client.data.groupby("filename") + + for filename, uprn_df in tqdm(open_uprn_client.data.groupby("filename"), total=len(to_loop_over)): + uprn_gdf = OpenUprnClient.convert_bng_data_to_gpd(uprn_df) + + uprn_gdf = conservation_area_client.is_in_conservation_area_vectorised(uprn_gdf=uprn_gdf) + uprn_gdf = special_buildings_client.is_listed_building_vectorised(uprn_gdf=uprn_gdf) + uprn_gdf = special_buildings_client.is_heritage_building_at_risk_vectorised(uprn_gdf=uprn_gdf) + + # Convert back to a regular dataframe + uprn_gdf = uprn_gdf.drop(columns=["geometry"]) + uprn_gdf = pd.DataFrame(uprn_gdf) + + save_dataframe_to_s3_parquet( + df=uprn_gdf, file_key=os.path.join("spatial", filename), bucket_name=OUTPUT_BUCKET + ) + + # We finally save the filesnames to s3 + open_uprn_client.save_filenames_to_s3(bucket_name=OUTPUT_BUCKET) diff --git a/conservation_areas/requirements.txt b/etl/spatial/requirements.txt similarity index 100% rename from conservation_areas/requirements.txt rename to etl/spatial/requirements.txt diff --git a/model_data/tests/test_borehole_client.py b/etl/spatial/tests/test_borehole_client.py similarity index 95% rename from model_data/tests/test_borehole_client.py rename to etl/spatial/tests/test_borehole_client.py index f49733dd..38bf4495 100644 --- a/model_data/tests/test_borehole_client.py +++ b/etl/spatial/tests/test_borehole_client.py @@ -1,5 +1,5 @@ import pytest -from model_data.BoreholeClient import BoreholeClient +from etl.spatial.BoreholeClient import BoreholeClient @pytest.fixture diff --git a/etl/wall_area/__init__.py b/etl/wall_area/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/model_data/simulation_system/area_data.py b/etl/wall_area/app.py similarity index 99% rename from model_data/simulation_system/area_data.py rename to etl/wall_area/app.py index f43093f1..41b1b159 100644 --- a/model_data/simulation_system/area_data.py +++ b/etl/wall_area/app.py @@ -1,5 +1,5 @@ """ -This script produces the dataset used to model the wall area of properties, which is used to estimate the cost +This script produces the dataset used to model the wall area of epc, which is used to estimate the cost of insulation measures within homes """ import os diff --git a/model_data/simulation_system/requirements/area_data.txt b/etl/wall_area/requirements.txt similarity index 100% rename from model_data/simulation_system/requirements/area_data.txt rename to etl/wall_area/requirements.txt diff --git a/infrastructure/terraform/main.tf b/infrastructure/terraform/main.tf index 399a6ff5..79fe015e 100644 --- a/infrastructure/terraform/main.tf +++ b/infrastructure/terraform/main.tf @@ -83,7 +83,7 @@ resource "aws_db_instance" "default" { publicly_accessible = true } -# Set up the bucket that recieve the csv uploads of properties to be retrofit +# Set up the bucket that recieve the csv uploads of epc to be retrofit module "s3_presignable_bucket" { source = "./modules/s3_presignable_bucket" bucketname = "retrofit-plan-inputs-${var.stage}" diff --git a/input_property_list.csv b/input_property_list.csv new file mode 100644 index 00000000..dc677c88 --- /dev/null +++ b/input_property_list.csv @@ -0,0 +1,12 @@ +address,postcode,Notes,,,, +28 Distillery Wharf,W6 9bf,,,,, +Flat 14 Godley V C House,E2 0LP,,,,, +49 Elderfield Road,E5 0LF,,,,, +26 Stanhope Road,N6 5NG,,,,, +Flat 3 Frederick Building,N1 4BD,,,,, +Flat 4 Frederick Building,N1 4BD,,,,, +"Flat 28, 22 Adelina Grove",E1 3BX,,,,, +"Flat 39, 239 Long Lane",SE1 4PT,,,,, +"1, Westview, Somerby",LE14 2QH,This property has an unfilled cavity,,,, +"59, Ashdale",CM23 4EB,This property has a partially filled cavity,,,, +88 Cleveland Avenue,DL3 7BE,This property has a filled cavity,,,, \ No newline at end of file diff --git a/model_data/README.md b/model_data/README.md deleted file mode 100644 index 278b3f99..00000000 --- a/model_data/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Environment setup - -We're using conda to manage environments to circumvent the -issues with Mac M1. This documentation will also cover Pycharm setup. - -We're working in python 3.10 so - -```commandline -conda create -n hestia-data python=3.10 -``` - -Then activate the environment - -```commandline -conda activate hestia-data -``` - -To set up with Pycharm, run - -```commandline -which python -``` - -and grab the path to the python executable. Then in Pycharm, go to -Settings > Project > Python Interpreter and click the gear icon -to add a new interpreter. Select Conda and either paste the path to the python executable -and click OK, or select the conda environment from the dropdown. - -You may need to restart Pycharm for the new interpreter to be recognised. - -To install project dependencies navigate to /model_data and run - -```commandline -pip install -r requirements.txt -``` - -### Running Tests - -If you are not in a virtual environment, activate it with - -```commandline -conda activate envName -``` - -Then run - -```commandline -pytest --cov-config=model_data/.coveragerc --cov=model_data -``` \ No newline at end of file diff --git a/model_data/analysis/SapModel.py b/model_data/analysis/SapModel.py deleted file mode 100644 index 021e503d..00000000 --- a/model_data/analysis/SapModel.py +++ /dev/null @@ -1,650 +0,0 @@ -import numpy as np -import pandas as pd -import statsmodels.api as sm -import matplotlib.pyplot as plt -from typing import Dict, Optional, List -from sklearn.model_selection import train_test_split -from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, explained_variance_score, \ - median_absolute_error, mean_absolute_percentage_error -from sklearn.ensemble import RandomForestRegressor -from sklearn.inspection import permutation_importance -from model_data.EpcClean import EpcClean - -from statsmodels.stats.outliers_influence import variance_inflation_factor -from tqdm import tqdm -from utils.logger import setup_logger - -logger = setup_logger() - - -class SapModel: - # We want to estimate for making improvements on different property components - RESPONSE = "current-energy-efficiency" - # We could potentially build models by constituency to avoid having too many - # features in the model - BASE_FEATURES = [ - "property-type", - "built-form", - "construction-age-band", - "number-habitable-rooms", - "constituency", - "number-heated-rooms", - "transaction-type" - ] - - COMPONENT_FEATURES = [ - "walls-description", - "floor-description", - "lighting-description", - "roof-description", - "mainheat-description", - "hotwater-description", - "main-fuel", - "mechanical-ventilation", - "secondheat-description", - "energy-tariff", - "solar-water-heating-flag", - "photo-supply", - "windows-description", - "glazed-type", - "glazed-area", - "multi-glaze-proportion", - # "lighting-description" # Might not need to use this - "low-energy-lighting", - "number-open-fireplaces", - "mainheatcont-description", - "fixed-lighting-outlets-count", - "floor-height", - "floor-level", - "total-floor-area", - "extension-count", - ] - - CATEGORICAL_COLS = [ - "property-type", - "built-form", - "number-habitable-rooms", - "constituency", - "number-heated-rooms", - "mainheat-description", - "hotwater-description", - "main-fuel", - "mechanical-ventilation", - "secondheat-description", - "energy-tariff", - "solar-water-heating-flag", - "windows-description", - "glazed-type", - "glazed-area", - "construction-age-band", - "lighting-description", - "mainheatcont-description", - "floor-level", - ] - - NUMERICAL_COLUMNS = [ - "photo-supply", "multi-glaze-proportion", "low-energy-lighting", "number-open-fireplaces", - "fixed-lighting-outlets-count", - "floor-height", - "total-floor-area", - "extension-count", - ] - - # For the moment, we store records of the best performing models as a benchmark for future imporvements - BEST_FIT = { - 'MAPE': 0.04646530042225876, 'Mean Squared Error': 18.635209563729763, - 'Mean Absolute Error': 2.856347408023325, 'R2 Score': 0.800701753826118, - 'Explained Variance Score': 0.800701753826118, 'Median Absolute Error': 1.9026758012120197 - } - - BEST_PREDICT = { - 'MAPE': 0.04346083528432316, 'Mean Squared Error': 21.16036509335514, - 'Mean Absolute Error': 3.0440540802375833, 'R2 Score': 0.7219965012634312, - 'Explained Variance Score': 0.7220620137390414, 'Median Absolute Error': 1.9031967986967828 - } - - BEST_FINAL = { - 'MAPE': 0.04841470773386795, 'Mean Squared Error': 21.323052316630914, 'Mean Absolute Error': 2.988547998636157, - 'R2 Score': 0.7633662459299112, 'Explained Variance Score': 0.7633785339028832, - 'Median Absolute Error': 1.9487883489495985 - } - - BUCKET_VARIABLES = [ - "number-open-fireplaces", "fixed-lighting-outlets-count", 'extension-count', 'multi-glaze-proportion' - ] - - def __init__( - self, data: List[Dict], - cleaner: EpcClean, - test_size: Optional[float] = 0.2, - random_state: Optional[int] = None - ): - self.df = pd.DataFrame(data) - self.cleaner = cleaner - self.random_state = random_state if random_state is not None else 42 - self.test_size = 0.2 if test_size is None else test_size - - self.model_data = None - self.train_x = None - self.train_y = None - self.test_x = None - self.test_y = None - - self.test_model = None - self.final_model = None - - self.fit_error = None - self.predict_error = None - self.final_error = None - self.worst = { - "fit_errors": pd.DataFrame(), - "prediction_errors": pd.DataFrame(), - "fit_x": pd.DataFrame(), - "prediction_x": pd.DataFrame(), - "final_errors": pd.DataFrame(), - "final_x": pd.DataFrame(), - } - - self.fit_df = None - self.predict_df = None - self.final_fit_df = None - self.diagnosis = {} - - def run(self, plot: bool = False) -> None: - """ - A pipeline method to run all necessary methods in correct order. - :param plot: Boolean to indicate whether to plot the regression - """ - try: - self.create_dataset() - self.fit_model() - if plot: - self.plot_regression(self.fit_df) - except Exception as e: - logger.error("An error occurred during execution.") - logger.error(str(e)) - - def _merge_with_u_values( - self, model_data: pd.DataFrame, description: str, thermal_transmittance: str - ) -> pd.DataFrame: - - """ - Utility function to merge u value data with model data - :param model_data: Pandas dataframe which is the main modelling dataset - :param description: Name of the description column for which we're merging u-values onto - :param thermal_transmittance: Name of the thermal transmittance column - :return: - """ - - u_values = pd.DataFrame(self.cleaner.cleaned[f"{description}-description"])[ - ["original_description", thermal_transmittance]].rename( - columns={thermal_transmittance: f"{description}_u_value"} - ) - - model_data = model_data.merge( - u_values, - how="left", - left_on=f"{description}-description", - right_on="original_description" - ).drop(columns=["original_description"]) - - return model_data - - def _append_cleaned_data(self, model_data: pd.DataFrame) -> pd.DataFrame: - """ - Appends cleaned data into the model data. - :param model_data: Original model data. - :return: Model data with cleaned data appended. - """ - for description in ["walls", "floor", "roof"]: - model_data = self._merge_with_u_values(model_data, description, "thermal_transmittance") - - # lighting_proportions added separately as it doesn't use the _merge_with_u_values method - lighting_proportions = pd.DataFrame(self.cleaner.cleaned["lighting-description"])[ - ["original_description", "low_energy_proportion"]] - - model_data = model_data.merge( - lighting_proportions, - how="left", - left_on="lighting-description", - right_on="original_description" - ).drop(columns=["original_description"]) - - return model_data - - @staticmethod - def _convert_transaction_type(model_data: pd.DataFrame) -> pd.DataFrame: - """ - Converts transaction type to boolean - :param model_data: Model data with transaction type. - :return: Model data with converted transaction type. - """ - model_data["is_rdsap"] = model_data["transaction-type"] != "new dwelling" - model_data = model_data.drop(columns=["transaction-type"]) - return model_data - - @staticmethod - def bucket_and_fill(df: pd.DataFrame, column_name: str, n_bins: int = 10) -> pd.DataFrame: - """ - Simple utility function to bucket up features into bins and then fill any missing values with "NO_RECORD" - :param df: Dataframe of features to be binned - :param column_name: Name of the column to be binned - :param n_bins: Number of bins to use - :return: Dataframe with binned column - """ - # Check if the column is numerical - if np.issubdtype(df[column_name].dtype, np.number): - # Create a new categorical column from numerical one by binning the data - df[column_name + "_bucket"] = pd.cut(df[column_name], bins=n_bins).astype(str) - # Replace missing data with "NO_RECORD" - df[column_name + "_bucket"] = df[column_name + "_bucket"].fillna("NO_RECORD") - df[column_name + "_bucket"] = np.where( - df[column_name + "_bucket"] == "nan", - "NO_RECORD", - df[column_name + "_bucket"] - ) - return df - - def _clean_numericals(self, model_data): - - # Try binning numericals - remaining_numericals = [x for x in self.NUMERICAL_COLUMNS if x not in self.BUCKET_VARIABLES] - - for col in self.BUCKET_VARIABLES: - model_data[col] = pd.to_numeric(model_data[col], errors='coerce') - # If all values are missing, set all values to 0 - this column will get dropped - if all(pd.isnull(model_data[col])): - model_data[col + "_bucket"] = "NO_RECORD" - continue - model_data = self.bucket_and_fill(model_data, col) - - # Replace the data with the binned version - model_data = model_data.drop(columns=self.BUCKET_VARIABLES) - model_data = model_data.rename( - columns=dict(zip([c + "_bucket" for c in self.BUCKET_VARIABLES], self.BUCKET_VARIABLES)) - ) - - # Basic fill the rest of the columns with 0 - currenrtly this provided the best performance - for col in remaining_numericals: - model_data[col] = np.where( - model_data[col] == "", "0", model_data[col] - ).astype(float) - - return model_data - - @staticmethod - def clean_missings(model_data: pd.DataFrame) -> pd.DataFrame: - """ - Fills categorical missing data with sensible values - :param model_data: Original model data. - :return: Model data with cleaned categorical data. - """ - - # Cleaning of energy-tariff and construction-age-band hurt prediction performance, indicating there is - # potentially - # a notable difference between a "" missing and a "NO DATA!" missing, worth differentiating - - model_data["mechanical-ventilation"] = np.where( - model_data["mechanical-ventilation"] == "", "NO DATA!", model_data["mechanical-ventilation"] - ) - - model_data["solar-water-heating-flag"] = np.where( - model_data["solar-water-heating-flag"] == "", "N", model_data["solar-water-heating-flag"] - ) - - model_data["glazed-type"] = np.where( - model_data["glazed-type"] == "", "NO DATA!", model_data["glazed-type"] - ) - - model_data["glazed-area"] = np.where( - model_data["glazed-area"] == "", "NO DATA!", model_data["glazed-type"] - ) - - return model_data - - def create_dataset(self): - logger.info("Creating modelling dataset") - model_data = self.df[[self.RESPONSE] + self.COMPONENT_FEATURES + self.BASE_FEATURES] - model_data = model_data.reset_index(drop=True) - model_data["idx"] = model_data.index.copy() - - # Append on u-values - model_data = self._append_cleaned_data(model_data) - - model_data = self.clean_missings(model_data) - - # Convert transaction_type - model_data = self._convert_transaction_type(model_data) - - # Clean numerical columns - model_data = self._clean_numericals(model_data) - - # Take just entries with U-values - # TODO: Rather than doing this, do we want to include the estimated u-values? - # Since this ends up with just 2k entries - model_data = model_data[ - ~pd.isnull(model_data["walls_u_value"]) & - ~pd.isnull(model_data["floor_u_value"]) & - ~pd.isnull(model_data["roof_u_value"]) - ] - - exclude_features = [ - "walls-description", "floor-description", "roof-description", "transaction-type" - ] - - features = [ - x for x in self.BASE_FEATURES + self.COMPONENT_FEATURES + [ - "walls_u_value", "floor_u_value", "roof_u_value", self.RESPONSE, "idx", "is_rdsap" - ] if x not in exclude_features - ] - - model_data = model_data[features] - - for col in self.CATEGORICAL_COLS: - model_data[col] = model_data[col].astype('category') - - # Convert response - model_data[self.RESPONSE] = model_data[self.RESPONSE].astype(float) - - self.model_data = model_data - - def make_training_test(self, x): - # Split into training and test - self.train_x, self.test_x, self.train_y, self.test_y = train_test_split( - x.drop(self.RESPONSE, axis=1), - x[self.RESPONSE], - test_size=self.test_size, - random_state=self.random_state - ) - - @staticmethod - def remove_zero_std_cols(train_x, test_x=None, threshold=1e-3): - """ - Utility function to remove columns that have zero standard deviation from both test and train sets - :param train_x: Training data to remove columns from - :param test_x: If provided, remove the same columns from the test data - :param threshold: float value, if the standard deviation is below this threshold, the column is considered - to have zero standard deviation - :return: Tuple of train_x and test_x (if provided). If test_x is not provided, a null placeholder is returned - """ - # Compute standard deviations - std_devs = train_x.std() - - # Find columns with zero or near-zero standard deviation - zero_std_cols = std_devs[std_devs <= threshold].index - - # Drop these columns from the training data - train_x = train_x.drop(zero_std_cols, axis=1) - - if test_x is not None: - # Ensure the test data has the same columns - test_x = test_x[train_x.columns] - return train_x, test_x - - return train_x, None - - def fit_model(self): - """ - Main function to fit the model and produce accuracy metrics - """ - - x = pd.get_dummies(self.model_data, columns=self.CATEGORICAL_COLS + self.BUCKET_VARIABLES, drop_first=True) - - # Convert booleans to integer - for col in x.columns: - if x[col].dtype == bool: - x[col] = x[col].astype(int) - - if x[col].dtype == object: - x[col] = x[col].astype(float) - - # Create the training and test sets for each run - self.make_training_test(x) - self.train_x, self.test_x = self.remove_zero_std_cols(self.train_x, self.test_x) - logger.info("Detecting multi-collinearity in training dataset") - self.detect_multi_collinearity() - - # Add a constant to the independent value - train_x = sm.add_constant(self.train_x) - test_x = sm.add_constant(self.test_x) - train_idx = train_x["idx"].copy() - test_idx = self.test_x["idx"].copy() - train_x = train_x.drop(columns=["idx"]) - test_x = test_x.drop(columns=["idx"]) - - logger.info("Fitting testing model") - # make regression model - model = sm.OLS(self.train_y, train_x) - # fit model and print results - self.test_model = model.fit() - - train_predictions = self.test_model.fittedvalues - test_predictions = self.test_model.predict(test_x) - - self.fit_error, self.worst["fit_errors"] = self.calculate_regression_metrics( - y_true=self.train_y, y_pred=train_predictions - ) - - # Predict on new data - self.predict_error, self.worst["prediction_errors"] = self.calculate_regression_metrics( - y_true=self.test_y, y_pred=test_predictions - ) - - fit_success = self.check_successes(self.fit_error, self.BEST_FIT) - predict_success = self.check_successes(self.predict_error, self.BEST_PREDICT) - - self.model_data['fit'] = self.test_model.fittedvalues - # The worst errors over index heavily for flats - self.worst["fit_x"] = self.model_data[self.model_data.index.isin(self.worst["fit_errors"].index)] - self.worst["prediction_x"] = self.model_data[self.model_data.index.isin(self.worst["prediction_errors"].index)] - - self.fit_df = pd.DataFrame( - { - "fit": train_predictions, - "actual": self.train_y, - "idx": train_idx - } - ).sort_values("actual", ascending=True) - - self.predict_df = pd.DataFrame( - { - "predictions": test_predictions, - "actual": self.test_y, - "idx": test_idx - } - ) - - self.diagnosis = { - "fit_success": fit_success, - "predict_success": predict_success, - "summary": self.test_model.summary() - } - - # We're now ready to fit the final model - # For the momeent, the pre-processing at the top of this function merely removes columns, so we - # just need to remove the columns that were removed from the training data from the final model - logger.info("Fitting final model") - x = sm.add_constant(x) - y = x[self.RESPONSE] - x = x[self.train_x.columns] - idx = x["idx"].copy() - x = x.drop(columns=["idx"]) - - final_model = sm.OLS(y, x) - # fit model and print results - self.final_model = final_model.fit() - final_predictions = self.final_model.fittedvalues - - self.final_error, self.worst["final_errors"] = self.calculate_regression_metrics( - y_true=y, y_pred=final_predictions - ) - - self.final_fit_df = pd.DataFrame( - { - "fit": final_predictions, - "actual": y, - "idx": idx - } - ).sort_values("actual", ascending=True) - - @staticmethod - def check_successes(experiment_error, best_error): - """ - Simple function to check if the experiment error is better than the best error - :param experiment_error: output of calculate_regression_metrics() on the experiment - :param best_error: Current benchmark best error - :return: - """ - - successes = [] - for k in experiment_error: - if k in ["Explained Variance Score", "R2 Score"]: - # We want to maximise this so we want experiment error to be higher - successes.append( - { - "measure": k, - "success": experiment_error[k] >= best_error[k], - "difference": abs(experiment_error[k] - best_error[k]) - } - ) - continue - successes.append( - { - "measure": k, - "success": experiment_error[k] <= best_error[k], - "difference": abs(experiment_error[k] - best_error[k]) - } - ) - - return pd.DataFrame(successes) - - def rf_importance(self, train_x, train_y, test_x, test_y): - """ - Utility function to estimate feature importance using a random forest - This is useful to get a sense of some of the key features which are driving model - performance - - :param train_x: Training data covariates to build the importance model on - :param train_y: Training data response to build the importance model on - :param test_x: Test data covariates to build the permutation importance model on - :param test_y: Test data response to build the permutation importance model on - :return: Pandas dataframe of feature importances, ranked by most important to least - """ - - rf = RandomForestRegressor(random_state=self.random_state) - rf.fit(train_x, train_y) - - # Print the name and importance of each feature - rf_importance_df = [] - for feature, importance in zip(train_x.columns, rf.feature_importances_): - rf_importance_df.append( - { - "Feature": feature, - "rf_importance": importance - } - ) - rf_importance_df = pd.DataFrame(rf_importance_df) - rf_importance_df = rf_importance_df.sort_values(by="rf_importance", ascending=False) - - perm_importance = self.permuation_importance(rf, test_x, test_y) - - return rf_importance_df, perm_importance - - @staticmethod - def permuation_importance(rf, test_x, test_y): - """ - Simple utility function to produce permutation importance for a given model\ - :param rf: Random forest model to calculate permutation importance for - :param test_x: Test covariates to be used for permutation importance - :param test_y: Test response to be used for permutation importance - :return: - """ - perm_importance = permutation_importance(rf, test_x, test_y, scoring='neg_mean_squared_error') - perm_importance_df = pd.DataFrame( - { - "Feature": test_x.columns, - "perm_importance": perm_importance.importances_mean - } - ).sort_values(by="perm_importance", ascending=False) - - return perm_importance_df - - def detect_multi_collinearity(self): - # Get the VIFs for each variable - vifs = pd.DataFrame() - vifs["features"] = self.train_x.columns - vifs["vif"] = [variance_inflation_factor(self.train_x.values, i) for i in tqdm(range(self.train_x.shape[1]))] - - # Get the features with the highest VIF - vifs = vifs.sort_values("vif", ascending=False) - - # There are some features, we do not want to remove - required_features = [ - "walls_u_value", "floor_u_value", "roof_u_value", "idx", "is_rdsap" - ] - - vifs = vifs[~vifs["features"].isin(required_features)] - drop_vifs = vifs[np.isinf(vifs["vif"])] - - # Acceptable drop variables: - # main-fuel_Gas: mains gas - # glazed-type_NO DATA! - # glazed-area_NO DATA! - - self.train_x = self.train_x.drop(columns=drop_vifs["features"].values) - self.test_x = self.test_x[self.train_x.columns] - - @staticmethod - def plot_regression(df): - # Extract the "fit" and "actual" columns from the dataframe - fit = df['fit'] - actual = df['actual'] - - # Create an array of x-values (assumed to be sequential integers) - x = np.arange(len(df)) - - # Plot the fit and actual data - plt.plot(x, fit, color='red', label='Fit') - plt.plot(x, actual, color='blue', label='Actual') - - # Set labels and title - plt.xlabel('Index') - plt.ylabel('Value') - plt.title('Linear Regression - Fit vs Actual') - - # Display legend - plt.legend() - - # Show the plot - plt.show() - - @staticmethod - def calculate_regression_metrics(y_true, y_pred, n=20): - """ - Calculate the 5 most important accuracy metrics for regression. - - Args: - y_true (array-like): Array of true target values. - y_pred (array-like): Array of predicted target values. - - Returns: - dict: Dictionary containing the calculated metrics. - """ - metrics = { - 'MAPE': mean_absolute_percentage_error(y_true, y_pred), - 'Mean Squared Error': mean_squared_error(y_true, y_pred), - 'Mean Absolute Error': mean_absolute_error(y_true, y_pred), - 'R2 Score': r2_score(y_true, y_pred), - 'Explained Variance Score': explained_variance_score(y_true, y_pred), - 'Median Absolute Error': median_absolute_error(y_true, y_pred) - } - - errors = pd.DataFrame() - errors['Fit'] = y_true - errors['Actual'] = y_pred - errors['Residual'] = errors['Actual'] - errors['Fit'] - errors['Absolute Residual'] = np.abs(errors['Residual']) - - worst_errors = errors.nlargest(n, 'Absolute Residual') - - return metrics, worst_errors diff --git a/model_data/analysis/UvalueEstimations.py b/model_data/analysis/UvalueEstimations.py deleted file mode 100644 index 0a1441bb..00000000 --- a/model_data/analysis/UvalueEstimations.py +++ /dev/null @@ -1,207 +0,0 @@ -import pickle -import pandas as pd -import numpy as np -from model_data.EpcClean import EpcClean - - -class UvalueEstimations: - def __init__(self, data: list): - """ - Initialize the UvalueEstimations class. - - :param data: The input data as a list of dictionaries, to be converted to a dataframe - """ - self.data = pd.DataFrame(data) - self.walls = None - self.walls_decile_data = {} - self.roofs = None - self.floors = None - self.floors_decile_data = {} - - def get_estimates(self, cleaner: EpcClean): - """ - Calculate U-value estimates for walls, roofs, and floors. - - :param cleaner: An instance of the EpcClean class used for cleaning data. - """ - self.set_walls(cleaner) - self.set_roofs(cleaner) - self.set_floors(cleaner) - - def set_walls(self, cleaner: EpcClean): - """ - Set U-value estimates for walls. - - :param cleaner: An instance of the EpcClean class used for cleaning data. - """ - walls_columns = [ - "local-authority", "property-type", "walls-description", "walls-energy-eff", "walls-env-eff", "built-form", - "total-floor-area", "number-habitable-rooms", "number-heated-rooms" - ] - - walls_df = self.data[self.data["walls-description"].str.contains("Average thermal transmittance")] - - # Take just the columns we want - walls_df = walls_df[walls_columns] - walls_df["total-floor-area"] = walls_df["total-floor-area"].astype(float) - - walls_df, decile_labels, decile_boundaries = self.classify_into_deciles(walls_df, "total-floor-area") - - # We now get the U-values - walls_df = walls_df.merge( - pd.DataFrame(cleaner.cleaned['walls-description'])[["original_description", "thermal_transmittance"]], - how="left", - right_on="original_description", - left_on="walls-description" - ) - - u_value_summary = walls_df.groupby( - [ - "local-authority", - "property-type", - "walls-energy-eff", - "walls-env-eff", - "built-form", - "number-habitable-rooms", - "number-heated-rooms", - "total-floor-area_group" - ], - observed=True - ).agg({"thermal_transmittance": ["median", "size"]}).reset_index() - - u_value_summary.columns = [ - "local-authority", - "property-type", - "walls-energy-eff", - "walls-env-eff", - "built-form", - "number-habitable-rooms", - "number-heated-rooms", - "total-floor-area_group", - "median_thermal_transmittance", - "n_samples" - ] - - self.walls = u_value_summary - self.walls_decile_data = { - "decile_labels": decile_labels, - "decile_boundaries": decile_boundaries - } - - def set_roofs(self, cleaner: EpcClean): - """ - Set U-value estimates for roofs. - - :param cleaner: An instance of the EpcClean class used for cleaning data. - """ - pass - - def set_floors(self, cleaner: EpcClean): - """ - Set U-value estimates for floors. - - :param cleaner: An instance of the EpcClean class used for cleaning data. - """ - floors_columns = [ - "local-authority", "property-type", "floor-description", "floor-energy-eff", "floor-env-eff", - "built-form", - "total-floor-area", "number-habitable-rooms", "number-heated-rooms" - ] - - floors_df = self.data[self.data["floor-description"].str.contains("Average thermal transmittance")] - - # Take just the columns we want - floors_df = floors_df[floors_columns] - floors_df["total-floor-area"] = floors_df["total-floor-area"].astype(float) - - floors_df, decile_labels, decile_boundaries = self.classify_into_deciles(floors_df, "total-floor-area") - - # We now get the U-values - floors_df = floors_df.merge( - pd.DataFrame(cleaner.cleaned['floor-description'])[["original_description", "thermal_transmittance"]], - how="left", - right_on="original_description", - left_on="floor-description" - ) - - u_value_summary = floors_df.groupby( - [ - "local-authority", - "property-type", - "floor-energy-eff", - "floor-env-eff", - "built-form", - "number-habitable-rooms", - "number-heated-rooms", - "total-floor-area_group" - ], - observed=True - ).agg({"thermal_transmittance": ["median", "size"]}).reset_index() - - u_value_summary.columns = [ - "local-authority", - "property-type", - "floor-energy-eff", - "floor-env-eff", - "built-form", - "number-habitable-rooms", - "number-heated-rooms", - "total-floor-area_group", - "median_thermal_transmittance", - "n_samples" - ] - - self.floors = u_value_summary - self.floors_decile_data = { - "decile_labels": decile_labels, - "decile_boundaries": decile_boundaries - } - - @staticmethod - def classify_into_deciles(df: pd.DataFrame, column: str) -> (pd.DataFrame, list, list): - """ - Break a column in a Pandas DataFrame into deciles and classify new values into the existing deciles. - - :param df: The input Pandas DataFrame. - :param column: The column name to break into deciles. - - :return: A tuple containing: - - The DataFrame with the decile group column. - - The list of decile labels. - - The list of decile boundaries. - """ - # Calculate decile boundaries - decile_boundaries = np.percentile(df[column], np.arange(0, 101, 10)) - - # Create decile labels - decile_labels = [f"Decile {i + 1}" for i in range(10)] - - # Assign decile labels to existing values - df[column + "_group"] = pd.cut(df[column], bins=decile_boundaries, labels=decile_labels, - include_lowest=True) - - return df, decile_labels, decile_boundaries - - @staticmethod - def classify_decile_newvalues(decile_boundaries, decile_labels, new_values: list) -> list: - """ - Classify new values into existing deciles based on decile definitions. - - :param decile_boundaries: The list of decile boundaries. - :param decile_labels: The list of decile labels. - :param new_values: A list of new values to classify. - - :return: The classifications for the new values as a list. - """ - # Classify new values based on decile definitions - classifications = pd.cut(new_values, bins=decile_boundaries, labels=decile_labels, include_lowest=True) - return classifications.tolist() - - def _save(self, filename): - """ - Useful utility function to store this object, which is particularly handy for unit testing - :return: - """ - with open(filename, 'wb') as f: - pickle.dump(self, f) - \ No newline at end of file diff --git a/model_data/config.py b/model_data/config.py deleted file mode 100644 index 14150d88..00000000 --- a/model_data/config.py +++ /dev/null @@ -1,6 +0,0 @@ -import os -from dotenv import load_dotenv - -load_dotenv(dotenv_path='model_data/.env') - -EPC_AUTH_TOKEN = os.environ.get('EPC_AUTH_TOKEN') diff --git a/model_data/downloader.py b/model_data/downloader.py deleted file mode 100644 index 5355367b..00000000 --- a/model_data/downloader.py +++ /dev/null @@ -1,29 +0,0 @@ -import time - - -def pagenated_epc_download(client, params, page_size, n_pages, verbose=0, slowdown=0.1): - offset_from = 0 - n_completed = 0 - results = [] - complete = False - while not complete: - if verbose: - print("Pulling for page %s" % str(int(offset_from / page_size) + 1)) - time.sleep(slowdown) - search_resp = client.domestic.search(params=params, offset_from=offset_from, size=page_size) - - # Note: We can only make 10k queries for a single set of search queries. - # It might make sense to download data via zip for machine learning since we don't need this - # data to be perfectly up to date - if not search_resp: - break - - n_completed += 1 - - results.extend(search_resp["rows"]) - if n_completed == n_pages: - complete = True - else: - offset_from += page_size - - return results diff --git a/model_data/plotting/plotting_functions.py b/model_data/plotting/plotting_functions.py deleted file mode 100644 index 049ba248..00000000 --- a/model_data/plotting/plotting_functions.py +++ /dev/null @@ -1,40 +0,0 @@ -import pandas as pd -import seaborn as sns -import matplotlib.pyplot as plt - - -def create_heatmap_plots(data, response_var, pivot_var1, pivot_var2, order1=None, order2=None): - """ - Create a heatmap plot based on a list of data and given variables. - - :param data: List of dictionaries, input data. - :param response_var: String, response variable to be plotted. - :param pivot_var1: String, first pivot variable to be used in the plot. - :param pivot_var2: String, second pivot variable to be used in the plot. - :param order1: List, the order of categories for pivot_var1. Optional. - :param order2: List, the order of categories for pivot_var2. Optional. - - Returns: - None. Displays the generated plot. - """ - - # Create a DataFrame from your list of dictionaries - df = pd.DataFrame(data) - - # Convert the response variable column to float type if it's not already - df[response_var] = df[response_var].astype(float) - - # Create a pivot table - pivot = df.pivot_table(index=pivot_var1, columns=pivot_var2, values=response_var) - - # If an order is provided, reorder the pivot table - if order1 is not None: - pivot = pivot.reindex(order1) - if order2 is not None: - pivot = pivot[order2] - - # Plot the heatmap - plt.figure(figsize=(10, 6)) - sns.heatmap(pivot, annot=True, fmt=".2f", cmap='coolwarm') - plt.title(f"Heatmap of {response_var} by {pivot_var1} and {pivot_var2}") - plt.show() diff --git a/model_data/simulation_system/.gitignore b/model_data/simulation_system/.gitignore deleted file mode 100644 index 5ec28995..00000000 --- a/model_data/simulation_system/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local_model/* \ No newline at end of file diff --git a/model_data/simulation_system/.pre-commit-config.yaml b/model_data/simulation_system/.pre-commit-config.yaml deleted file mode 100644 index cbc34112..00000000 --- a/model_data/simulation_system/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 - hooks: - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace -- repo: https://github.com/psf/black - rev: 22.10.0 - hooks: - - id: black \ No newline at end of file diff --git a/model_data/simulation_system/Dockerfiles/Dockerfile.prediction b/model_data/simulation_system/Dockerfiles/Dockerfile.prediction deleted file mode 100644 index 88cea6c4..00000000 --- a/model_data/simulation_system/Dockerfiles/Dockerfile.prediction +++ /dev/null @@ -1,38 +0,0 @@ -FROM python:3.10.12-slim as release - -ARG USER=nroot -ARG UID=1000 -ARG GID=100 - -# Install patches -RUN apt-get update && apt-get upgrade -y \ - && apt-get install libgomp1 -y \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists - -# Install python packages -COPY ../requirements/predictions/predictions.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt - -# Create and configure non-root user -RUN useradd \ - --create-home \ - --uid ${UID} \ - --gid ${GID} \ - --shell /bin/bash \ - ${USER} - -# Copy the project code to user home directory -COPY --chown=${UID}:${GID} ./core /home/simulation_system/core -COPY --chown=${UID}:${GID} ./MLModel /home/simulation_system/MLModel -COPY --chown=${UID}:${GID} ./predictions.py /home/simulation_system/predictions.py - -# FOR TESTING -# COPY --chown=${UID}:${GID} ./model_build_data /home/simulation_system/model_build_data - -# Switch user -USER ${USER} -WORKDIR /home/simulation_system - -# Run the python command -CMD ["python3", "predictions.py", "--data-path", "s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data_with_id.parquet"] diff --git a/model_data/simulation_system/Dockerfiles/Dockerfile.prediction.lambda b/model_data/simulation_system/Dockerfiles/Dockerfile.prediction.lambda deleted file mode 100644 index f3708ed9..00000000 --- a/model_data/simulation_system/Dockerfiles/Dockerfile.prediction.lambda +++ /dev/null @@ -1,22 +0,0 @@ -FROM public.ecr.aws/lambda/python:3.10 - -# Set the working directory -WORKDIR ${LAMBDA_TASK_ROOT}/simulation_system -ENV PYTHONPATH "${PYTHONPATH}:${LAMBDA_TASK_ROOT}/simulation_system" - -# Install necessary build tools - required to test locally -RUN yum install -y gcc python3-devel - -# Install python packages -COPY requirements/predictions/predictions.txt ./requirements.txt -RUN pip install --no-cache-dir -r ./requirements.txt - -# Copy the project code to the working directory -COPY ./core ./core -COPY ./MLModel ./MLModel -COPY ./predictions.py ./predictions.py -COPY ./handlers/predictions_app.py ./predictions_app.py -COPY ./__init__.py ./__init__.py - -# Run off a lambda trigger -CMD [ "simulation_system.predictions_app.handler" ] diff --git a/model_data/simulation_system/Dockerfiles/Dockerfile.training b/model_data/simulation_system/Dockerfiles/Dockerfile.training deleted file mode 100644 index 1eadee7b..00000000 --- a/model_data/simulation_system/Dockerfiles/Dockerfile.training +++ /dev/null @@ -1,38 +0,0 @@ -FROM python:3.10.12-slim as release - -ARG USER=nroot -ARG UID=1000 -ARG GID=100 - -# Install patches -RUN apt-get update && apt-get upgrade -y \ - && apt-get install libgomp1 -y \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists - -# Install python packages -COPY ../requirements/training/training.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt - -# Create and configure non-root user -RUN useradd \ - --create-home \ - --uid ${UID} \ - --gid ${GID} \ - --shell /bin/bash \ - ${USER} - -# Copy the project code to user home directory -COPY --chown=${UID}:${GID} ./core /home/simulation_system/core -COPY --chown=${UID}:${GID} ./MLModel /home/simulation_system/MLModel -COPY --chown=${UID}:${GID} ./training.py /home/simulation_system/training.py - -# FOR TESTING -# COPY --chown=${UID}:${GID} ./model_build_data /home/simulation_system/model_build_data - -# Switch user -USER ${USER} -WORKDIR /home/simulation_system - -# Run the python command -CMD ["python3", "training.py", "--train-filepath", "s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/train_validation_data.parquet", "--test-filepath", "s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data.parquet"] diff --git a/model_data/simulation_system/Dockerfiles/Dockerfile.training.lambda b/model_data/simulation_system/Dockerfiles/Dockerfile.training.lambda deleted file mode 100644 index 34d3fe42..00000000 --- a/model_data/simulation_system/Dockerfiles/Dockerfile.training.lambda +++ /dev/null @@ -1,14 +0,0 @@ -FROM public.ecr.aws/lambda/python:3.10 - -# Install python packages -COPY ../requirements/training/training.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt - -# Copy the project code to user home directory -COPY ./core ${LAMBDA_TASK_ROOT}/simulation_system/core -COPY ./MLModel ${LAMBDA_TASK_ROOT}/simulation_system/MLModel -COPY ./training.py ${LAMBDA_TASK_ROOT}/simulation_system/training.py -COPY ./handlers/training_app.py ${LAMBDA_TASK_ROOT}/simulation_system/training_app.py - -# Run off a lambda trigger -CMD [ "training_app.handler" ] diff --git a/model_data/simulation_system/MLModel/BaseMLModel.py b/model_data/simulation_system/MLModel/BaseMLModel.py deleted file mode 100644 index aa10e26f..00000000 --- a/model_data/simulation_system/MLModel/BaseMLModel.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -BaseMLModel class -This is the base protocol: -- Any implementation will be its own seperate file -Key tasks: -- Template Model class for different model types -- Save model -- Load Model -- Generate Inference -""" - -from numpy import ndarray -from pathlib import Path -from typing import Protocol, NamedTuple, Any -import pandas as pd -from training import S3FSClient - - -class MLModel(Protocol): - """ - Base ML Model protocol - """ - - def load_model(self, filepath: Path) -> None: - """ - Providing a path, this function will load the model to be used. Will load to internal variable - """ - - def save_model( - self, output_filepath: Path, s3_client: S3FSClient | None = None - ) -> None: - """ - Providing a path, this function will save the model to be used. - """ - - def train_model( - self, data: pd.DataFrame, target_column: str, hyperparameters: dict - ) -> None: - """ - For the given data and hyperparameters (specified to the model), a model is trained - """ - - def generate_predictions(self, data: pd.DataFrame) -> ndarray[Any, Any] | None: - """ - For the given dataframe, model is loaded and predictions are generated - """ - - def model_evaluation( - self, - validation_data: pd.DataFrame, - target_column: str, - metrics_location: Path | None = None, - ) -> pd.DataFrame | None: - """ - For any validation data, a set of predictions and metrics are return - """ - - def optimise_model_for_deployment(self): - """ - Perfomance post processing on Model to ensure ready for deployment - """ - - def model_metadata(self) -> dict | None: - """ - Extract out model metadata as dictionary - """ diff --git a/model_data/simulation_system/MLModel/Models.py b/model_data/simulation_system/MLModel/Models.py deleted file mode 100644 index ac8f1409..00000000 --- a/model_data/simulation_system/MLModel/Models.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Different implementations of the MLModel Protocol -Uses the BaseMLModel protocol -Key tasks: -- Template Model class for different model types -- Save model -- Load Model -- Generate Inference -""" - -import os -from typing import Any -from pathlib import Path -import pandas as pd -from autogluon.tabular import TabularDataset, TabularPredictor -from core.Logger import logger -from core.Metrics import Metrics -from core.Settings import METRIC_FILENAME -from core.CloudClient import BotoClient - -AUTOGLUON_HYPERPARAMETERS = [ - "problem_type", - "eval_metric", - "time_limit", - "presets", - "excluded_model_types", -] - - -def model_factory(model_type: str, hyperparameters: dict) -> dict: - """ - Use factory pattern to register the different ML implementations - """ - - model_types = { - "autogluon": { - "model": AutogluonModel, - "naming_attributes": f"{hyperparameters['presets']}-{hyperparameters['time_limit']}", - }, - } - - return model_types[model_type] - - -class AutogluonModel: - """ - Autogluon model that implements the MLModel Protocol - """ - - def __init__(self, output_filepath: Path | None = None) -> None: - self.model = None - self.output_filepath = output_filepath - self.predictions = None - - def load_model( - self, - filepath: str | Path, - client: BotoClient, - model_folder: str = "local_model", - ) -> None: - """ - Providing a path, this function will load the model to be used. Will load to internal variable - """ - filepath = str(filepath) - if client.client is None: - logger.info("In local development mode - no need for s3 client") - self.model = TabularPredictor.load(path=filepath) - else: - logger.info(f"Loading model from s3 with filepath: %s and model_folder: %s" % (filepath, model_folder)) - client.download_model(filepath=filepath, model_folder=model_folder) - self.model = TabularPredictor.load(path=str(Path(model_folder) / filepath)) - - def save_model(self, output_filepath: Path, client: BotoClient) -> None: - """ - Providing a path, this function will save the model to be used. - """ - if client.client is None: - logger.info("In local development mode - no need for s3 client") - logger.info("Using AutoGluon Model - Model saving already occured") - else: - logger.info(f"Saving model into s3") - - self.directory_upload( - client=client, - local_directory=str(output_filepath), - bucket_name=client.model_bucket, - ) - - logger.info("Save complete") - - def directory_upload(self, client, local_directory, bucket_name): - - # Iterate through the local directory and upload each file - for root, dirs, files in os.walk(local_directory): - for file in files: - # Determine the local file path and S3 object key - local_file_path = os.path.join(root, file) - s3_object_key = os.path.relpath(local_file_path, local_directory) - - # Upload the file to S3 - client.client.upload_file(local_file_path, bucket_name, local_file_path) - - logger.info( - f"Uploaded {local_file_path} to {bucket_name}/{local_file_path}" - ) - - def train_model( - self, data: pd.DataFrame, target_column: str, hyperparameters: dict - ) -> None: - """ - For the given data and hyperparameters, a model is trained - """ - if self.output_filepath is None: - logger.error("Please specify a output_filepath in order to train a model") - exit(1) - - if set(AUTOGLUON_HYPERPARAMETERS) != set(hyperparameters.keys()): - print( - "Hyperparameters (dict) is incorrectly defined - please check what hyperparameters are required" - ) - exit(1) - - AGdata = TabularDataset(data=data) - - self.model = TabularPredictor( - label=target_column, - path=self.output_filepath, - problem_type=hyperparameters["problem_type"], - eval_metric=hyperparameters["eval_metric"], - ).fit( - AGdata, - time_limit=hyperparameters["time_limit"], - presets=hyperparameters["presets"], - excluded_model_types=hyperparameters["excluded_model_types"], - ) - - def generate_predictions(self, data: pd.DataFrame) -> pd.Series: - """ - For the given dataframe, model is loaded and predictions are generated - """ - - if self.model is None: - print("No model loaded/ trained") - exit(1) - - predictions = pd.Series(self.model.predict(data)) - - return predictions - - def model_evaluation( - self, - validation_data: pd.DataFrame, - target_column: str, - metrics: Metrics, - metrics_location: Path | None = None, - metric_filename: str = METRIC_FILENAME, - ) -> pd.DataFrame: - """ - For any validation data, a set of predictions and metrics are return - """ - if metrics_location is None: - logger.warning("Metrics will be outputted to current folder") - metrics_location = Path() - - if self.model is None: - logger.error("No model loaded/ trained - Unable to generate evaluation") - exit(1) - - # Generate prediction, load metrics suite, generate metrics betweeen the two - predictions = self.generate_predictions(validation_data) - - performance = metrics.generate_metric_suite( - actuals=validation_data[target_column], predictions=predictions - ) - - logger.info("Prediction used for evaluations are saved in self.prediction") - self.predictions = predictions - - logger.info("Saving metric file as metric.csv") - metrics_location.mkdir(exist_ok=True) - - metrics_df = pd.DataFrame([performance]) - metrics_df.to_csv(metrics_location / metric_filename) - markdown_filename = metric_filename.split(".")[0] + ".md" - metrics_df.to_markdown(metrics_location / markdown_filename) - - return metrics_df - - def optimise_model_for_deployment( - self, deployment_path: Path | str | None = None - ) -> Any: - """ - We can optimise the deployment for a autogluon model - """ - if self.model is None: - raise ValueError("No model to optimise for deployment") - - if deployment_path is None: - raise ValueError("Deployment path required") - - deployment_path = str(deployment_path) - - # This will return a string path of the location - return self.model.clone_for_deployment(deployment_path) - - def model_metadata(self) -> dict[str, Any]: - """ - For Autogluon model, use the inbuilt model info method - """ - - if self.model is None: - logger.error("No Model loaded/ trained") - exit(1) - - return self.model.info() diff --git a/model_data/simulation_system/Makefile b/model_data/simulation_system/Makefile deleted file mode 100644 index 4aad42b1..00000000 --- a/model_data/simulation_system/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -export PYENV_ROOT=$(HOME)/.pyenv -export PATH := $(PYENV_ROOT)/bin:$(PATH) -PYTHON_VERSION ?= 3.10.12 - -.PHONY: init -init: build docker - -.PHONY: training_env -env: - pyenv install $(PYTHON_VERSION) || echo "Proceeding..." # || is to swallow non-zero response if python version already is installed - pyenv global $(PYTHON_VERSION) - python3 -m venv .training_env - . .training_env/bin/activate - pip install --upgrade pip - pip install -r requirements/training/training-dev.txt && pre-commit install - - echo " --- TO ACTIVATE THE ENVIRONMENT --- " - echo "Run source .training_env/bin/activate to activate the virtual environment" - -.PHONY: check-all -check-all: pre-commit run -a - -.PHONY: build -build: - docker-compose build - -.PHONY: docker -docker: - docker-compose up -d - -.PHONY: down -down: - docker compose down diff --git a/model_data/simulation_system/README.md b/model_data/simulation_system/README.md deleted file mode 100644 index e98767ea..00000000 --- a/model_data/simulation_system/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Simulation System - -Starter Readme: -Steps for pipeline: - -- (WIP) Set up the training development environment - - Change directory to this folder (simulation_system) - - Run the following command `make env PYTHON_VERSION=3.10.12` - - This will install the specified python version using `pyenv` and select this version as the global python version - - It will install all training packages as specified in the training-dev.txt requirements file, including the pre-commit hooks - - Run `source .training_env/bin/activate` to use this environment - -- (WIP) Use Makefile to start up mock up s3 service - - By running `make init`, this will run the `docker-compose build` and `docker-compose up -d`, which spins up a S3 service - - This docker compose is running in detached mode `-d`, so will no output anything to the terminal - -- Once the Minio service is run, you can run the `training.py` file to start a model build process - - This will output a model, for a given target column, and add model name composed of some of the hyperparameters - - An example of running this file is: - - `python3 training.py --train-filepath ./model_build_data/change_data/rdsap_full/train_validation_data.parquet --test-filepath ./model_build_data/change_data/rdsap_full/test_data.parquet` - - Outputs of the pipeline are: - - A model directory bucket - - A target variable prefix (i.e. RDSAP_CHANGE or HEAT_DEMAND_CHANGE) - - A model type prefix (i.e. autogluon, tensorflow etc) - - A model name prefix (i.e. rdsap_change_medium_quality_60_TIMESTAMP) - - This model name is made up of target variable, quality, time spent training and timestamp - - Within this prefix, there are three folders: - - model - - The model path that can be loaded in the codebase - - deployment - - The optimised model that can be deployed (may or maynot need this) - - metrics - - The metrics generatted from the model (may or may not need this as this can be contained in the registry) - -- Once model build is finished, you can run the `prediction.py` file to generate prediction - - By default, the prediction pipeline will select the best model based on **mean absolute error** from the model registry - - This can be overwritten by specifying a model_path, which will load an alternative model - - There are two ways of getting data into the pipeline: - - Using the `--data` argument: - - This is a JSON string which can be passed as `python3 predictions.py --data '{"TOTAL_FLOOR_AREA": 1}'` - - Note the single and double quotation marks, as this affects the ingestion - - Using the `--data-path` argument: - - This can be a filepath (Can imagine that we might want to pull data from S3/ DB) - - An example of running the file is: - - `python3 predictions.py --data-path ../simulation_system/model_build_data/change_data/rdsap_full/test_data.parquet` - - Outputs of the pipeline are: - - prediction bucket - - a Target variables prefix (i.e. RDSAP_CHANGE or HEAT_DEMAND_CHANGE) - - a uprn prefix (i.e 0123456789) - - a `prediction.json` - - a `metadata.json` - - This is all the metadata from the model (can change this if needed) - -- NOTE: If you wish to change any settings, these are currently all in the `Settings.py` file - - It will be separated out eventually but for now, it works to keep track of anything that we might want to respecify. - - I.e. the hyperparameters for models are in here but will move into a separate configuration file - - -# TODO: -- Structure/ MLOps: - - Add configuration files (dev, staging, prod), including hyperparamters - - Add precommit hooks (linters, branch names, etc) - - Sphinx documentation - - Sort out local mock up services - - Sort out Model Registry - - Sort out Data version control - - pre-commit hooks: - - The types of hooks that we want (safety, bandit, iso8 etc) - - The customisations we require - - Add sphinx documentation -- Data Science: - - Implement a metrics class, to hold all metric - - Rebuild metrics script (Could be a one off but good to have) - - Determine metrics - - Implement and test custom model (Tensorflow Decision Trees etc) -- Orchestration: - - Lambda handler for the pipeline diff --git a/model_data/simulation_system/core/CloudClient.py b/model_data/simulation_system/core/CloudClient.py deleted file mode 100644 index 8656a22e..00000000 --- a/model_data/simulation_system/core/CloudClient.py +++ /dev/null @@ -1,183 +0,0 @@ -""" -Set up the client to be used for downloading and uploading model files -""" - -import os -import boto3 -from core.Logger import logger - - -# class S3FSClient: -# """ -# Set up the correct client to upload files to s3 -# """ - -# def __init__(self, runtime_environment: str = "local") -> None: -# self.client: s3fs.S3FileSystem | None = None -# self.model_bucket: str - -# self.client_factory(runtime_environment) -# self.determine_model_bucket(runtime_environment) - -# def client_factory(self, runtime_environment: str = "local"): -# """ -# Select the correct s3 client to use -# """ - -# if runtime_environment == "local": -# logger.info("No S3 client setup required") -# elif runtime_environment == "local-mock": -# logger.info(f"S3 settings for {runtime_environment}") -# self.client = s3fs.S3FileSystem( -# key=os.environ.get("AWS_ACCESS_KEY_ID", "admin"), -# secret=os.environ.get("AWS_SECRET_ACCESS_KEY", "password"), -# client_kwargs={ -# "endpoint_url": os.environ.get( -# "ENDPOINT_URL", "http://localhost:9000" -# ) -# }, -# ) -# elif runtime_environment in ["dev", "staging", "prod"]: -# logger.info(f"S3 settings for {runtime_environment}") -# # Key/ token should be in session/lambda for this -# self.client = s3fs.S3FileSystem() -# else: -# raise NotImplementedError("No correspnding runtime environment") - -# def determine_model_bucket(self, runtime_environment: str) -> None: -# """ -# For the given environment, return the correct bucket for models -# """ -# if runtime_environment == "local": -# logger.info("In local development - no need for s3") -# elif runtime_environment in ["local-mock", "dev"]: -# # TODO: get from enironment -# self.model_bucket = "retrofit-model-directory-dev" -# elif runtime_environment in ["staging", "prod"]: -# self.model_bucket = f"retrofit-model-directory-{runtime_environment}" -# else: -# raise NotImplementedError("No corresponding runtime environment") - -# def download_model(self, filepath: str, model_folder: str): -# """ -# For the file path, download the model locally so that we can load the model -# """ - -# if self.client is None: -# logger.info("No need to download model as local development") -# else: - -# def list_files_recursively(folder_path, client): -# all_files = [] -# for root, dirs, files in client.walk(folder_path): -# for file in files: -# s3_path = os.path.join(root, file) -# all_files.append(s3_path) -# return all_files - -# # List all files in the specified S3 folder and its subfolders -# files = list_files_recursively( -# f"{self.model_bucket}/{filepath}", client=self.client -# ) - -# # Download each file -# for file in files: -# # Extract the filename from the S3 path -# filename = file.split(filepath)[-1] - -# # Define the local path where you want to save the file -# local_path = os.path.join(model_folder, filename) - -# # Download the file from S3 to the local directory -# self.client.get(file, local_path) -# print(f"Downloaded {filename} to {local_path}") - -# print("Download completed.") - - -class BotoClient: - """ - Using boto3 to access the different aws storage configurations - """ - - def __init__(self, runtime_environment: str = "local") -> None: - self.client = None - self.model_bucket: str - - self.client_factory(runtime_environment) - self.determine_model_bucket(runtime_environment) - - def client_factory(self, runtime_environment: str = "local"): - """ - Select the correct s3 client to use - """ - - if runtime_environment == "local": - logger.info("No S3 client setup required") - elif runtime_environment == "local-mock": - logger.info(f"S3 settings for {runtime_environment}") - session = boto3.Session() - self.client = session.client( - service_name="s3", - aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID", "admin"), - aws_secret_access_key=os.environ.get( - "AWS_SECRET_ACCESS_KEY", "password" - ), - endpoint_url=os.environ.get("ENDPOINT_URL", "http://localhost:9000"), - ) - elif runtime_environment in ["dev", "staging", "prod"]: - logger.info(f"S3 settings for {runtime_environment}") - # Key/ token should be in session/lambda for this - self.client = boto3.client("s3") - else: - raise NotImplementedError("No correspnding runtime environment") - - def determine_model_bucket(self, runtime_environment: str) -> None: - """ - For the given environment, return the correct bucket for models - """ - if runtime_environment == "local": - logger.info("In local development - no need for s3") - elif runtime_environment in ["local-mock", "dev"]: - # TODO: get from enironment - self.model_bucket = "retrofit-model-directory-dev" - elif runtime_environment in ["staging", "prod"]: - self.model_bucket = f"retrofit-model-directory-{runtime_environment}" - else: - raise NotImplementedError("No corresponding runtime environment") - - def download_model(self, filepath: str, model_folder: str): - """ - For the file path, download the model locally so that we can load the model - """ - # List all objects with the specified prefix in the bucket - - if self.client is None: - raise ValueError("SHould not be in here!") - - objects = self.client.list_objects_v2(Bucket=self.model_bucket, Prefix=filepath) - - # Ensure the local directory for downloads exists - if not os.path.exists(model_folder): - os.makedirs(model_folder) - - # Download each object with the specified prefix - for obj in objects.get("Contents", []): - # Get the object key (file path) - object_key = obj["Key"] - - # Determine the local file path to save the object - local_file_path = os.path.join( - model_folder, object_key.split(f"{filepath}/")[-1] - ) - - # Create the local directory if it doesn't exist - local_directory = os.path.dirname(local_file_path) - if not os.path.exists(local_directory): - os.makedirs(local_directory) - - # Download the object from S3 to the local directory - self.client.download_file(self.model_bucket, object_key, local_file_path) - print(f"Downloaded {object_key} to {local_file_path}") - - print("Download completed.") diff --git a/model_data/simulation_system/core/DataLoader.py b/model_data/simulation_system/core/DataLoader.py deleted file mode 100644 index c5c10b0a..00000000 --- a/model_data/simulation_system/core/DataLoader.py +++ /dev/null @@ -1,145 +0,0 @@ -import pandas as pd -import os -from typing import Protocol -import boto3 -from io import BytesIO, StringIO -from core.CloudClient import BotoClient - - -def read_parquet_from_s3(client, bucket_name, file_key): - """ - Read a CSV file from S3 using boto3 and pandas. - - :param bucket_name: Name of the S3 bucket. - :param file_key: Key of the file (including directory path within the bucket). - :param aws_access_key_id: AWS Access Key ID - :param aws_secret_access_key: AWS Secret Access Key - :return: DataFrame containing the CSV data. - """ - - # Get the object - s3_object = client.get_object(Bucket=bucket_name, Key=file_key) - - # Read the CSV body into a DataFrame - csv_body = s3_object["Body"].read() - df = pd.read_parquet(BytesIO(csv_body)) - - return df - - -def read_csv_from_s3(client, bucket_name, file_key, index_col): - """ - Read a CSV file from S3 using boto3 and pandas. - - :param bucket_name: Name of the S3 bucket. - :param file_key: Key of the file (including directory path within the bucket). - :param aws_access_key_id: AWS Access Key ID - :param aws_secret_access_key: AWS Secret Access Key - :return: DataFrame containing the CSV data. - """ - - # Get the object - s3_object = client.get_object(Bucket=bucket_name, Key=file_key) - - # Read the CSV body into a DataFrame - csv_body = s3_object["Body"].read().decode("utf-8") - df = pd.read_csv(StringIO(csv_body), index_col=index_col) - - return df - - -class DataLoader(Protocol): - """ - Interface for all DataLoader classes - """ - - @staticmethod - def load( - client: BotoClient, filepath: str, index_col: str | None = None - ) -> pd.DataFrame | None: - """ - Loading data from the relevant source - """ - - -class LocalDataLoader: - """ - Implements the DataLoader Protocol for local files - """ - - @staticmethod - def load( - client: BotoClient, filepath: str, index_col: str | None = None - ) -> pd.DataFrame: - - if not os.path.exists(filepath): - raise FileNotFoundError(f"File not found: {filepath}") - - if filepath.endswith(".parquet"): - df = pd.read_parquet(filepath) - if index_col is not None: - df = df.set_index(index_col) - elif filepath.endswith(".csv"): - df = pd.read_csv(filepath, index_col=index_col) - else: - raise ValueError(f"File format not supported for file: {filepath}") - - return df - - -class S3DataLoader: - """ - Implements the DataLoader Protocol for s3 files, hosting locally in a mocked service - """ - - @staticmethod - def load( - client: BotoClient, filepath: str, index_col: str | None = None - ) -> pd.DataFrame: - - if not filepath.startswith("s3://"): - filepath = "s3://" + filepath - - filepath_split = filepath.split("s3://")[-1].split("/", 1) - bucket = filepath_split[0] - key = filepath_split[1] - - if filepath.endswith(".parquet"): - df = read_parquet_from_s3( - client=client.client, bucket_name=bucket, file_key=key - ) - if index_col is not None: - df = df.set_index(index_col) - elif filepath.endswith(".csv"): - df = read_csv_from_s3( - client=client.client, - bucket_name=bucket, - file_key=key, - index_col=index_col, - ) - else: - raise ValueError(f"File format not supported for file: {filepath}") - - return df - - -def dataloader_factory(runtime_environment: str | None = None) -> DataLoader: - """ - Use factory pattern to determine which loading method we use - """ - - if runtime_environment is None: - runtime_environment = "local" - - dataloader_types = { - "local": LocalDataLoader(), - "local-mock": S3DataLoader(), - "dev": S3DataLoader(), - "staging": S3DataLoader(), - "prod": S3DataLoader(), - } - - if runtime_environment not in dataloader_types: - raise ValueError("Incorrect runtime environment specified") - - return dataloader_types[runtime_environment] diff --git a/model_data/simulation_system/core/Logger.py b/model_data/simulation_system/core/Logger.py deleted file mode 100644 index 8603fff6..00000000 --- a/model_data/simulation_system/core/Logger.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Logger that will be used throughout the application -""" - -import logging - -def setup_logger(): - # Create a logger - logger = logging.getLogger() - - # Set the log level - logger.setLevel(logging.INFO) - - # Create a formatter - formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') - - # Create a stream handler to direct logs to stdout - stream_handler = logging.StreamHandler() - stream_handler.setFormatter(formatter) - - # Add the stream handler to the logger - logger.addHandler(stream_handler) - - return logger - -logger = setup_logger() \ No newline at end of file diff --git a/model_data/simulation_system/core/Metrics.py b/model_data/simulation_system/core/Metrics.py deleted file mode 100644 index 9369587d..00000000 --- a/model_data/simulation_system/core/Metrics.py +++ /dev/null @@ -1,167 +0,0 @@ -""" -Generate metrics and enable regeneration of metrics if new metrics are generated -Key tasks: -- Specify metric functions that take in prediction vs actual to generate a metric value -- Given a model and test data, produce a suite of all metrics -""" - -import os -import pandas as pd -from pathlib import Path -import seaborn as sns -import matplotlib.pyplot as plt -from core.CloudClient import BotoClient -from core.Logger import logger -from core.Settings import ( - RESIDUAL_TRUE_LABEL, - RESIDUAL_PREDICTION_LABEL, - SEABORN_RESIDUAL_AXIS_FONTSIZE, - SEABORN_RESIDUAL_TITLE_FONTSIZE, - SEABORN_RESIDUAL_STYLE, - SEABORN_RESIDUAL_ASPECT_RATIO, - SEABORN_RESIDUAL_PLOT_DPI, - SEABORN_RESIDUAL_RANGE, - SEABORN_RESIDUAL_LINE_COLOUR, - SEABORN_RESIDUAL_LINE_WIDTH, -) -from sklearn.metrics import ( - mean_absolute_error, - median_absolute_error, - mean_squared_error, - mean_absolute_percentage_error, -) - - -# Dummy example of new metric that can be added - must be true and prediction as arguments -def max_error(y_true: pd.Series, y_pred: pd.Series): - return max(y_true - y_pred) - - -METRIC_TO_APPLY = [ - mean_absolute_error, - median_absolute_error, - mean_squared_error, - mean_absolute_percentage_error, - # max_error -] - - -def sort_by_metric( - data: pd.DataFrame, optimse_metric: str, best_model_column_name: str -) -> pd.DataFrame: - """ - Helper function to sort data frame by metric and append a best model flag - """ - # Ascending as we want lowest error values - data = data.sort_values(optimse_metric, ascending=True).reset_index(drop=True) - data[best_model_column_name] = [False] * len(data) - data.loc[0, best_model_column_name] = True - - return data - - -class Metrics: - """ - All metric functions used to generate a dictionary of metrics - """ - - def upload_metrics(self, output_filepath: Path, client: BotoClient) -> None: - """ - Providing a path, this function will save the metrics folders/files. - """ - if client.client is None: - logger.info("In local development mode - no need to upload") - else: - logger.info(f"Saving metrics into s3") - s3_location = client.model_bucket + "/" + str(output_filepath) - - self.directory_upload( - client=client, - local_directory=str(output_filepath), - bucket_name=client.model_bucket, - ) - - logger.info("Save complete") - - def directory_upload(self, client, local_directory, bucket_name): - - # Iterate through the local directory and upload each file - for root, dirs, files in os.walk(local_directory): - for file in files: - # Determine the local file path and S3 object key - local_file_path = os.path.join(root, file) - s3_object_key = os.path.relpath(local_file_path, local_directory) - - # Upload the file to S3 - client.client.upload_file(local_file_path, bucket_name, local_file_path) - - logger.info( - f"Uploaded {local_file_path} to {bucket_name}/{local_file_path}" - ) - - @staticmethod - def list_metric_functions() -> list: - """ - Gather all metric functions to run - """ - return [metric_to_apply.__name__ for metric_to_apply in METRIC_TO_APPLY] - - @staticmethod - def generate_metric_suite(actuals: pd.Series, predictions: pd.Series) -> pd.Series: - """ - For the model, test data and target, generate predictions and then iterative over all metrics to generate a Series of metric values - """ - - metric_dict = {} - for metric_function in METRIC_TO_APPLY: - metric_dict[metric_function.__name__] = metric_function( - actuals, predictions - ) - - metrics = pd.Series(metric_dict) - - return metrics - - @staticmethod - def generate_plot_suite(): - """ - Can do all metric ploting - """ - - @staticmethod - def generate_residual_plot( - actuals: pd.Series, - predictions: pd.Series, - target_column: str, - output_filepath: Path | str, - ): - - # TODO: can have a model.metric_outputs method - # FOr not just do it here - residual_df = pd.DataFrame( - list(zip(actuals, predictions)), - columns=[RESIDUAL_TRUE_LABEL, RESIDUAL_PREDICTION_LABEL], - ) - - # image formatting - sns.set(style=SEABORN_RESIDUAL_STYLE) - ax = sns.scatterplot( - x=RESIDUAL_TRUE_LABEL, y=RESIDUAL_PREDICTION_LABEL, data=residual_df - ) - ax.set_aspect(SEABORN_RESIDUAL_ASPECT_RATIO) - ax.set_xlabel(f"True {target_column}", fontsize=SEABORN_RESIDUAL_AXIS_FONTSIZE) - ax.set_ylabel( - f"Predicted {target_column}", fontsize=SEABORN_RESIDUAL_AXIS_FONTSIZE - ) # ylabel - ax.set_title("Residuals", fontsize=SEABORN_RESIDUAL_TITLE_FONTSIZE) - - # Square aspect ratio - ax.plot( - SEABORN_RESIDUAL_RANGE, - SEABORN_RESIDUAL_RANGE, - SEABORN_RESIDUAL_LINE_COLOUR, - linewidth=SEABORN_RESIDUAL_LINE_WIDTH, - ) - - plt.tight_layout() - plt.savefig(output_filepath, dpi=SEABORN_RESIDUAL_PLOT_DPI) diff --git a/model_data/simulation_system/core/RegistryHandler.py b/model_data/simulation_system/core/RegistryHandler.py deleted file mode 100644 index e7ec641c..00000000 --- a/model_data/simulation_system/core/RegistryHandler.py +++ /dev/null @@ -1,114 +0,0 @@ -""" - -""" - -from io import StringIO -import pandas as pd -from pathlib import Path -from core.Logger import logger -from core.CloudClient import BotoClient -from core.Metrics import Metrics -from core.Settings import BEST_MODEL_COLUMN_NAME - - -def read_csv_from_s3(client, bucket_name, file_key, index_col): - """ - Read a CSV file from S3 using boto3 and pandas. - - :param bucket_name: Name of the S3 bucket. - :param file_key: Key of the file (including directory path within the bucket). - :param aws_access_key_id: AWS Access Key ID - :param aws_secret_access_key: AWS Secret Access Key - :return: DataFrame containing the CSV data. - """ - - # Get the object - s3_object = client.get_object(Bucket=bucket_name, Key=file_key) - - # Read the CSV body into a DataFrame - csv_body = s3_object["Body"].read().decode("utf-8") - df = pd.read_csv(StringIO(csv_body), index_col=index_col) - - return df - - -class RegistryHandler: - """ - Handles the loading of the registry depending on the environment - """ - - def load_registry(self, registry_path: Path, client: BotoClient, metrics: Metrics): - """ - Depening on the environment, we will have to load from locally or s3 (mock/real) - """ - - if client.client is None: - logger.info("Using local development - no need for s3 load") - return self.load_local_registry( - registry_path=registry_path, metrics=metrics - ) - - logger.info(f"Check if registry exists") - - check_exists = client.client.list_objects_v2( - Bucket=client.model_bucket, Prefix=str(registry_path) - ) - - if "Contents" in check_exists: - logger.info("Loading existing registry") - registry_df = read_csv_from_s3( - client=client.client, - bucket_name=client.model_bucket, - file_key=str(registry_path), - index_col=None, - ) - else: - logger.info("No registry found - creating new one") - registry_df = self.create_new_registry(metrics=metrics) - - return registry_df - - def load_local_registry(self, registry_path: Path, metrics: Metrics): - """ - In local development mode, load the registry - """ - if registry_path.exists(): - logger.info("Registry file found - Loading into Dataframe") - registry_df = pd.read_csv(registry_path, index_col=None) - else: - logger.info("No registry found - creating new one") - registry_df = self.create_new_registry(metrics=metrics) - - return registry_df - - def create_new_registry(self, metrics: Metrics): - """ - If no registry is found, create a new one - """ - # TODO: Moved columns into settings: MODEL_DETAILS and Metrics class columns - columns = [ - BEST_MODEL_COLUMN_NAME, - "model_type", - "model_name", - "model_location", - ] + metrics.list_metric_functions() - - registry_df = pd.DataFrame(columns=columns) - - return registry_df - - def save_registry(self, output_filepath: Path, client: BotoClient) -> None: - """ - Providing a path, this function will save the model to be used. - """ - if client.client is None: - logger.info("In local development mode - no need for s3 client") - else: - logger.info(f"Saving registry into s3") - s3_location = client.model_bucket + "/" + str(output_filepath) - - client.client.upload_file( - str(output_filepath), client.model_bucket, str(output_filepath) - ) - - logger.info("Save complete") diff --git a/model_data/simulation_system/docker-compose.yml b/model_data/simulation_system/docker-compose.yml deleted file mode 100644 index f875e7ef..00000000 --- a/model_data/simulation_system/docker-compose.yml +++ /dev/null @@ -1,58 +0,0 @@ -version: '3' - -services: - minio: - image: minio/minio:RELEASE.2022-05-26T05-48-41Z - ports: - - "9000:9000" - - "9001:9001" - volumes: - - ./data:/data - environment: - MINIO_ROOT_USER: &MINIO_USER admin - MINIO_ROOT_PASSWORD: &MINIO_PASS password - command: server --console-address ":9001" /data - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 30s - timeout: 20s - retries: 3 - - simulation_system_training: - build: - context: ./ - dockerfile: ./Dockerfiles/Dockerfile.training - image: simulation_system_training - environment: - RUNTIME_ENVIRONMENT: local-mock - ENDPOINT_URL: http://minio:9000/ - AWS_ACCESS_KEY_ID: *MINIO_USER - AWS_SECRET_ACCESS_KEY: *MINIO_PASS - tty: true - depends_on: - minio: - condition: service_healthy - # command: - # ["bash"] - - # simulation_system_prediction: - # build: - # context: ./ - # dockerfile: ./Dockerfiles/Dockerfile.prediction - # image: simulation_system_prediction - # environment: - # RUNTIME_ENVIRONMENT: local-mock - # ENDPOINT_URL: http://minio:9000/ - # AWS_ACCESS_KEY_ID: *MINIO_USER - # AWS_SECRET_ACCESS_KEY: *MINIO_PASS - # tty: true - # depends_on: - # simulation_system_training: - # condition: service_completed_successfully - # command: - # ["bash"] - - - -# volumes: -# minio_storage: {} diff --git a/model_data/simulation_system/energy_predictor.py b/model_data/simulation_system/energy_predictor.py deleted file mode 100644 index ab29f39c..00000000 --- a/model_data/simulation_system/energy_predictor.py +++ /dev/null @@ -1,118 +0,0 @@ -from pathlib import Path -from core.Settings import ( - RDSAP_RESPONSE, - FLOOR_LEVEL_MAP, - BUILT_FORM_REMAP, - EARLIEST_EPC_DATE, - FULLY_GLAZED_DESCRIPTIONS, - FIXED_FEATURES, - LATEST_FIELD, - COMPONENT_FEATURES -) -from model_data.BaseUtility import Definitions -from tqdm import tqdm -import pandas as pd -import numpy as np - -from autogluon.tabular import TabularDataset, TabularPredictor - -RANDOM_SEED = 0 - -DATA_DIRECTORY = Path(__file__).parent / 'data' / 'all-domestic-certificates' - -FLOAT_COLUMNS = [ - 'NUMBER_OPEN_FIREPLACES', - 'EXTENSION_COUNT', - 'TOTAL_FLOOR_AREA', - 'PHOTO_SUPPLY', - 'FIXED_LIGHTING_OUTLETS_COUNT', - 'FLOOR_HEIGHT', - 'NUMBER_HABITABLE_ROOMS', - 'LOW_ENERGY_LIGHTING', - 'MULTI_GLAZE_PROPORTION', - 'NUMBER_HEATED_ROOMS' -] - - -def create_raw_data(): - """ - Extract all information to do a simple predictor for RDSAP - """ - - directories = [entry for entry in DATA_DIRECTORY.iterdir() if entry.is_dir()] - # directories = directories[0:10] - dfs = [] - for directory in tqdm(directories): - filepath = directory / "certificates.csv" - df = pd.read_csv(filepath, low_memory=False) - - # Remove any bad uprns and ignore old/bad data - df = df[~pd.isnull(df["UPRN"])] - df = df[df["LODGEMENT_DATE"] >= EARLIEST_EPC_DATE] - df = df[df["TRANSACTION_TYPE"] != "new dwelling"] - df = df[~df["FLOOR_LEVEL"].isin(["top floor", "mid floor"])] - - # Change multi glaze proportion - no_multi_glaze_proportion_index = pd.isnull(df["MULTI_GLAZE_PROPORTION"]) & ( - df["WINDOWS_DESCRIPTION"].isin(FULLY_GLAZED_DESCRIPTIONS)) - df.loc[no_multi_glaze_proportion_index, 'MULTI_GLAZE_PROPORTION'] = 100 - - # Recast - df["UPRN"] = df["UPRN"].astype(int).astype(str) - df['MAIN_HEATING_CONTROLS'] = df['MAIN_HEATING_CONTROLS'].astype(float) - - # Sort Data - df = df.sort_values(["UPRN", "LODGEMENT_DATE"], ascending=True) - - # Map all anomaly values to None - data_anomaly_map = dict(zip(Definitions.DATA_ANOMALY_MATCHES, [None] * len(Definitions.DATA_ANOMALY_MATCHES))) - - # Use replace function to map data (if exists in key), to corresponding value - i.e. Remove invalid values - df = df.replace(data_anomaly_map) - df = df.replace(np.NAN, None) - - # Remap certain columns - df['FLOOR_LEVEL'] = df['FLOOR_LEVEL'].replace(FLOOR_LEVEL_MAP) - df['BUILT_FROM'] = df['BUILT_FORM'].replace(BUILT_FORM_REMAP) - - # Keep only possible modelling columns - df = df[[RDSAP_RESPONSE] + list(set(FIXED_FEATURES + LATEST_FIELD + COMPONENT_FEATURES))] - - # Reduce memory usage - - # df.memory_usage() - # df.dtypes - df[RDSAP_RESPONSE] = pd.to_numeric(df[RDSAP_RESPONSE], downcast='unsigned') - df[FLOAT_COLUMNS] = df[FLOAT_COLUMNS].apply(pd.to_numeric, downcast='float') - - dfs.append(df) - - data = pd.concat(dfs) - data.to_parquet('./energy_predictor_data.parquet') - - cleaned_data = data.dropna() - # GIves you primarily flats - cleaned_data.to_parquet('./energy_predictor_cleaned_data.parquet') - - -def main(): - data = TabularDataset(data='./model_build_data/energy_data/cleaned_data/train_validation_data.parquet') - - subsample_size = round(len(data) / 100) - data = data.sample(subsample_size, random_state=RANDOM_SEED) - - predictor_RDSAP = TabularPredictor( - label=RDSAP_RESPONSE, - path="agModels-predictENERGY", - problem_type="regression", - eval_metric='mean_absolute_error' - ).fit(data, time_limit=800, presets='high_quality', excluded_model_types=['KNN', 'CAT']) - - test_data = TabularDataset('./model_build_data/energy_data/cleaned_data/test_data.parquet') - performance = predictor_RDSAP.evaluate(test_data) - predictions = predictor_RDSAP.predict(test_data) - predictor_RDSAP.feature_importance(test_data) - - -if __name__ == "__main__": - main() diff --git a/model_data/simulation_system/handlers/predictions_app.py b/model_data/simulation_system/handlers/predictions_app.py deleted file mode 100644 index 4e398566..00000000 --- a/model_data/simulation_system/handlers/predictions_app.py +++ /dev/null @@ -1,91 +0,0 @@ -import boto3 -from botocore.exceptions import NoCredentialsError -import json -from io import StringIO -import os -import logging - -from predictions import prediction - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - -RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "dev") - - -def upload_dataframe_to_s3(df, bucket, s3_file_name): - """ - Upload a pandas DataFrame to an S3 bucket as CSV - - :param df: DataFrame to upload - :param bucket: Bucket to upload to - :param s3_file_name: S3 object name - :return: True if file was uploaded, else False - """ - - # Initialize the S3 client - s3 = boto3.client('s3') - csv_buffer = StringIO() - - # Write the DataFrame to the buffer as CSV - df.to_csv(csv_buffer, index=False) - - try: - # Upload the CSV from the buffer to S3 - s3.put_object(Bucket=bucket, Key=s3_file_name, Body=csv_buffer.getvalue()) - print(f"Successfully uploaded DataFrame to {bucket}/{s3_file_name}") - return True - except NoCredentialsError: - print("Credentials not available") - return False - - -def handler(event, context): - """ - Take in event and trigger the prediction pipeline - """ - - logger.info("received event: " + str(event)) - - try: - body = json.loads(event["body"]) if not isinstance(event["body"], dict) else event["body"] - - data_path = body["file_location"] - property_id = body["property_id"] - portfolio_id = body["portfolio_id"] - created_at = body["created_at"] - - # We could fix the model path but for the moment, we just take the best model path based on the registry - outputs = prediction(model_path=None, data_path=data_path) - # Store into s3, with key of {portfolio_id}-{property_id} - - storage_filepath = f"{portfolio_id}/{property_id}/{created_at}.csv" - - upload_dataframe_to_s3( - df=outputs, - bucket=f"retrofit-sap-predictions-{RUNTIME_ENVIRONMENT}", - s3_file_name=storage_filepath - ) - - return { - "statusCode": 200, - "body": json.dumps({ - "message": "Successfully processed input", - "storage_filepath": storage_filepath - }) - } - - except (Exception, KeyError, ValueError) as e: - logger.info("Prediction failed") - logger.info(e) - return { - "statusCode": 500, - "body": json.dumps({ - "message": "Prediction failed", - "error": str(e) - }) - } - - -if __name__ == "__main__": - handler() diff --git a/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data.parquet b/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data.parquet deleted file mode 100644 index ac5249ce..00000000 Binary files a/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data.parquet and /dev/null differ diff --git a/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data_with_id.parquet b/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data_with_id.parquet deleted file mode 100644 index d41b23da..00000000 Binary files a/model_data/simulation_system/model_build_data/change_data/rdsap_full/test_data_with_id.parquet and /dev/null differ diff --git a/model_data/simulation_system/model_build_data/change_data/rdsap_full/train_validation_data.parquet b/model_data/simulation_system/model_build_data/change_data/rdsap_full/train_validation_data.parquet deleted file mode 100644 index e7b2eb4a..00000000 Binary files a/model_data/simulation_system/model_build_data/change_data/rdsap_full/train_validation_data.parquet and /dev/null differ diff --git a/model_data/simulation_system/predictions.py b/model_data/simulation_system/predictions.py deleted file mode 100644 index 1b3827d8..00000000 --- a/model_data/simulation_system/predictions.py +++ /dev/null @@ -1,188 +0,0 @@ -""" -Script to load MLModel class and generate predictions -""" - -import os -import json -import argparse -from pathlib import Path -import pandas as pd -from typing import Optional -from datetime import datetime -from MLModel.Models import AutogluonModel -from core.Logger import logger -from core.DataLoader import dataloader_factory -from core.CloudClient import BotoClient -from core.Metrics import Metrics -from core.RegistryHandler import RegistryHandler -from core.Settings import ( - BASE_REGISTRY_PATH, - REGISTRY_FILE, - PREDICTION_LOCATION, - PREDICTION_FILE, - METADATA_FILE, - TIMESTAMP_FORMAT, - MODEL_DIRECTORY, -) - -TIMESTAMP = datetime.now().strftime(TIMESTAMP_FORMAT) -RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "dev") - -CLIENT = BotoClient(runtime_environment=RUNTIME_ENVIRONMENT) - -# FOR TESTING -# For now just loading data first and then passing into function (i.e. as if we receive json data and convert to -# DataFrame) -# TEST_DATA = DataLoader.load(filepath="../simulation_system/model_build_data/change_data/rdsap_full/test_data.parquet") -# DATA = TEST_DATA.sample(1) - -# For testing in dev s3 -# Data path can be passed as so: -# python3 predictions.py --data-path s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data.parquet -# data_path="s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data_with_id.parquet" - - -def ingest_arguments() -> argparse.Namespace: - """ - Helper function to take in arguments from script start - """ - - parser = argparse.ArgumentParser(description="Inputs for training script") - parser.add_argument( - "--target-column", - type=str, - help="The response variable you are predicting for", - choices=["RDSAP_CHANGE", "HEAT_DEMAND_CHANGE"], - default="RDSAP_CHANGE", - ) - parser.add_argument( - "--model-path", - type=str, - help="If you wish to use a specific model, specify the model path here", - ) - parser.add_argument("--data", type=str, help="Json data for predictions") - parser.add_argument( - "--data-path", type=str, help="Location of Parquet dataset to load for training" - ) - - args = parser.parse_args() - - return args - - -def prediction( - target_column: str = "RDSAP_CHANGE", - model_path: str | None = None, - data: Optional[pd.DataFrame | str] = None, - data_path: Optional[str] = None, -): - """ - Main pipeline function - """ - - if model_path is not None: - logger.info("User specified a model to load - ignoring registry") - model_location = model_path - model_type = model_path - model_name = model_path - else: - # TODO: Think about where registry will sit/ type - logger.info("Loading best model from registry") - - metrics = Metrics() - registry_handler = RegistryHandler() - - registry_path = Path(MODEL_DIRECTORY) / target_column / REGISTRY_FILE - - registry_df = registry_handler.load_registry( - registry_path=registry_path, client=CLIENT, metrics=metrics - ) - - # registry_df = pd.read_csv(registry_path) - best_model_df = registry_df[registry_df["best_model"]] - - model_location = best_model_df["model_location"].values[0] - model_type = best_model_df["model_type"].values[0] - model_name = best_model_df["model_name"].values[0] - - logger.info("--- Model Info: ---") - logger.info(f"Model type: {model_type}") - logger.info(f"Model name: {model_name}") - logger.info(f"Model location: {model_location}") - - logger.info("--- Loading Data ---") - if data is None and data_path is None: - logger.error("No Data/Data Path passed") - exit(1) - if data_path and data is None: - logger.info("Loading data from provided path") - dataloader = dataloader_factory(runtime_environment=RUNTIME_ENVIRONMENT) - data = dataloader.load(client=CLIENT, filepath=data_path, index_col=None) - - if data is None: - raise ValueError("No data loaded") - - else: - logger.info("Using data provided") - data = json.loads(str(data)) - data = pd.DataFrame([data]) - - logger.info("--- Loading Model ---") - - if model_type == "autogluon": - logger.info("Using an Autogluon model") - model = AutogluonModel() - else: - raise ValueError("No other model currently") - - # In lambda, only the /tmp folder is writable - model_folder = "/tmp" if RUNTIME_ENVIRONMENT in ["dev", "prod"] else "local_model" - - model.load_model(filepath=model_location, client=CLIENT, model_folder=model_folder) - - logger.info("--- Generating Predictions ---") - prediction = model.generate_predictions(data=data) - - # logger.info(pd.concat([data["id"], prediction], axis=1)) - - return pd.concat([data["id"], prediction], axis=1) - - # Save prediction some where? - # prediction.to_csv("s3?") - - # TODO: Check how we want to structure outputs - # For now, just categorise by uprn and timestamp - # Assume one uprn coming in for now - # uprn = data.index.values[0] - - # # Saving prediction local for now - # # TODO: change uprn to TARGET_ID, put in setting - # logger.info("--- Outputting prediction and metadata --- ") - # output_base = PREDICTION_LOCATION / target_column / uprn / TIMESTAMP - # output_base.mkdir(parents=True, exist_ok=True) - - # json_prediction = prediction.to_json(output_base / PREDICTION_FILE) - # prediction_metadata = { - # "model_type": model_type, - # "model_name": model_name, - # "model_location": model_location, - # "model_settings": model.model_metadata(), - # } - - # pd.DataFrame([prediction_metadata]).to_json(output_base / METADATA_FILE) - - return json_prediction - - -if __name__ == "__main__": - args = ingest_arguments() - - # Data can be passed in as JSON string: python3 predictions.py --data '{"TOTAL_FLOOR_AREA": 1}' - # Data path can be passed as so: python3 predictions.py --data-path - # ./model_build_data/change_data/rdsap_full/test_data.parquet - prediction( - target_column=args.target_column, - model_path=args.model_path, - data=args.data, - data_path=args.data_path, - ) diff --git a/model_data/simulation_system/preprocessed_data/dataset.parquet b/model_data/simulation_system/preprocessed_data/dataset.parquet deleted file mode 100644 index 4b6247d6..00000000 Binary files a/model_data/simulation_system/preprocessed_data/dataset.parquet and /dev/null differ diff --git a/model_data/simulation_system/regenerate_metrics.py b/model_data/simulation_system/regenerate_metrics.py deleted file mode 100644 index 025892f5..00000000 --- a/model_data/simulation_system/regenerate_metrics.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -Script to regenerate metrics for all the models in the model registry -Key task: -- Load model registry -- For each model in the registry, generate the metrics (Key questions here is what if the test data changes) -- Save the new metrics out to s3 bucket -""" - -import os -import argparse -from s3pathlib import S3Path -import pandas as pd -from tqdm import tqdm -from core.Logger import logger -from core.Metrics import Metrics, sort_by_metric -from core.DataLoader import dataloader_factory -from core.Settings import ( - OPTIMISE_METRIC, - MODEL_DIRECTORY, - REGISTRY_FILE, - BEST_MODEL_COLUMN_NAME, -) -from MLModel.Models import model_factory - -RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local") - - -def ingest_arguments() -> argparse.Namespace: - """ - Helper function to take in arguments from script start - """ - - parser = argparse.ArgumentParser(description="Inputs for training script") - - parser.add_argument( - "--test-filepath", - type=str, - help="Location of Parquet dataset to load for testing", - required=True, - ) - parser.add_argument( - "--target-column", - type=str, - help="The response variable", - choices=["RDSAP_CHANGE", "HEAT_DEMAND_CHANGE"], - default="RDSAP_CHANGE", - ) - - args = parser.parse_args() - - return args - - -def regenerate_metrics(test_filepath: str, target_column: str) -> None: - """ - Recreate all metrics for all models - """ - - logger.info("--- Loading test data ---") - dataloader = dataloader_factory(runtime_environment=RUNTIME_ENVIRONMENT) - test_df = dataloader.load(filepath=test_filepath) - - logger.info("--- Loading model registry ---") - logger.info(f"Loading registry for {target_column} models") - registry_df = dataloader.load( - filepath=S3Path(MODEL_DIRECTORY, target_column, REGISTRY_FILE).uri - ) - - logger.info("Extract non-metric columns") - registry_df = registry_df[["model_type", "model_name", "model_location"]] - - logger.info("--- Regenerating metrics ---") - - metric_suite = Metrics() - - metrics_df = pd.DataFrame(columns=metric_suite.list_metric_functions()) - - for _, row in tqdm(registry_df.iterrows()): - - logger.info(f"--- Loading Model ({row['model_name']}) ---") - - model = model_factory(model_type=row["model_type"])() - - model.load_model(filepath=row["model_location"]) - - metrics = metric_suite.generate_metric_suite( - model=model, data=test_df, target_column=target_column - ) - - # Add metrics row by row - metrics_df = pd.concat([metrics_df, metrics], axis=0).reset_index(drop=True) - - # Add metrics df to registry df side by side - registry_df = pd.concat([registry_df, metrics_df], axis=1) - - logger.info(f"--- Sorting by Optimise Metric ({OPTIMISE_METRIC}) ---") - - registry_df = sort_by_metric( - data=registry_df, - optimse_metric=OPTIMISE_METRIC, - best_model_column_name=BEST_MODEL_COLUMN_NAME, - ) - - logger.info("--- Saving model metrics ---") - - registry_df.to_csv(S3Path(MODEL_DIRECTORY, target_column, REGISTRY_FILE).uri) - - -if __name__ == "__main__": - - logger.info("---Begin Pipeline to regenerate metrics---") - - logger.info("---Ingest Arguments---") - args = ingest_arguments() - - regenerate_metrics( - test_filepath=args.test_filepath, target_column=args.target_column - ) diff --git a/model_data/simulation_system/requirements.txt b/model_data/simulation_system/requirements.txt deleted file mode 100644 index 62db1719..00000000 --- a/model_data/simulation_system/requirements.txt +++ /dev/null @@ -1,208 +0,0 @@ -absl-py==1.4.0 -accelerate==0.16.0 -aiohttp==3.8.5 -aiohttp-cors==0.7.0 -aiosignal==1.3.1 -aliyun-python-sdk-core==2.13.36 -aliyun-python-sdk-kms==2.16.1 -antlr4-python3-runtime==4.9.3 -asttokens==2.2.1 -async-timeout==4.0.3 -attrs==23.1.0 -autogluon==0.8.2 -autogluon.common==0.8.2 -autogluon.core==0.8.2 -autogluon.features==0.8.2 -autogluon.multimodal==0.8.2 -autogluon.tabular==0.8.2 -autogluon.timeseries==0.8.2 -backcall==0.2.0 -beautifulsoup4==4.12.2 -blessed==1.20.0 -blis==0.7.10 -boto3==1.28.25 -botocore==1.31.25 -cachetools==5.3.1 -catalogue==2.0.9 -catboost==1.2 -certifi==2023.7.22 -cffi==1.15.1 -charset-normalizer==3.2.0 -click==8.1.6 -cloudpickle==2.2.1 -colorama==0.4.6 -colorful==0.5.5 -comm==0.1.4 -confection==0.1.1 -contourpy==1.1.0 -crcmod==1.7 -cryptography==41.0.3 -cycler==0.11.0 -cymem==2.0.7 -datasets==2.14.4 -debugpy==1.6.7 -decorator==5.1.1 -defusedxml==0.7.1 -dill==0.3.7 -distlib==0.3.7 -evaluate==0.3.0 -executing==1.2.0 -fastai==2.7.12 -fastcore==1.5.29 -fastdownload==0.0.7 -fastprogress==1.0.3 -filelock==3.12.2 -fonttools==4.42.0 -frozenlist==1.4.0 -fsspec==2023.6.0 -future==0.18.3 -gdown==4.7.1 -gluonts==0.13.3 -google-api-core==2.11.1 -google-auth==2.22.0 -google-auth-oauthlib==1.0.0 -googleapis-common-protos==1.60.0 -gpustat==1.1 -graphviz==0.20.1 -grpcio==1.50.0 -huggingface-hub==0.16.4 -hyperopt==0.2.7 -idna==3.4 -imageio==2.31.1 -ipykernel==6.25.1 -ipython==8.14.0 -jedi==0.19.0 -Jinja2==3.1.2 -jmespath==0.10.0 -joblib==1.3.2 -jsonschema==4.17.3 -jupyter_client==8.3.0 -jupyter_core==5.3.1 -kiwisolver==1.4.4 -langcodes==3.3.0 -lightgbm==3.3.5 -lightning-utilities==0.9.0 -llvmlite==0.40.1 -Markdown==3.4.4 -markdown-it-py==3.0.0 -MarkupSafe==2.1.3 -matplotlib==3.7.2 -matplotlib-inline==0.1.6 -mdurl==0.1.2 -mlforecast==0.7.3 -model-index==0.1.11 -msgpack==1.0.5 -multidict==6.0.4 -multiprocess==0.70.15 -murmurhash==1.0.9 -nest-asyncio==1.5.7 -networkx==3.1 -nlpaug==1.1.11 -nltk==3.8.1 -nptyping==2.4.1 -numba==0.57.1 -numpy==1.24.4 -nvidia-ml-py==12.535.77 -oauthlib==3.2.2 -omegaconf==2.2.3 -opencensus==0.11.2 -opencensus-context==0.1.3 -opendatalab==0.0.10 -openmim==0.3.9 -openxlab==0.0.17 -ordered-set==4.1.0 -oss2==2.17.0 -packaging==23.1 -pandas==1.5.3 -parso==0.8.3 -pathy==0.10.2 -patsy==0.5.3 -pexpect==4.8.0 -pickleshare==0.7.5 -Pillow==9.5.0 -platformdirs==3.10.0 -plotly==5.16.0 -preshed==3.0.8 -prometheus-client==0.17.1 -prompt-toolkit==3.0.39 -protobuf==3.20.2 -psutil==5.9.5 -ptyprocess==0.7.0 -pure-eval==0.2.2 -py-spy==0.3.14 -py4j==0.10.9.7 -pyarrow==12.0.1 -pyasn1==0.5.0 -pyasn1-modules==0.3.0 -pycparser==2.21 -pycryptodome==3.18.0 -pydantic==1.10.12 -Pygments==2.16.1 -pyparsing==3.0.9 -pyrsistent==0.19.3 -PySocks==1.7.1 -pytesseract==0.3.10 -python-dateutil==2.8.2 -pytorch-lightning==1.9.5 -pytorch-metric-learning==1.7.3 -pytz==2023.3 -PyWavelets==1.4.1 -PyYAML==6.0.1 -pyzmq==25.1.0 -ray==2.3.1 -regex==2023.8.8 -requests==2.28.2 -requests-oauthlib==1.3.1 -responses==0.18.0 -rich==13.4.2 -rsa==4.9 -s3transfer==0.6.1 -safetensors==0.3.2 -scikit-image==0.19.3 -scikit-learn==1.2.2 -scipy==1.11.1 -seaborn==0.12.2 -sentencepiece==0.1.99 -seqeval==1.2.2 -six==1.16.0 -smart-open==6.3.0 -soupsieve==2.4.1 -spacy==3.6.1 -spacy-legacy==3.0.12 -spacy-loggers==1.0.4 -srsly==2.4.7 -stack-data==0.6.2 -statsforecast==1.4.0 -statsmodels==0.14.0 -tabulate==0.9.0 -tenacity==8.2.2 -tensorboard==2.14.0 -tensorboard-data-server==0.7.1 -tensorboardX==2.6.2 -text-unidecode==1.3 -thinc==8.1.12 -threadpoolctl==3.2.0 -tifffile==2023.7.18 -timm==0.9.5 -tokenizers==0.13.3 -toolz==0.12.0 -torch==1.13.1 -torchmetrics==0.11.4 -torchvision==0.14.1 -tornado==6.3.2 -tqdm==4.65.1 -traitlets==5.9.0 -transformers==4.26.1 -typer==0.9.0 -typing_extensions==4.7.1 -tzdata==2023.3 -ujson==5.8.0 -urllib3==1.26.16 -virtualenv==20.24.3 -wasabi==1.1.2 -wcwidth==0.2.6 -Werkzeug==2.3.6 -window-ops==0.0.14 -xgboost==1.7.6 -xxhash==3.3.0 -yarl==1.9.2 diff --git a/model_data/simulation_system/requirements/predictions/predictions-dev.txt b/model_data/simulation_system/requirements/predictions/predictions-dev.txt deleted file mode 100644 index a9e65dc2..00000000 --- a/model_data/simulation_system/requirements/predictions/predictions-dev.txt +++ /dev/null @@ -1,6 +0,0 @@ -boto3 -autogluon==0.8.2 -pandas==1.5.3 -seaborn==0.12.2 -matplotlib==3.7.2 -pre-commit==3.3.3 diff --git a/model_data/simulation_system/requirements/predictions/predictions.txt b/model_data/simulation_system/requirements/predictions/predictions.txt deleted file mode 100644 index af2d681e..00000000 --- a/model_data/simulation_system/requirements/predictions/predictions.txt +++ /dev/null @@ -1,5 +0,0 @@ -boto3 -autogluon==0.8.2 -pandas==1.5.3 -seaborn==0.12.2 -matplotlib==3.7.2 diff --git a/model_data/simulation_system/requirements/training/training-dev.txt b/model_data/simulation_system/requirements/training/training-dev.txt deleted file mode 100644 index ea205270..00000000 --- a/model_data/simulation_system/requirements/training/training-dev.txt +++ /dev/null @@ -1,4 +0,0 @@ -autogluon==0.8.2 -pandas==1.5.3 -seaborn==0.12.2 -pre-commit==3.3.3 diff --git a/model_data/simulation_system/requirements/training/training.txt b/model_data/simulation_system/requirements/training/training.txt deleted file mode 100644 index 17e4c8da..00000000 --- a/model_data/simulation_system/requirements/training/training.txt +++ /dev/null @@ -1,3 +0,0 @@ -autogluon==0.8.2 -pandas==1.5.3 -seaborn==0.12.2 diff --git a/model_data/simulation_system/test_data_generation.py b/model_data/simulation_system/test_data_generation.py deleted file mode 100644 index 8989d491..00000000 --- a/model_data/simulation_system/test_data_generation.py +++ /dev/null @@ -1,109 +0,0 @@ -from model_data.simulation_system.core.Logger import logger -import argparse -import pandas as pd -from pathlib import Path -from model_data.simulation_system.core.Settings import RANDOM_SEED, TRAIN_AND_VALIDATION_DATA_NAME, TEST_DATA_NAME - - -def ingest_arguments() -> argparse.Namespace: - """ - Helper function to take in arguments from script start - """ - - parser = argparse.ArgumentParser(description="Inputs for training script") - - parser.add_argument( - "--filepath", - type=str, - help="Location of Parquet dataset to load", - required=True, - ) - parser.add_argument( - "--output-folder", - type=str, - help="Location of Parquet dataset to save", - required=True, - ) - parser.add_argument( - "--percentage", - type=float, - help="Percentage of data to use as test data", - default=None, - ) - parser.add_argument( - "--volume", type=int, help="Volume of data to use as test data", default=None - ) - parser.add_argument( - "--sampling", - type=str, - help="Type of sampling to do for test data", - choices=["random", "stratified"], - default="random", - ) - - args = parser.parse_args() - - return args - - -def main( - filepath: str, output_folder: str, percentage: float, volume: int, sampling: str -): - """ - Load a dataset in and split out the training+validation data and the test data. - """ - - logger.info("---Loading Data---") - data = pd.read_parquet(filepath).reset_index(drop=True) - - if percentage and volume is None: - test_amount = round(len(data) * percentage) - elif percentage is None and volume: - test_amount = volume - elif percentage is None and volume is None: - logger.error( - "No amount specified - please specify either a percentage or volume" - ) - exit(1) - else: - logger.info("Both percentage and volume specified - taking largest of the two") - test_amount = max(round(len(data) * percentage), volume) - - logger.info(f"---Extracting {test_amount} from dataset to be test data") - - train_validation_data = pd.DataFrame() - test_data = pd.DataFrame() - - if sampling == "random": - logger.info("--- Using random sample method ---") - sample_index = data.sample(n=test_amount, random_state=RANDOM_SEED).index - - train_validation_data = data.drop(sample_index) - test_data = data.iloc[sample_index] - - elif sampling == "stratified": - # Not yet implemented - pass - - logger.info("--- Saving data ---") - - train_validation_data.to_parquet( - Path(output_folder) / TRAIN_AND_VALIDATION_DATA_NAME - ) - test_data.to_parquet(Path(output_folder) / TEST_DATA_NAME) - - logger.info(" ---Pipeline complete---") - - -if __name__ == "__main__": - logger.info("--- Generate test data pipeline ---") - - args = ingest_arguments() - - main( - filepath=args.filepath, - output_folder=args.output_folder, - percentage=args.percentage, - volume=args.volume, - sampling=args.sampling, - ) diff --git a/model_data/simulation_system/training.py b/model_data/simulation_system/training.py deleted file mode 100644 index b68d1c4d..00000000 --- a/model_data/simulation_system/training.py +++ /dev/null @@ -1,259 +0,0 @@ -import argparse - -import os -import shutil -from pathlib import Path -from datetime import datetime -import pandas as pd -from MLModel.Models import model_factory -from core.Logger import logger -from core.Metrics import Metrics, sort_by_metric -from core.DataLoader import dataloader_factory -from core.FeatureProcessor import FeatureProcessor -from core.CloudClient import BotoClient -from core.RegistryHandler import RegistryHandler -from core.Settings import ( - MODEL_DIRECTORY, - REGISTRY_FILE, - MODEL_FOLDER, - METRICS_FOLDER, - DEPLOYMENT_FOLDER, - SUBSAMPLE_FACTOR, - MODEL_HYPERPARAMETERS, - TIMESTAMP_FORMAT, - RESIDUAL_FILE, - BEST_MODEL_COLUMN_NAME, - OPTIMISE_METRIC, -) - -TIMESTAMP = datetime.now().strftime(TIMESTAMP_FORMAT) - -RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local") - -CLIENT = BotoClient(runtime_environment=RUNTIME_ENVIRONMENT) -# CLIENT = S3FSClient(runtime_environment=RUNTIME_ENVIRONMENT) - - -# FOR TESTING -# train_filepath = "./model_build_data/change_data/rdsap_full/train_validation_data.parquet" -# test_filepath = "./model_build_data/change_data/rdsap_full/test_data.parquet" -# target_column = "RDSAP_CHANGE" -# model_type = "autogluon" -# hyperparameter = HYPERPARAMETERS -# SUBSAMPLE_FACTOR = 200 - -# Mock location -# train_filepath = "s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/train_validation_data.parquet" -# test_filepath = "s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data.parquet" - - -# To run script in local mode: -# python3 training.py --train-filepath ./model_build_data/change_data/rdsap_full/train_validation_data.parquet --test-filepath ./model_build_data/change_data/rdsap_full/test_data.parquet - -# To run script in local-mock mode: -# python3 training.py --train-filepath s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/train_validation_data.parquet --test-filepath s3://retrofit-data-dev/model_build_data/change_data/rdsap_full/test_data.parquet - - -def ingest_arguments() -> argparse.Namespace: - """ - Helper function to take in arguments from script start - """ - - parser = argparse.ArgumentParser(description="Inputs for training script") - - parser.add_argument( - "--train-filepath", - type=str, - help="Location of Parquet dataset to load for training", - required=True, - ) - parser.add_argument( - "--test-filepath", - type=str, - help="Location of Parquet dataset to load for testing", - required=True, - ) - parser.add_argument( - "--model-type", - type=str, - help="The type of model to train", - choices=["autogluon"], - default="autogluon", - ) - parser.add_argument( - "--target-column", - type=str, - help="The response variable", - choices=["RDSAP_CHANGE", "HEAT_DEMAND_CHANGE"], - default="RDSAP_CHANGE", - ) - - args = parser.parse_args() - - return args - - -def training( - train_filepath: str, - test_filepath: str, - target_column: str = "RDSAP_CHANGE", - model_type: str = "autogluon", - hyperparameters: dict | None = None, -) -> None: - """ - Pipeline to run training on the dataset - """ - - logger.info("--- Loading data ---") - dataloader = dataloader_factory(runtime_environment=RUNTIME_ENVIRONMENT) - train_df = dataloader.load(client=CLIENT, filepath=train_filepath) - test_df = dataloader.load(client=CLIENT, filepath=test_filepath) - - if train_df is None or test_df is None: - raise ValueError("No data Loaded - cancelling pipeline") - - logger.info("--- Feature processing ---") - - feature_processor = FeatureProcessor() - - # This is for convenience for now - subsample_amount = round(len(train_df) / SUBSAMPLE_FACTOR) - - train_df = feature_processor.process( - train_df, target_column=target_column, subsample_amount=subsample_amount - ) - test_df = feature_processor.process(test_df, target_column=target_column) - - logger.info("--- Build Model ---") - - logger.info("--- Load Hyperparameters ---") - - if hyperparameters is None: - logger.info("Use base hyperparameters in settings") - hyperparameters = MODEL_HYPERPARAMETERS[model_type] - logger.info(f"Hyperparameters are: {hyperparameters}") - - logger.info( - "--- Loading model configuration (Model type and Naming convention) ---" - ) - # We might want to have hyperparameters in the names to make models more recognisable - model_toolkit = model_factory( - model_type=model_type, hyperparameters=hyperparameters - ) - - model_root = ( - f"{target_column}-{model_toolkit['naming_attributes']}-{TIMESTAMP}".lower() - ) - output_base = Path(MODEL_DIRECTORY) / target_column / model_type / model_root - - # Will need to pass output path to model (for saving purposes) - model = model_toolkit["model"](output_filepath=output_base / MODEL_FOLDER) - - model.train_model( - data=train_df, target_column=target_column, hyperparameters=hyperparameters - ) - - logger.info("--- Save Model ---") - model.save_model(output_filepath=model.output_filepath, client=CLIENT) - - logger.info("--- Generate evaluation metrics ---") - metrics = Metrics() - - metric_output_path = output_base / METRICS_FOLDER - metrics_df = model.model_evaluation( - validation_data=test_df, - target_column=target_column, - metrics_location=metric_output_path, - metrics=metrics, - ) - - logger.info("--- Generate metric outputs using predictions ---") - # metrics.generate_plot_suite() - - plot_output_path = output_base / METRICS_FOLDER / RESIDUAL_FILE - metrics.generate_residual_plot( - actuals=test_df[target_column], - predictions=model.predictions, - target_column=target_column, - output_filepath=plot_output_path, - ) - - metrics.upload_metrics(output_filepath=metric_output_path, client=CLIENT) - - # TODO: for cml, we might want to have class that outputs all data and plots to add to the report - # If we want residual plot/ any plots, we will need to self host - - # TODO: introduce a seperate script for model optimisation, and from there, optimise for deployment - # Imagining for now that the model trained here is the best model amongst all models built - - logger.info("--- Optimising model for deployment ---") - - deployment_model_path = output_base / DEPLOYMENT_FOLDER - - model.optimise_model_for_deployment(deployment_path=deployment_model_path) - logger.info( - f"Optimised version of best model can be found at: {deployment_model_path}" - ) - - model.save_model(output_filepath=deployment_model_path, client=CLIENT) - - # TODO: Need a model registry - for now have this as a CSV - # Save this in the model directory - # Loading registry from s3 - logger.info("--- Append registry with new model ---") - - registry_handler = RegistryHandler() - - registry_path = Path(MODEL_DIRECTORY) / target_column / REGISTRY_FILE - - registry_df = registry_handler.load_registry( - registry_path=registry_path, client=CLIENT, metrics=metrics - ) - - model_details_df = pd.DataFrame( - [ - { - "model_type": model_type, - "model_name": model_root, - "model_location": deployment_model_path, - } - ] - ) - - registry_row = pd.concat([model_details_df, metrics_df], axis=1) - registry_df = pd.concat([registry_df, registry_row], axis=0).reset_index(drop=True) - - registry_df = sort_by_metric( - registry_df, - optimse_metric=OPTIMISE_METRIC, - best_model_column_name=BEST_MODEL_COLUMN_NAME, - ) - - logger.info("--- Saving new model to registry ---") - # Ensure the directory exists - registry_path.parent.mkdir(parents=True, exist_ok=True) - registry_df.to_csv(registry_path, index=False) - - registry_handler.save_registry(output_filepath=registry_path, client=CLIENT) - - logger.info("--- Clean up ---") - if RUNTIME_ENVIRONMENT != "local" and Path(MODEL_DIRECTORY).exists(): - logger.info("Removing local development files not in s3") - shutil.rmtree(Path(MODEL_DIRECTORY)) - - logger.info("--- Training Pipeline Complete --- ") - - -if __name__ == "__main__": - - logger.info("---Begin Pipeline---") - - logger.info("---Ingest Arguments---") - args = ingest_arguments() - - training( - train_filepath=args.train_filepath, - test_filepath=args.test_filepath, - target_column=args.target_column, - model_type=args.model_type, - ) diff --git a/model_data/temp_inputs.py b/model_data/temp_inputs.py deleted file mode 100644 index 18248734..00000000 --- a/model_data/temp_inputs.py +++ /dev/null @@ -1,35 +0,0 @@ -# Temporary input data -input_data = [ - { - "address1": "28 Distillery Wharf", - "postcode": "w6 9bf" - }, - { - "address1": "Flat 14 Godley V C House", - "postcode": "E2 0LP" - }, - { - "address1": "49 Elderfield Road", - "postcode": "E5 0LF" - }, - { - "address1": "26 Stanhope Road", - "postcode": "N6 5NG" - }, - { - "address1": "Flat 3 Frederick Building", - "postcode": "N1 4BD" - }, - { - "address1": "Flat 4 Frederick Building", - "postcode": "N1 4BD" - }, - { - "address1": "Flat 28, 22 Adelina Grove", - "postcode": "E1 3BX" - }, - { - "address1": "Flat 39, 239 Long Lane", - "postcode": "SE1 4PT" - } -] diff --git a/model_data/tests/test_data/sap_model_data.py b/model_data/tests/test_data/sap_model_data.py deleted file mode 100644 index fa83d58f..00000000 --- a/model_data/tests/test_data/sap_model_data.py +++ /dev/null @@ -1,674 +0,0 @@ -data = [ - {'low-energy-fixed-light-count': '', 'address': '2 Aspenlea Road', 'uprn-source': 'Address Matched', - 'floor-height': '2.97', 'heating-cost-potential': '260', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '41', 'construction-age-band': '2021', 'potential-energy-rating': 'A', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '94', 'glazed-type': '', 'heating-cost-current': '260', 'address3': '', - 'mainheatcont-description': 'Programmer, room thermostat and TRVs', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '11', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', - 'hot-water-cost-current': '66', 'county': '', 'postcode': 'W6 8LJ', 'solar-water-heating-flag': '', - 'constituency': 'E14000726', 'co2-emissions-potential': '0.2', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', 'energy-consumption-potential': '16', - 'local-authority': 'E09000013', 'built-form': 'Detached', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2021-05-24', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '24', 'address1': '2 Aspenlea Road', - 'heat-loss-corridor': '', 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '54.0', 'building-reference-number': '10000980452', 'environment-impact-current': '80', - 'co2-emissions-current': '1.3', 'roof-description': 'Average thermal transmittance 0.17 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '', 'hot-water-env-eff': 'Good', - 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Good', 'main-fuel': 'Gas: mains gas', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '47', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2021-05-24 14:26:30', 'flat-top-storey': 'N', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34169219', 'current-energy-efficiency': '77', 'energy-consumption-current': '135', - 'mainheat-description': 'Boiler & underfloor, mains gas', 'lighting-cost-current': '47', - 'lodgement-date': '2021-05-24', 'extension-count': '', 'mainheatc-env-eff': 'Good', - 'lmk-key': 'eba2f9b74eba10683a6cc097985d6c7a6773d18a9407933ae03b3eb32607edec', 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '', 'potential-energy-efficiency': '92', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.25 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '12', 'address': '1d, Cromwell Grove', 'uprn-source': 'Address Matched', - 'floor-height': '', 'heating-cost-potential': '503', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '119', 'construction-age-band': 'NO DATA!', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '80', 'glazed-type': 'NO DATA!', 'heating-cost-current': '500', 'address3': '', - 'mainheatcont-description': 'Programmer and appliance thermostats', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '12', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '259', 'county': 'Greater London Authority', 'postcode': 'W6 7RQ', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '1.2', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'energy-consumption-potential': '119', 'local-authority': 'E09000013', 'built-form': 'End-Terrace', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2018-10-29', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '44', - 'address1': '1d, Cromwell Grove', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '58.0', - 'building-reference-number': '9713111678', 'environment-impact-current': '62', 'co2-emissions-current': '2.5', - 'roof-description': 'Average thermal transmittance 0.13 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': '', 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Good', 'main-fuel': 'Electricity: electricity, unspecified tariff', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '44', - 'mainheat-env-eff': 'Poor', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2018-10-29 15:20:04', 'flat-top-storey': '', 'current-energy-rating': 'D', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34162683', 'current-energy-efficiency': '58', 'energy-consumption-current': '258', - 'mainheat-description': 'Room heaters, electric', 'lighting-cost-current': '44', 'lodgement-date': '2018-10-29', - 'extension-count': '', 'mainheatc-env-eff': 'Good', 'lmk-key': '1674707719262018102915200471818698', - 'wind-turbine-count': '', 'tenure': 'owner-occupied', 'floor-level': 'NO DATA!', - 'potential-energy-efficiency': '77', 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.26 W/m-¦K', - 'hotwater-description': 'Electric immersion, standard tariff'}, - {'low-energy-fixed-light-count': '1', 'address': 'The School House, Burlington Danes Academy, Wood Lane', - 'uprn-source': '', 'floor-height': '', 'heating-cost-potential': '629', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '89', 'construction-age-band': 'NO DATA!', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '78', 'glazed-type': 'NO DATA!', 'heating-cost-current': '629', - 'address3': 'Wood Lane', 'mainheatcont-description': 'Programmer and appliance thermostats', - 'sheating-energy-eff': 'N/A', 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '1', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '205', 'county': 'Greater London Authority', 'postcode': 'W12 0HL', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '1.7', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.22 W/m-¦K', - 'energy-consumption-potential': '111', 'local-authority': 'E09000013', 'built-form': 'Detached', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2018-02-01', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '35', - 'address1': 'The School House', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '86.0', - 'building-reference-number': '6433906578', 'environment-impact-current': '65', 'co2-emissions-current': '3.0', - 'roof-description': 'Average thermal transmittance 0.13 W/m-¦K', 'floor-energy-eff': 'Good', - 'number-habitable-rooms': '', 'address2': 'Burlington Danes Academy', 'hot-water-env-eff': 'Very Poor', - 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Good', 'main-fuel': 'Electricity: electricity, unspecified tariff', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '59', - 'mainheat-env-eff': 'Poor', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2018-02-01 10:13:11', 'flat-top-storey': '', 'current-energy-rating': 'D', - 'secondheat-description': 'Room heaters, dual fuel (mineral and wood)', 'walls-env-eff': 'Very Good', - 'transaction-type': 'new dwelling', 'uprn': '', 'current-energy-efficiency': '63', - 'energy-consumption-current': '200', 'mainheat-description': 'Room heaters, electric', - 'lighting-cost-current': '59', 'lodgement-date': '2018-02-01', 'extension-count': '', 'mainheatc-env-eff': 'Good', - 'lmk-key': '1604639899062018020110131146898768', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '77', 'hot-water-energy-eff': 'Very Poor', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '14', 'address': '3 Victor Wilkins Bungalows, Peabody Estate, Fulham Palace Road', - 'uprn-source': 'Address Matched', 'floor-height': '', 'heating-cost-potential': '434', - 'unheated-corridor-length': '', 'hot-water-cost-potential': '79', 'construction-age-band': 'NO DATA!', - 'potential-energy-rating': 'C', 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', - 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '77', 'glazed-type': 'NO DATA!', - 'heating-cost-current': '434', 'address3': 'Fulham Palace Road', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '14', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '79', 'county': 'Greater London Authority', 'postcode': 'W6 9FU', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '2.0', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'energy-consumption-potential': '148', 'local-authority': 'E09000013', 'built-form': 'End-Terrace', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2015-02-11', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '28', - 'address1': '3 Victor Wilkins Bungalows', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '72.0', - 'building-reference-number': '8344023378', 'environment-impact-current': '77', 'co2-emissions-current': '2.0', - 'roof-description': 'Average thermal transmittance 0.12 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': 'Peabody Estate', 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '47', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2015-02-12 17:44:45', 'flat-top-storey': '', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34155690', 'current-energy-efficiency': '75', 'energy-consumption-current': '148', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '47', - 'lodgement-date': '2015-02-12', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '1281430909922015021217444533598985', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '75', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '', 'walls-description': 'Average thermal transmittance 0.18 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '18', 'address': '1 Pugin Bungalow, Peabody Estate, Fulham Palace Road', - 'uprn-source': 'Address Matched', 'floor-height': '', 'heating-cost-potential': '497', - 'unheated-corridor-length': '', 'hot-water-cost-potential': '85', 'construction-age-band': 'NO DATA!', - 'potential-energy-rating': 'C', 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', - 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '76', 'glazed-type': 'NO DATA!', - 'heating-cost-current': '497', 'address3': 'Fulham Palace Road', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '18', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '85', 'county': 'Greater London Authority', 'postcode': 'W6 9FU', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '2.4', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'energy-consumption-potential': '140', 'local-authority': 'E09000013', 'built-form': 'Semi-Detached', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2015-02-11', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '27', - 'address1': '1 Pugin Bungalow', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '89.0', - 'building-reference-number': '5204023378', 'environment-impact-current': '76', 'co2-emissions-current': '2.4', - 'roof-description': 'Average thermal transmittance 0.11 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': 'Peabody Estate', 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '55', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2015-02-12 17:36:45', 'flat-top-storey': '', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34155691', 'current-energy-efficiency': '76', 'energy-consumption-current': '140', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '55', - 'lodgement-date': '2015-02-12', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '1281255029242015021217364536359498', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '76', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '', 'walls-description': 'Average thermal transmittance 0.17 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '8', 'address': '1 Victor Wilkins Bungalows, Peabody Estate, Fulham Palace Road', - 'uprn-source': 'Address Matched', 'floor-height': '', 'heating-cost-potential': '403', - 'unheated-corridor-length': '', 'hot-water-cost-potential': '76', 'construction-age-band': 'NO DATA!', - 'potential-energy-rating': 'C', 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', - 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '77', 'glazed-type': 'NO DATA!', - 'heating-cost-current': '403', 'address3': 'Fulham Palace Road', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '8', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '76', 'county': 'Greater London Authority', 'postcode': 'W6 9FU', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '1.9', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'energy-consumption-potential': '151', 'local-authority': 'E09000013', 'built-form': 'End-Terrace', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2015-02-11', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '29', - 'address1': '1 Victor Wilkins Bungalows', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '65.0', - 'building-reference-number': '4824023378', 'environment-impact-current': '77', 'co2-emissions-current': '1.9', - 'roof-description': 'Average thermal transmittance 0.12 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': 'Peabody Estate', 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '43', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2015-02-12 17:39:26', 'flat-top-storey': '', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34155688', 'current-energy-efficiency': '75', 'energy-consumption-current': '151', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '43', - 'lodgement-date': '2015-02-12', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '1281195060112015021217392692950438', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '75', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '', 'walls-description': 'Average thermal transmittance 0.18 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '9', 'address': '2 Victor Wilkins Bungalows, Peabody Estate, Fulham Palace Road', - 'uprn-source': 'Address Matched', 'floor-height': '', 'heating-cost-potential': '325', - 'unheated-corridor-length': '', 'hot-water-cost-potential': '67', 'construction-age-band': 'NO DATA!', - 'potential-energy-rating': 'C', 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', - 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '79', 'glazed-type': 'NO DATA!', - 'heating-cost-current': '325', 'address3': 'Fulham Palace Road', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '9', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '67', 'county': 'Greater London Authority', 'postcode': 'W6 9FU', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '1.4', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'energy-consumption-potential': '156', 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2015-02-11', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '30', - 'address1': '2 Victor Wilkins Bungalows', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', 'total-floor-area': '48.0', - 'building-reference-number': '4534023378', 'environment-impact-current': '79', 'co2-emissions-current': '1.4', - 'roof-description': 'Average thermal transmittance 0.11 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': 'Peabody Estate', 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '33', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2015-02-12 17:42:21', 'flat-top-storey': '', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34155689', 'current-energy-efficiency': '76', 'energy-consumption-current': '156', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '33', - 'lodgement-date': '2015-02-12', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '1281177390012015021217422192950435', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '76', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '', 'walls-description': 'Average thermal transmittance 0.17 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '8', 'address': '25, Ravenscourt Gardens', 'uprn-source': 'Address Matched', - 'floor-height': '', 'heating-cost-potential': '198', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '41', 'construction-age-band': 'NO DATA!', 'potential-energy-rating': 'B', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '89', 'glazed-type': 'NO DATA!', 'heating-cost-current': '198', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Bungalow', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '8', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': 'NO DATA!', - 'hot-water-cost-current': '69', 'county': 'Greater London Authority', 'postcode': 'W6 0TU', - 'solar-water-heating-flag': '', 'constituency': 'E14000726', 'co2-emissions-potential': '0.6', - 'number-heated-rooms': '', 'floor-description': 'Average thermal transmittance 0.14 W/m-¦K', - 'energy-consumption-potential': '93', 'local-authority': 'E09000013', 'built-form': 'Detached', - 'number-open-fireplaces': '0', 'windows-description': 'High performance glazing', 'glazed-area': 'NO DATA!', - 'inspection-date': '2014-11-07', 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '21', - 'address1': '25, Ravenscourt Gardens', 'heat-loss-corridor': 'NO DATA!', 'flat-storey-count': '', - 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', 'total-floor-area': '36.0', - 'building-reference-number': '8243769278', 'environment-impact-current': '87', 'co2-emissions-current': '0.7', - 'roof-description': 'Average thermal transmittance 0.15 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': '', 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', - 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '26', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '', 'main-heating-controls': '', - 'lodgement-datetime': '2014-11-07 10:41:55', 'flat-top-storey': '', 'current-energy-rating': 'B', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34153661', 'current-energy-efficiency': '81', 'energy-consumption-current': '117', - 'mainheat-description': 'Boiler and underfloor heating, mains gas', 'lighting-cost-current': '26', - 'lodgement-date': '2014-11-07', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '1231486579062014110710415529438084', 'wind-turbine-count': '', 'tenure': 'unknown', - 'floor-level': 'NO DATA!', 'potential-energy-efficiency': '83', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '', 'walls-description': 'Average thermal transmittance 0.22 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 5, 197-199 North End Road,', 'uprn-source': '', - 'floor-height': '2.75', 'heating-cost-potential': '716', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '262', 'construction-age-band': '2023', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '77', 'glazed-type': '', 'heating-cost-current': '716', 'address3': '', - 'mainheatcont-description': 'Programmer, room thermostat and TRVs', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '21', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '262', 'county': '', - 'postcode': 'W14 9NL', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '2.2', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.31 W/m-¦K', 'energy-consumption-potential': '109', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-29', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '19', 'address1': 'Flat 5', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', - 'total-floor-area': '112.0', 'building-reference-number': '10004366541', 'environment-impact-current': '77', - 'co2-emissions-current': '2.2', 'roof-description': 'Average thermal transmittance 0.14 W/m-¦K', - 'floor-energy-eff': 'Average', 'number-habitable-rooms': '', 'address2': '197-199 North End Road,', - 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Good', 'main-fuel': 'Gas: mains gas', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Average', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '167', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2023-04-29 19:00:05', 'flat-top-storey': 'Y', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'not sale or rental', - 'uprn': '', 'current-energy-efficiency': '78', 'energy-consumption-current': '109', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '167', - 'lodgement-date': '2023-04-29', 'extension-count': '', 'mainheatc-env-eff': 'Good', - 'lmk-key': '4fa22ecbdf199782db9090216eee5f04337864e0393ed6898aaccedac2dec0ed', 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '3', 'potential-energy-efficiency': '78', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.24 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 4, 14 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.65', 'heating-cost-potential': '618', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '335', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '73', 'glazed-type': '', 'heating-cost-current': '618', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '10', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '335', 'county': '', - 'postcode': 'W12 7BX', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.4', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '211', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '36', 'address1': 'Flat 4', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '40.0', 'building-reference-number': '10004364259', 'environment-impact-current': '73', - 'co2-emissions-current': '1.4', 'roof-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '14 Bloemfontein Road', - 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Electricity: electricity, unspecified tariff', 'lighting-env-eff': 'Very Good', - 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Good', - 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '72', 'mainheat-env-eff': 'Poor', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:07:33', - 'flat-top-storey': 'Y', 'current-energy-rating': 'C', 'secondheat-description': 'None', - 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', 'uprn': '34172210', - 'current-energy-efficiency': '70', 'energy-consumption-current': '211', - 'mainheat-description': 'Boiler and radiators, electric', 'lighting-cost-current': '72', - 'lodgement-date': '2023-04-17', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '2b4a0154ae9dc85a8654e23a76fc04bb814ed038dde521a27db6e1f29e260b06', 'wind-turbine-count': '0', - 'tenure': 'Owner-occupied', 'floor-level': '3', 'potential-energy-efficiency': '70', - 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.29 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 1, 14 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.1', 'heating-cost-potential': '644', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '214', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '77', 'glazed-type': '', 'heating-cost-current': '644', 'address3': '', - 'mainheatcont-description': 'Programmer, room thermostat and TRVs', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '12', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '214', 'county': '', - 'postcode': 'W12 7BX', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.8', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '128', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '22', 'address1': 'Flat 1', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '82.0', 'building-reference-number': '10004350634', 'environment-impact-current': '77', - 'co2-emissions-current': '1.8', 'roof-description': 'Average thermal transmittance 0.17 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '14 Bloemfontein Road', - 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Good', 'main-fuel': 'Gas: mains gas', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '129', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2023-04-17 14:07:29', 'flat-top-storey': 'N', 'current-energy-rating': 'C', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', - 'uprn': '34172207', 'current-energy-efficiency': '78', 'energy-consumption-current': '128', - 'mainheat-description': 'Boiler and radiators, mains gas', 'lighting-cost-current': '129', - 'lodgement-date': '2023-04-17', 'extension-count': '', 'mainheatc-env-eff': 'Good', - 'lmk-key': '006f849816dd0a4be832d2f068d858b6c9854c3814297d974c2b57f983191614', 'wind-turbine-count': '0', - 'tenure': 'Owner-occupied', 'floor-level': '1', 'potential-energy-efficiency': '78', - 'hot-water-energy-eff': 'Good', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.28 W/m-¦K', 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 2, 14 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.7', 'heating-cost-potential': '720', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '374', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '72', 'glazed-type': '', 'heating-cost-current': '720', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '10', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '374', 'county': '', - 'postcode': 'W12 7BX', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.7', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '189', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '32', 'address1': 'Flat 2', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', - 'total-floor-area': '52.0', 'building-reference-number': '10004357130', 'environment-impact-current': '72', - 'co2-emissions-current': '1.7', 'roof-description': 'Average thermal transmittance 0.11 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '14 Bloemfontein Road', - 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Electricity: electricity, unspecified tariff', 'lighting-env-eff': 'Very Good', - 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Very Good', - 'walls-energy-eff': 'Good', 'photo-supply': '', 'lighting-cost-potential': '89', 'mainheat-env-eff': 'Poor', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:07:31', - 'flat-top-storey': 'N', 'current-energy-rating': 'C', 'secondheat-description': 'None', 'walls-env-eff': 'Good', - 'transaction-type': 'new dwelling', 'uprn': '34172208', 'current-energy-efficiency': '69', - 'energy-consumption-current': '189', 'mainheat-description': 'Boiler and radiators, electric', - 'lighting-cost-current': '89', 'lodgement-date': '2023-04-17', 'extension-count': '', - 'mainheatc-env-eff': 'Very Good', 'lmk-key': '617063b16faf77c38c0d8784af28ec4f60cc2ab6bf9857b29797172b557ba5c9', - 'wind-turbine-count': '0', 'tenure': 'Owner-occupied', 'floor-level': '2', 'potential-energy-efficiency': '69', - 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.30 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 2, 41 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.6', 'heating-cost-potential': '779', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '403', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '72', 'glazed-type': '', 'heating-cost-current': '779', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '10', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '403', 'county': '', - 'postcode': 'W12 7BH', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.8', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '177', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '30', 'address1': 'Flat 2', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', - 'total-floor-area': '61.0', 'building-reference-number': '10004357458', 'environment-impact-current': '72', - 'co2-emissions-current': '1.8', 'roof-description': 'Average thermal transmittance 0.14 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '41 Bloemfontein Road', - 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Electricity: electricity, unspecified tariff', 'lighting-env-eff': 'Very Good', - 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Very Good', - 'walls-energy-eff': 'Good', 'photo-supply': '', 'lighting-cost-potential': '106', 'mainheat-env-eff': 'Poor', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:15:14', - 'flat-top-storey': 'N', 'current-energy-rating': 'C', 'secondheat-description': 'None', 'walls-env-eff': 'Good', - 'transaction-type': 'new dwelling', 'uprn': '34172205', 'current-energy-efficiency': '69', - 'energy-consumption-current': '177', 'mainheat-description': 'Boiler and radiators, electric', - 'lighting-cost-current': '106', 'lodgement-date': '2023-04-17', 'extension-count': '', - 'mainheatc-env-eff': 'Very Good', 'lmk-key': '6959dda1a3323ab73487baf8c7c071d5ed4ae48e405905c71779904c454e6513', - 'wind-turbine-count': '0', 'tenure': 'Owner-occupied', 'floor-level': '2', 'potential-energy-efficiency': '69', - 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.30 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 1, 41 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.15', 'heating-cost-potential': '674', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '225', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '79', 'glazed-type': '', 'heating-cost-current': '674', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '12', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '225', 'county': '', - 'postcode': 'W12 7BH', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '2.0', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '108', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '19', 'address1': 'Flat 1', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '103.0', 'building-reference-number': '10004350985', 'environment-impact-current': '79', - 'co2-emissions-current': '2.0', 'roof-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '41 Bloemfontein Road', - 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Gas: mains gas', 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Good', - 'walls-energy-eff': 'Good', 'photo-supply': '', 'lighting-cost-potential': '152', 'mainheat-env-eff': 'Good', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:15:13', - 'flat-top-storey': 'N', 'current-energy-rating': 'C', 'secondheat-description': 'None', 'walls-env-eff': 'Good', - 'transaction-type': 'new dwelling', 'uprn': '34172204', 'current-energy-efficiency': '80', - 'energy-consumption-current': '108', 'mainheat-description': 'Boiler and radiators, mains gas', - 'lighting-cost-current': '152', 'lodgement-date': '2023-04-17', 'extension-count': '', - 'mainheatc-env-eff': 'Very Good', 'lmk-key': '90cc959ccbac4f38bbbe68ffd2a6d8ca75190e4670a27fdff6763ece808be2f1', - 'wind-turbine-count': '0', 'tenure': 'Owner-occupied', 'floor-level': '1', 'potential-energy-efficiency': '80', - 'hot-water-energy-eff': 'Good', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.36 W/m-¦K', 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 3, 41 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.65', 'heating-cost-potential': '656', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '369', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '73', 'glazed-type': '', 'heating-cost-current': '656', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '8', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '369', 'county': '', - 'postcode': 'W12 7BH', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.6', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '182', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '31', 'address1': 'Flat 3', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '51.0', 'building-reference-number': '10004361653', 'environment-impact-current': '73', - 'co2-emissions-current': '1.6', 'roof-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '41 Bloemfontein Road', - 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Electricity: electricity, unspecified tariff', 'lighting-env-eff': 'Very Good', - 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Good', - 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '88', 'mainheat-env-eff': 'Poor', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:15:15', - 'flat-top-storey': 'Y', 'current-energy-rating': 'C', 'secondheat-description': 'None', - 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', 'uprn': '34172206', - 'current-energy-efficiency': '71', 'energy-consumption-current': '182', - 'mainheat-description': 'Boiler and radiators, electric', 'lighting-cost-current': '88', - 'lodgement-date': '2023-04-17', 'extension-count': '', 'mainheatc-env-eff': 'Very Good', - 'lmk-key': '98aefd25e8693d461c54f6a3a66246f2a20a03d82bf2575700f5fec876046fb7', 'wind-turbine-count': '0', - 'tenure': 'Owner-occupied', 'floor-level': '3', 'potential-energy-efficiency': '71', - 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.22 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 3, 14 Bloemfontein Road', 'uprn-source': 'Energy Assessor', - 'floor-height': '2.75', 'heating-cost-potential': '433', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '296', 'construction-age-band': '2021', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Very Poor', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '75', 'glazed-type': '', 'heating-cost-current': '433', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '6', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '296', 'county': '', - 'postcode': 'W12 7BX', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.1', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.19 W/m-¦K', 'energy-consumption-potential': '260', - 'local-authority': 'E09000013', 'built-form': 'Mid-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-04-17', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '44', 'address1': 'Flat 3', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '25.0', 'building-reference-number': '10004361390', 'environment-impact-current': '75', - 'co2-emissions-current': '1.1', 'roof-description': 'Average thermal transmittance 0.15 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '14 Bloemfontein Road', - 'hot-water-env-eff': 'Poor', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Electricity: electricity, unspecified tariff', 'lighting-env-eff': 'Very Good', - 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Good', - 'walls-energy-eff': 'Good', 'photo-supply': '', 'lighting-cost-potential': '50', 'mainheat-env-eff': 'Poor', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2023-04-17 14:07:32', - 'flat-top-storey': 'Y', 'current-energy-rating': 'C', 'secondheat-description': 'None', 'walls-env-eff': 'Good', - 'transaction-type': 'new dwelling', 'uprn': '34172209', 'current-energy-efficiency': '72', - 'energy-consumption-current': '260', 'mainheat-description': 'Boiler and radiators, electric', - 'lighting-cost-current': '50', 'lodgement-date': '2023-04-17', 'extension-count': '', - 'mainheatc-env-eff': 'Very Good', 'lmk-key': 'a7d3f17752b602b00b31000c506d814d5bf81704f8f2176555580fe3b6568bdf', - 'wind-turbine-count': '0', 'tenure': 'Owner-occupied', 'floor-level': '3', 'potential-energy-efficiency': '72', - 'hot-water-energy-eff': 'Very Poor', 'low-energy-lighting': '100', - 'walls-description': 'Average thermal transmittance 0.30 W/m-¦K', - 'hotwater-description': 'Electric instantaneous at point of use'}, - {'low-energy-fixed-light-count': '', 'address': '143, Parkside Apartments, Cascade Way', 'uprn-source': '', - 'floor-height': '2.5', 'heating-cost-potential': '1199', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '193', 'construction-age-band': '2020', 'potential-energy-rating': 'B', - 'mainheat-energy-eff': 'Very Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '88', 'glazed-type': '', 'heating-cost-current': '1199', 'address3': 'Cascade Way', - 'mainheatcont-description': 'Charging system linked to use of community heating, programmer and at least two ' - 'room stats', - 'sheating-energy-eff': 'N/A', 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', - 'fixed-lighting-outlets-count': '50', 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', - 'hot-water-cost-current': '193', 'county': '', 'postcode': 'W12 7RE', 'solar-water-heating-flag': '', - 'constituency': 'E14000726', 'co2-emissions-potential': '1.9', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.15 W/m-¦K', 'energy-consumption-potential': '52', - 'local-authority': 'E09000013', 'built-form': 'Semi-Detached', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-03-31', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '10', 'address1': '143', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Very Good', - 'total-floor-area': '185.0', 'building-reference-number': '10004107647', 'environment-impact-current': '88', - 'co2-emissions-current': '1.9', 'roof-description': 'Average thermal transmittance 0.10 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': 'Parkside Apartments', - 'hot-water-env-eff': 'Very Good', 'posttown': 'London', 'mainheatc-energy-eff': 'Good', 'main-fuel': '', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Average', 'photo-supply': '', 'lighting-cost-potential': '207', - 'mainheat-env-eff': 'Very Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2023-03-31 05:10:35', 'flat-top-storey': 'Y', 'current-energy-rating': 'B', - 'secondheat-description': 'None', 'walls-env-eff': 'Average', 'transaction-type': 'new dwelling', 'uprn': '', - 'current-energy-efficiency': '82', 'energy-consumption-current': '52', 'mainheat-description': 'Community scheme', - 'lighting-cost-current': '207', 'lodgement-date': '2023-03-31', 'extension-count': '', 'mainheatc-env-eff': 'Good', - 'lmk-key': '76f71689c3af20210abc756f76ed244254ec5282ceb6a1b2bec48707ebc3acdf', 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '3', 'potential-energy-efficiency': '82', 'hot-water-energy-eff': 'Very Good', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.92 W/m-¦K', - 'hotwater-description': 'Community scheme'}, - {'low-energy-fixed-light-count': '', 'address': '1 Southerton Mews', 'uprn-source': '', 'floor-height': '2.45', - 'heating-cost-potential': '226', 'unheated-corridor-length': '', 'hot-water-cost-potential': '292', - 'construction-age-band': '2022', 'potential-energy-rating': 'B', 'mainheat-energy-eff': 'Average', - 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '84', - 'glazed-type': '', 'heating-cost-current': '226', 'address3': '', - 'mainheatcont-description': 'Programmer and room thermostat', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '10', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '292', 'county': '', - 'postcode': 'W6 0PR', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.4', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.13 W/m-¦K', 'energy-consumption-potential': '101', - 'local-authority': 'E09000013', 'built-form': 'End-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-02-03', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '17', 'address1': '1 Southerton Mews', - 'heat-loss-corridor': '', 'flat-storey-count': '', 'constituency-label': 'Hammersmith', - 'roof-energy-eff': 'Very Good', 'total-floor-area': '81.0', 'building-reference-number': '10003943973', - 'environment-impact-current': '84', 'co2-emissions-current': '1.4', - 'roof-description': 'Average thermal transmittance 0.12 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': '', 'hot-water-env-eff': 'Average', 'posttown': 'London', - 'mainheatc-energy-eff': 'Average', 'main-fuel': 'Electricity: electricity, unspecified tariff', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '84', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2023-02-03 14:12:27', 'flat-top-storey': 'N', 'current-energy-rating': 'B', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', 'uprn': '', - 'current-energy-efficiency': '82', 'energy-consumption-current': '101', - 'mainheat-description': 'Air source heat pump, radiators, electric', 'lighting-cost-current': '84', - 'lodgement-date': '2023-02-03', 'extension-count': '', 'mainheatc-env-eff': 'Average', - 'lmk-key': '0332b4fed03e3e6d20c869714c5c9991f1438ef62594cee4b092d55333abd494', 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '1', 'potential-energy-efficiency': '82', 'hot-water-energy-eff': 'Poor', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': '4 Southerton Mews', 'uprn-source': '', 'floor-height': '2.45', - 'heating-cost-potential': '246', 'unheated-corridor-length': '', 'hot-water-cost-potential': '290', - 'construction-age-band': '2022', 'potential-energy-rating': 'B', 'mainheat-energy-eff': 'Average', - 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', 'environment-impact-potential': '83', - 'glazed-type': '', 'heating-cost-current': '246', 'address3': '', - 'mainheatcont-description': 'Programmer and room thermostat', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '10', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '290', 'county': '', - 'postcode': 'W6 0PR', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.4', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.13 W/m-¦K', 'energy-consumption-potential': '105', - 'local-authority': 'E09000013', 'built-form': 'End-Terrace', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2023-02-03', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '18', 'address1': '4 Southerton Mews', - 'heat-loss-corridor': '', 'flat-storey-count': '', 'constituency-label': 'Hammersmith', - 'roof-energy-eff': 'Very Good', 'total-floor-area': '80.0', 'building-reference-number': '10004009725', - 'environment-impact-current': '83', 'co2-emissions-current': '1.4', - 'roof-description': 'Average thermal transmittance 0.11 W/m-¦K', 'floor-energy-eff': 'Very Good', - 'number-habitable-rooms': '', 'address2': '', 'hot-water-env-eff': 'Average', 'posttown': 'London', - 'mainheatc-energy-eff': 'Average', 'main-fuel': 'Electricity: electricity, unspecified tariff', - 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', 'floor-env-eff': 'Very Good', - 'sheating-env-eff': 'N/A', 'lighting-description': 'Low energy lighting in all fixed outlets', - 'roof-env-eff': 'Very Good', 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '81', - 'mainheat-env-eff': 'Good', 'multi-glaze-proportion': '100', 'main-heating-controls': '', - 'lodgement-datetime': '2023-02-03 14:14:19', 'flat-top-storey': 'N', 'current-energy-rating': 'B', - 'secondheat-description': 'None', 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', 'uprn': '', - 'current-energy-efficiency': '81', 'energy-consumption-current': '105', - 'mainheat-description': 'Air source heat pump, radiators, electric', 'lighting-cost-current': '81', - 'lodgement-date': '2023-02-03', 'extension-count': '', 'mainheatc-env-eff': 'Average', - 'lmk-key': 'e01a48dc015119690eb2aca4b469b77910e1514cdcb098ac6bf97649abe9d062', 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '1', 'potential-energy-efficiency': '81', 'hot-water-energy-eff': 'Poor', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'hotwater-description': 'From main system'}, - {'low-energy-fixed-light-count': '', 'address': 'Flat 1, 209A Fulham Palace Road', 'uprn-source': '', - 'floor-height': '2.95', 'heating-cost-potential': '214', 'unheated-corridor-length': '', - 'hot-water-cost-potential': '66', 'construction-age-band': '2022', 'potential-energy-rating': 'C', - 'mainheat-energy-eff': 'Good', 'windows-env-eff': 'Very Good', 'lighting-energy-eff': 'Very Good', - 'environment-impact-potential': '79', 'glazed-type': '', 'heating-cost-current': '214', 'address3': '', - 'mainheatcont-description': 'Time and temperature zone control', 'sheating-energy-eff': 'N/A', - 'property-type': 'Flat', 'local-authority-label': 'Hammersmith and Fulham', 'fixed-lighting-outlets-count': '1', - 'energy-tariff': 'standard tariff', 'mechanical-ventilation': '', 'hot-water-cost-current': '66', 'county': '', - 'postcode': 'W6 8QX', 'solar-water-heating-flag': '', 'constituency': 'E14000726', - 'co2-emissions-potential': '1.2', 'number-heated-rooms': '', - 'floor-description': 'Average thermal transmittance 0.12 W/m-¦K', 'energy-consumption-potential': '145', - 'local-authority': 'E09000013', 'built-form': 'Detached', 'number-open-fireplaces': '0', - 'windows-description': 'High performance glazing', 'glazed-area': '', 'inspection-date': '2022-07-06', - 'mains-gas-flag': '', 'co2-emiss-curr-per-floor-area': '25', 'address1': 'Flat 1 ', 'heat-loss-corridor': '', - 'flat-storey-count': '', 'constituency-label': 'Hammersmith', 'roof-energy-eff': 'Good', - 'total-floor-area': '46.0', 'building-reference-number': '10003297683', 'environment-impact-current': '79', - 'co2-emissions-current': '1.2', 'roof-description': 'Average thermal transmittance 0.16 W/m-¦K', - 'floor-energy-eff': 'Very Good', 'number-habitable-rooms': '', 'address2': '209A Fulham Palace Road', - 'hot-water-env-eff': 'Good', 'posttown': 'LONDON', 'mainheatc-energy-eff': 'Very Good', - 'main-fuel': 'Gas: mains gas', 'lighting-env-eff': 'Very Good', 'windows-energy-eff': 'Very Good', - 'floor-env-eff': 'Very Good', 'sheating-env-eff': 'N/A', - 'lighting-description': 'Low energy lighting in all fixed outlets', 'roof-env-eff': 'Good', - 'walls-energy-eff': 'Very Good', 'photo-supply': '', 'lighting-cost-potential': '42', 'mainheat-env-eff': 'Good', - 'multi-glaze-proportion': '100', 'main-heating-controls': '', 'lodgement-datetime': '2022-07-06 08:39:46', - 'flat-top-storey': 'N', 'current-energy-rating': 'C', 'secondheat-description': 'None', - 'walls-env-eff': 'Very Good', 'transaction-type': 'new dwelling', 'uprn': '', 'current-energy-efficiency': '77', - 'energy-consumption-current': '145', 'mainheat-description': 'Boiler and radiators, mains gas', - 'lighting-cost-current': '42', 'lodgement-date': '2022-07-06', 'extension-count': '', - 'mainheatc-env-eff': 'Very Good', 'lmk-key': '427710397a10def8490b0752d99ce24b0f44eb39b77c7141cc74afa86e478df1', - 'wind-turbine-count': '0', - 'tenure': 'Not defined - use in the case of a new dwelling for which the intended tenure in not known. It is no', - 'floor-level': '2', 'potential-energy-efficiency': '77', 'hot-water-energy-eff': 'Good', - 'low-energy-lighting': '100', 'walls-description': 'Average thermal transmittance 0.29 W/m-¦K', - 'hotwater-description': 'From main system'} -] diff --git a/model_data/tests/test_downloader.py b/model_data/tests/test_downloader.py deleted file mode 100644 index 3c1492a9..00000000 --- a/model_data/tests/test_downloader.py +++ /dev/null @@ -1,56 +0,0 @@ -import pytest -from epc_api.client import EpcClient -from model_data.downloader import pagenated_epc_download - -# Mock EPC search response -mock_epc_response = { - "rows": [ - {"data1": "value1"}, - {"data2": "value2"}, - ] -} - - -class TestDownloader: - - @pytest.fixture - def mock_client(self, mocker): - # mocker is a wrapper around unittest.mock.Mock, extending with - # additional features specific to pytest - client = mocker.Mock(spec=EpcClient(auth_token="123")) - client.domestic.search.return_value = mock_epc_response - return client - - def test_pagenated_epc_download_basic(self, mock_client): - params = {"address": "Test Address", "postcode": "AB12CD"} - page_size = len(mock_epc_response["rows"]) - n_pages = 1 - - results = pagenated_epc_download(mock_client, params, page_size, n_pages, verbose=1) - - assert len(results) == page_size * n_pages - assert results == mock_epc_response["rows"] - - mock_client.domestic.search.assert_called_with(params=params, offset_from=0, size=page_size) - - def test_pagenated_epc_download_multiple_pages(self, mock_client): - params = {"address": "Test Address", "postcode": "AB12CD"} - page_size = len(mock_epc_response["rows"]) - n_pages = 2 - - results = pagenated_epc_download(mock_client, params, page_size, n_pages) - - assert len(results) == page_size * n_pages - assert results == mock_epc_response["rows"] * n_pages - - mock_client.domestic.search.assert_called_with(params=params, offset_from=page_size, size=page_size) - - def test_pagenated_epc_download_search_returns_none(self, mock_client): - mock_client.domestic.search.return_value = None # Mock the search method to return None - params = {"address": "Test Address", "postcode": "AB12CD"} - page_size = 1 - n_pages = 1 - - results = pagenated_epc_download(mock_client, params, page_size, n_pages) - - assert results == [] diff --git a/model_data/tests/test_sap_model.py b/model_data/tests/test_sap_model.py deleted file mode 100644 index 71d6369c..00000000 --- a/model_data/tests/test_sap_model.py +++ /dev/null @@ -1,37 +0,0 @@ -import pytest -from model_data.EpcClean import EpcClean -from model_data.analysis.SapModel import SapModel -from model_data.tests.test_data.sap_model_data import data - - -class TestSapModel: - - @pytest.fixture - def cleaner(self): - cleaner = EpcClean(data=data) - cleaner.clean() - return cleaner - - @pytest.fixture - def model(self, cleaner): - model = SapModel(data, cleaner=cleaner) - return model - - def test_run(self, model): - assert model.final_model is None - assert model.test_model is None - model.run() - - assert model.final_model is not None - assert model.test_model is not None - - # Note - this will potentially be different on different machines so may need to adjust these tests accordingly - # when running in CI/CD - assert (model.fit_error['Median Absolute Error'] - 1.7316860436422203) < 0.00001 - assert (model.predict_error['Median Absolute Error'] - 2.85481857667385) < 0.00001 - # final model doesn't do that well on this test data - assert (model.final_error['Median Absolute Error'] - 10.050349496213855) < 0.00001 - - - - diff --git a/open_uprn/OpenUprnClient.py b/open_uprn/OpenUprnClient.py deleted file mode 100644 index 502ed25a..00000000 --- a/open_uprn/OpenUprnClient.py +++ /dev/null @@ -1,31 +0,0 @@ -import pandas as pd -from utils.logger import setup_logger - -logger = setup_logger() - - -class OpenUprnClient: - """ - Specs for this dataset can be found here: - https://www.ordnancesurvey.co.uk/documents/product-support/tech-spec/open-uprn-techspec-v1.pdf - """ - - # TODO: Document this - - def __init__(self, path, uprns=None): - self.path = path - self.uprns = [int(x) for x in uprns] if uprns else None - self.data = None - - def read(self): - """ - This methodology is placeholder, while data sits localls - :return: - """ - logger.info("Reading in open uprn data") - - df = pd.read_csv(self.path) - if self.uprns: - df = df[df["UPRN"].isin(self.uprns)] - - self.data = df diff --git a/open_uprn/app.py b/open_uprn/app.py deleted file mode 100644 index 6ed62c44..00000000 --- a/open_uprn/app.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -This application reads in the open uprn data from a static location and loads it into -our database for querying from other services -""" - -import os -from open_uprn.OpenUprnClient import OpenUprnClient - - -def app(): - open_uprn_client = OpenUprnClient( - path=os.path.abspath( - os.path.dirname(__file__) - ) + "/model_data/local_data/osopenuprn_202306_csv/osopenuprn_202305.csv", - ) - open_uprn_client.read() - - # TODO: Add a method to write to the database diff --git a/open_uprn/requirements.txt b/open_uprn/requirements.txt deleted file mode 100644 index 11baa087..00000000 --- a/open_uprn/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -numpy==1.25.1 -pandas==2.0.3 -python-dateutil==2.8.2 -pytz==2023.3 -six==1.16.0 -tzdata==2023.3 -click==8.1.6 -joblib==1.3.1 -nltk==3.8.1 -regex==2023.6.3 -textblob==0.17.1 -tqdm==4.65.0 - diff --git a/pytest.ini b/pytest.ini index 401ecc0f..b2453c82 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,4 +1,4 @@ [pytest] pythonpath = . -addopts = --cov-report term-missing --cov=model_data --cov=recommendations -testpaths = model_data/tests recommendations/tests backend/tests +addopts = --cov-report term-missing --cov=etl --cov=recommendations --cov=backend +testpaths = etl/*/tests recommendations/tests backend/tests diff --git a/recommendations/FloorRecommendations.py b/recommendations/FloorRecommendations.py index a19cf1a8..9ee023c4 100644 --- a/recommendations/FloorRecommendations.py +++ b/recommendations/FloorRecommendations.py @@ -1,13 +1,13 @@ import math from typing import List -from model_data.BaseUtility import Definitions +from BaseUtility import Definitions from datatypes.enums import QuantityUnits from backend.Property import Property from recommendations.recommendation_utils import ( r_value_per_mm_to_u_value, calculate_u_value_uplift, is_diminishing_returns, update_lowest_selected_u_value, - get_recommended_part, estimate_perimeter, get_wall_type, - get_floor_u_value + get_recommended_part, get_floor_u_value ) +from recommendations.rdsap_tables import FLOOR_LEVEL_MAP class FloorRecommendations(Definitions): @@ -24,26 +24,12 @@ class FloorRecommendations(Definitions): PART_L_YEAR_CUTOFF = 2002 - # TODO: This is a placeholder methodology which isn't particularly scalable as more - # unusual floor descriptions are introduced - FLOOR_LEVELS = { - "Ground": 0, - # We don't know what floor level, we just make sure it's not 0 - "mid floor": 1, - "4th": 4, - # We set - "00": 0, - "3rd": 3 - } - def __init__( self, property_instance: Property, - total_floor_area_group_decile: str, materials: List, ): self.property = property_instance - self.total_floor_area_group_decile = total_floor_area_group_decile # For audit purposes, when estimating u values we'll store it self.estimated_u_value = None @@ -62,18 +48,20 @@ class FloorRecommendations(Definitions): def recommend(self): u_value = self.property.floor["thermal_transmittance"] is_suspended = self.property.floor["is_suspended"] - insulation_thickness = self.property.floor["insulation_thickness"] is_solid = self.property.floor["is_solid"] floor_level = ( - self.FLOOR_LEVELS[self.property.data["floor-level"]] if + FLOOR_LEVEL_MAP[self.property.data["floor-level"]] if self.property.data["floor-level"] not in self.DATA_ANOMALY_MATCHES else None ) property_type = self.property.data["property-type"] year_built = self.property.year_built - if self.property.floor["another_property_below"]: - # If there's another property below, it's likely impractical to recommend a floor upgrade + if self.property.floor["another_property_below"] | (self.property.floor["insulation_thickness"] in [ + "average", "above average" + ]): + # If there's another property below, it's likely impractical to recommend a floor upgrade, + # or if the floor is already insualted return # If the property is a flat that isn't at ground level, it's likely impractical to recommend a floor upgrade @@ -93,27 +81,13 @@ class FloorRecommendations(Definitions): # The floor is already compliant return - total_floor_area = float(self.property.data["total-floor-area"]) - number_of_rooms = float(self.property.data["number-habitable-rooms"]) - - if self.property.data["property-type"] == "House": - num_floors = self._estimate_floors(total_floor_area, number_of_rooms) - elif self.property.data["property-type"] == "Flat": - num_floors = 1 - else: - raise NotImplementedError("Implement me") - - estimated_perimeter = estimate_perimeter(total_floor_area / num_floors, number_of_rooms / num_floors) - - wall_type = get_wall_type(**self.property.walls) - u_value = get_floor_u_value( - floor_type="suspended" if is_suspended else "solid", - area=total_floor_area, - perimeter=estimated_perimeter, + floor_type=self.property.floor_type, + area=float(self.property.data["total-floor-area"]), + perimeter=self.property.perimeter, age_band=self.property.age_band, - insulation_thickness=insulation_thickness, - wall_type=wall_type + insulation_thickness=self.property.floor["insulation_thickness"], + wall_type=self.property.wall_type ) self.estimated_u_value = u_value @@ -172,22 +146,3 @@ class FloorRecommendations(Definitions): "cost": estimated_cost, } ) - - @staticmethod - def _estimate_floors(floor_area, num_rooms): - """ - Simple utility funciton, which assuming a 15m squared room, estimates the number of floors in a property - :param floor_area: Gross floor area of a property - :param num_rooms: Number of rooms in a property - :return: Number of floors in a property - """ - # Estimate total room area - total_room_area = num_rooms * 15 - - # Estimate the number of floors - floors = floor_area / total_room_area - - # Round up to the nearest whole number - floors = round(floors) - - return floors diff --git a/recommendations/WallRecommendations.py b/recommendations/WallRecommendations.py index c46a495f..05957e90 100644 --- a/recommendations/WallRecommendations.py +++ b/recommendations/WallRecommendations.py @@ -4,11 +4,12 @@ from typing import List from datatypes.enums import QuantityUnits from backend.Property import Property -from model_data.BaseUtility import Definitions +from BaseUtility import Definitions from recommendations.recommendation_utils import ( r_value_per_mm_to_u_value, calculate_u_value_uplift, is_diminishing_returns, update_lowest_selected_u_value, get_recommended_part, get_wall_u_value ) +from recommendations.config import PARTIALLY_FILLED_PERCENTAGE_ASSUMPTION class WallRecommendations(Definitions): @@ -35,22 +36,12 @@ class WallRecommendations(Definitions): # we still consider it as an option U_VALUE_ERROR = 0.01 - # TODO: Review this value against RdSAP - # Page 19 of rdsap here: - # https://files.bregroup.com/bre-co-uk-file-library-copy/filelibrary/SAP/2012/RdSAP-9.93/RdSAP_2012_9.93.pdf - # provides default U-values for solid brick walls depending on age band - DEFAULT_U_VALUES = { - "solid_brick": 2, - } - def __init__( self, property_instance: Property, - total_floor_area_group_decile: str, materials: List ): self.property = property_instance - self.total_floor_area_group_decile = total_floor_area_group_decile # For audit purposes, when estimating u values we'll store it self.estimated_u_value = None @@ -65,9 +56,9 @@ class WallRecommendations(Definitions): This method check available data, to determine if a property is suitable for external wall insulation """ - # Current logic: If the property is in a conservation area or a flat, it is not suitable for EWI - if (self.property.in_conservation_area in ["in_conversation_area"]) or \ - (self.property.data["property-type"].lower() == "flat"): + # Current logic: If the property is in a conservation area/heritage building/listed building or a flat, + # it is not suitable for EWI + if self.property.restricted_measures or (self.property.data["property-type"].lower() == "flat"): return False return True @@ -78,23 +69,17 @@ class WallRecommendations(Definitions): # recommend internal wall insulation as a possible measure u_value = self.property.walls["thermal_transmittance"] - is_cavity_wall = self.property.walls["is_cavity_wall"] - is_solid_brick = self.property.walls["is_solid_brick"] insulation_thickness = self.property.walls["insulation_thickness"] # We check if the wall is already insulated and if so, we exit - if insulation_thickness in ["average", "above average"]: + if (insulation_thickness in ["average", "above average"]) or self.property.walls["is_filled_cavity"]: return if u_value: + if self.property.walls["thermal_transmittance_unit"] != self.U_VALUE_UNIT: raise NotImplementedError("Haven't handled the case of other u value units yet") - - # TODO: It's worth thinking about this logic because depending on when properties were built, - # they're likely to be of a certain standard. E.g. properties built within a certain time - # period are likely to have cavity walls - # We can't detect it's a cavity wall, but it was built after 1990 so likely built with insulation already # + it already has a U-value WORSE than the building regulations, so we recommend either internal or # external wall insulation @@ -121,9 +106,10 @@ class WallRecommendations(Definitions): is_granite_or_whinstone=self.property.walls["is_granite_or_whinstone"], is_sandstone_or_limestone=self.property.walls["is_sandstone_or_limestone"], ) + self.estimated_u_value = u_value - if is_solid_brick: + if self.property.walls["is_solid_brick"]: if u_value >= self.BUILDING_REGULATIONS_PART_L_MAX_U_VALUE: self.find_insulation(u_value) @@ -132,8 +118,82 @@ class WallRecommendations(Definitions): # If the u-value is within regulations, we don't do anything return + if is_cavity_wall: + if u_value >= self.BUILDING_REGULATIONS_PART_L_MAX_U_VALUE: + # Test filling cavity + self.find_cavity_insulation(u_value, insulation_thickness) + + return + raise NotImplementedError("Not implemented yet") + def find_cavity_insulation(self, u_value, insulation_thickness): + """ + This method tests different materials to fill the cavity wall, determining which + material will give us the best U-value. + + We check for diminishing returns, however this function does not check for meeting building + Part L regulations right now. This is because Part L is less stringent for cavity walls + + Width of a cavity: + There are various sources online that suggest the width of a cavity wall is around 50mm. The retrofit course + indicates that most cavities are 50-75mm. Many sources online indicate that 50mm is the standard MINIMUM figure + therefore we'll use 75mm as the base assumption + + This document: + https://www.buildingcentre.co.uk/media/_file/pdf/22220_pdf27.pdf + Indicates that they could be 50-85mm wide + + :param u_value: u_value of the starting wall + :param insulation_thickness: describes the insulation level of the wall. If "below average", we have a partially + filled cavity wall + """ + + cavity_wall_fills = [m for m in self.materials if m["type"] == "cavity_wall_insulation"] + cavity_width = 75 + if insulation_thickness == "below average": + cavity_width = cavity_width * (1 - PARTIALLY_FILLED_PERCENTAGE_ASSUMPTION) + + # Test the different fill options + lowest_selected_u_value = None + recommendations = [] + for part in cavity_wall_fills: + part_u_value = r_value_per_mm_to_u_value(cavity_width, part["r_value_per_mm"]) + + _, new_u_value = calculate_u_value_uplift(u_value, part_u_value) + new_u_value = math.ceil(new_u_value * 100.0) / 100.0 + + if is_diminishing_returns( + recommendations, new_u_value, lowest_selected_u_value, self.DIMINISHING_RETURNS_U_VALUE + ): + continue + + lowest_selected_u_value = update_lowest_selected_u_value(lowest_selected_u_value, new_u_value) + + estimated_cost = part["cost"] * self.property.insulation_wall_area + + recommendations.append( + { + "parts": [ + get_recommended_part( + part=part, + selected_depth=None, + quantity=self.property.insulation_wall_area, + quantity_unit=QuantityUnits.m2.value, + selected_total_cost=estimated_cost + ) + ], + "type": "wall_insulation", + "description": f"Fill cavity with {part['description']}", + "starting_u_value": u_value, + "new_u_value": new_u_value, + "sap_points": None, + "cost": estimated_cost, + } + ) + + self.recommendations = recommendations + def _find_insulation(self, parts, u_value): lowest_selected_u_value = None recommendations = [] diff --git a/recommendations/config.py b/recommendations/config.py index 750453b0..fb78ab81 100644 --- a/recommendations/config.py +++ b/recommendations/config.py @@ -1,8 +1,17 @@ # This map defines the upgrades that are possible to be recommended by the recommendation engine # For example, -# TODO: once we use cleaned descriptions, this should be updated using the cleaned descriptions UPGRADES_MAP = { - 'Solid brick, as built, no insulation (assumed)': 'Solid brick, as built, insulated (assumed)', - 'Suspended, no insulation (assumed)': 'Suspended, insulated (assumed)', - 'Solid, no insulation (assumed)': 'Solid, insulated (assumed)', + 'Solid brick, as built, no insulation': 'Solid brick, as built, insulated', + 'Suspended, no insulation': 'Suspended, insulated', + 'Solid, no insulation': 'Solid, insulated', + 'Cavity wall, as built, no insulation': 'Cavity wall, as built, insulated', + 'Cavity wall, as built, partial insulation': 'Cavity wall, as built, insulated', } + +PARTIAL_CAVITY_DESCRIPTIONS = [ + "Cavity wall, as built, partial insulation", + "Cavity wall, partial insulation", +] + +# We assume that the cavity is partially filled with insulation, and is filled 25% full +PARTIALLY_FILLED_PERCENTAGE_ASSUMPTION = 0.25 diff --git a/model_data/optimiser/CostOptimiser.py b/recommendations/optimiser/CostOptimiser.py similarity index 100% rename from model_data/optimiser/CostOptimiser.py rename to recommendations/optimiser/CostOptimiser.py diff --git a/model_data/optimiser/GainOptimiser.py b/recommendations/optimiser/GainOptimiser.py similarity index 100% rename from model_data/optimiser/GainOptimiser.py rename to recommendations/optimiser/GainOptimiser.py diff --git a/model_data/optimiser/optimiser_functions.py b/recommendations/optimiser/optimiser_functions.py similarity index 100% rename from model_data/optimiser/optimiser_functions.py rename to recommendations/optimiser/optimiser_functions.py diff --git a/recommendations/rdsap_tables.py b/recommendations/rdsap_tables.py index 71c52354..0ce139ab 100644 --- a/recommendations/rdsap_tables.py +++ b/recommendations/rdsap_tables.py @@ -226,10 +226,10 @@ epc_wall_description_map = { "Cavity wall, as built, partial insulation": "Filled cavity", "Cavity wall, filled cavity": "Filled cavity", "Cavity wall, as built, no insulation": "Cavity as built", - "Cavity wall, as built, insulated": "Unfilled cavity with 100 mm external or internal insulation", + "Cavity wall, as built, insulated": "Filled cavity", "Cavity wall, with external insulation": "Unfilled cavity with 100 mm external or internal insulation", - "Cavity wall, insulated": "Unfilled cavity with 100 mm external or internal insulation", - 'Cavity wall, partial insulation': "Unfilled cavity with 50 mm external or internal insulation", + "Cavity wall, insulated": "Filled cavity", + 'Cavity wall, partial insulation': "Filled cavity", "Cavity wall,": "Cavity as built", # General case of cavity wall without further details "Cavity wall, filled cavity and external insulation": @@ -462,3 +462,31 @@ s11_list = [ ] table_s11 = pd.DataFrame(s11_list) + + +######################################################################################################################## +# +# this map is used to clean the floor value field we see in EPCs +# +######################################################################################################################## +def ordinal(n): + if 10 <= n % 100 <= 20: + suffix = "th" + else: + suffix = {1: "st", 2: "nd", 3: "rd"}.get(n % 10, "th") + + return str(n) + suffix + + +FLOOR_LEVEL_MAP = { + "Basement": -1, + "Ground": 0, + "ground floor": 0, + "mid floor": 1, + "20+": 20, + "21st or above": 21, + **{str(i).zfill(2): i for i in range(0, 21)}, + **{ordinal(i): i for i in range(-1, 21)}, + **{str(i): i for i in range(-1, 21)}, + **{i: i for i in range(-1, 21)}, +} diff --git a/recommendations/recommendation_utils.py b/recommendations/recommendation_utils.py index 8a113050..1eef7b05 100644 --- a/recommendations/recommendation_utils.py +++ b/recommendations/recommendation_utils.py @@ -3,12 +3,11 @@ from copy import deepcopy import pandas as pd -from backend.Property import Property -from statistics import mean from recommendations.rdsap_tables import ( epc_wall_description_map, wall_uvalues_df, default_wall_thickness, table_s9 as s9, table_s10 as s10, table_s11 as s11 ) +from recommendations.config import PARTIALLY_FILLED_PERCENTAGE_ASSUMPTION, PARTIAL_CAVITY_DESCRIPTIONS def r_value_per_mm_to_u_value(depth_mm: int, r_value_per_mm: float): @@ -148,7 +147,9 @@ def apply_formula_s_5_1_1(is_granite_or_whinstone, is_sandstone_or_limestone, ag raise ValueError("This should only be called when is_granite_or_whinstone or is_sandstone_or_limestone is True") -def get_wall_u_value(clean_description, age_band, is_granite_or_whinstone, is_sandstone_or_limestone): +def get_wall_u_value( + clean_description, age_band, is_granite_or_whinstone, is_sandstone_or_limestone +): """ Given some features about a wall, this function will query the wall u-value table and return the u-value :param clean_description: Cleaned up description of the wall from the EPC data @@ -158,13 +159,23 @@ def get_wall_u_value(clean_description, age_band, is_granite_or_whinstone, is_sa :return: """ - mapped_description = epc_wall_description_map[clean_description] + if clean_description in PARTIAL_CAVITY_DESCRIPTIONS: + # If we have a partial cavity fill, we linearly interpolate the u-value. This isn't necessarily the perfect + # method and how we do this should be explored, however we want to distinguish between the old + filled_uvalue = float(wall_uvalues_df[wall_uvalues_df["Wall_type"] == "Filled cavity"][age_band].values[0]) + unfilled_uvalue = float(wall_uvalues_df[wall_uvalues_df["Wall_type"] == "Cavity as built"][age_band].values[0]) - mapped_value = wall_uvalues_df[wall_uvalues_df["Wall_type"] == mapped_description][age_band].values[0] + mapped_value = str( + unfilled_uvalue - (PARTIALLY_FILLED_PERCENTAGE_ASSUMPTION * (unfilled_uvalue - filled_uvalue)) + ) + else: + mapped_description = epc_wall_description_map[clean_description] - if pd.isnull(mapped_value) and "Park home" in mapped_description: - # We don't know enough in this case so we default to 0 - return 0 + mapped_value = wall_uvalues_df[wall_uvalues_df["Wall_type"] == mapped_description][age_band].values[0] + + if pd.isnull(mapped_value) and "Park home" in mapped_description: + # We don't know enough in this case so we default to 0 + return 0 if mapped_value == "a": # The rdSap documentation indicateswe should use a formula to calculate the u-value @@ -436,6 +447,9 @@ def extract_insulation_thickness(insulation_thickness_str): if insulation_thickness_str in ["none", "average", "below average", "above average", None]: return None + if isinstance(insulation_thickness_str, (float, int)): + return insulation_thickness_str + return int(insulation_thickness_str.replace("mm", "")) @@ -476,3 +490,30 @@ def get_wall_type( return "park home" return None + + +def estimate_floors(floor_area, num_rooms): + """ + Simple utility funciton, which assuming a 15m squared room, estimates the number of floors in a property + :param floor_area: Gross floor area of a property + :param num_rooms: Number of rooms in a property + :return: Number of floors in a property + """ + # Estimate total room area + total_room_area = num_rooms * 15 + + # Estimate the number of floors + floors = floor_area / total_room_area + + # Round up to the nearest whole number + floors = round(floors) + + return floors + + +def estimate_wall_area(num_floors, floor_height, perimeter): + wall_area_one_floor = perimeter * floor_height + + total_wall_area = wall_area_one_floor * num_floors + + return total_wall_area diff --git a/recommendations/tests/test_floor_recommendations.py b/recommendations/tests/test_floor_recommendations.py index 1632f468..f3df168f 100644 --- a/recommendations/tests/test_floor_recommendations.py +++ b/recommendations/tests/test_floor_recommendations.py @@ -70,7 +70,7 @@ solid_floor_insulation_parts = [ parts = suspended_floor_insulation_parts + solid_floor_insulation_parts -class TestWallRecommendations: +class TestFloorRecommendations: @pytest.fixture def input_properties(self): @@ -86,23 +86,20 @@ class TestWallRecommendations: property_mock.full_sap_epc = {"lodgement-date": "2000-01-01"} # or any date you want property_mock.data = {"construction-age-band": "1950"} # or any other data that fits your tests - mock_wall_rec_instance = FloorRecommendations(property_mock, "Decile 1", parts) + mock_wall_rec_instance = FloorRecommendations(property_mock, parts) return mock_wall_rec_instance def test_init(self, input_properties): obj = FloorRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=parts ) assert obj assert obj.property - assert obj.total_floor_area_group_decile == "Decile 1" def test_other_premises_below(self, input_properties): recommender = FloorRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=parts ) recommender.recommend() @@ -119,16 +116,17 @@ class TestWallRecommendations: input_properties[2].floor_area = 50 input_properties[2].walls["is_park_home"] = False input_properties[2].age_band = "A" + input_properties[2].perimeter = 20 + input_properties[2].wall_type = "solid brick" recommender = FloorRecommendations( property_instance=input_properties[2], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None recommender.recommend() assert recommender.property.floor["is_suspended"] - assert recommender.estimated_u_value == 0.52 + assert recommender.estimated_u_value == 0.39 assert recommender.recommendations types = {part["type"] for x in recommender.recommendations for part in x["parts"]} @@ -143,7 +141,6 @@ class TestWallRecommendations: """ recommender = FloorRecommendations( property_instance=input_properties[3], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None @@ -161,17 +158,18 @@ class TestWallRecommendations: input_properties[4].floor_area = 100 input_properties[4].walls["is_park_home"] = False input_properties[4].age_band = "B" + input_properties[4].perimeter = 50 + input_properties[4].wall_type = "solid brick" recommender = FloorRecommendations( property_instance=input_properties[4], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None recommender.recommend() assert not recommender.property.floor["is_suspended"] assert recommender.property.floor["is_solid"] - assert recommender.estimated_u_value == 0.63 + assert recommender.estimated_u_value == 0.71 assert recommender.recommendations types = {part["type"] for x in recommender.recommendations for part in x["parts"]} @@ -185,7 +183,6 @@ class TestWallRecommendations: recommender = FloorRecommendations( property_instance=input_properties[6], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None diff --git a/recommendations/tests/test_recommendation_utils.py b/recommendations/tests/test_recommendation_utils.py index b3ea0141..eb1a5024 100644 --- a/recommendations/tests/test_recommendation_utils.py +++ b/recommendations/tests/test_recommendation_utils.py @@ -304,3 +304,32 @@ def test_estimate_perimeter_invalid_inputs(): recommendation_utils.estimate_perimeter(-100, 5) with pytest.raises(ValueError): recommendation_utils.estimate_perimeter(100, -5) + + +def test_solid_floor(): + assert math.isclose( + recommendation_utils.get_floor_u_value( + 'solid', 100, 40, 'A', 'stone', insulation_thickness="20mm" + ), + 0.4, rel_tol=1e-2) + + +def test_suspended_floor(): + assert math.isclose( + recommendation_utils.get_floor_u_value( + 'suspended', 100, 40, 'A', 'timber frame', insulation_thickness="20mm" + ), + 0.49, rel_tol=1e-2) + + +def test_invalid_floor_type(): + with pytest.raises(ValueError): + recommendation_utils.get_floor_u_value( + 'invalid_type', 100, 40, 'A', 'stone', insulation_thickness="20mm" + ) + + +def test_park_home(): + assert recommendation_utils.get_floor_u_value( + 'suspended', 100, 40, 'A', 'park home', insulation_thickness="20mm" + ) == 0 diff --git a/recommendations/tests/test_wall_recommendations.py b/recommendations/tests/test_wall_recommendations.py index cf036a1c..e910a8f5 100644 --- a/recommendations/tests/test_wall_recommendations.py +++ b/recommendations/tests/test_wall_recommendations.py @@ -1,6 +1,7 @@ import os import pytest import pickle +import numpy as np from unittest.mock import Mock, MagicMock from recommendations.WallRecommendations import WallRecommendations from backend.Property import Property @@ -10,12 +11,6 @@ from recommendations.recommendation_utils import is_diminishing_returns # os.path.abspath(os.path.dirname(__file__)) + "/recommendations/tests/test_data/input_properties.pkl", "rb" # ) as f: # input_properties = pickle.load(f) -# -# with open( -# os.path.abspath(os.path.dirname(__file__)) + "/recommendations/tests/test_data/uvalue_estimates.pkl", "rb" -# ) as f: -# uvalue_estimates = pickle.load(f) - external_wall_insulation_parts = [ { @@ -190,7 +185,22 @@ internal_wall_insulation_parts = [ }, ] -wall_parts = external_wall_insulation_parts + internal_wall_insulation_parts +cavity_wall_insulation_parts = [ + {'id': 4, 'type': 'cavity_wall_insulation', 'description': 'Example Material 1', + 'depths': None, + 'depth_unit': None, 'cost': 20, + 'cost_unit': 'gbp_sq_meter', 'r_value_per_mm': 0.0278, 'r_value_unit': 'square_meter_kelvin_per_watt', + 'thermal_conductivity': 0.036, 'thermal_conductivity_unit': 'watt_per_meter_kelvin', + 'link': None, 'created_at': None, 'is_active': True}, + {'id': 10, 'type': "cavity_wall_insulation", 'description': 'Example Material 2', + 'depths': None, 'depth_unit': None, 'cost': 25, 'cost_unit': 'gbp_sq_meter', + 'r_value_per_mm': 0.02631579, 'r_value_unit': 'square_meter_kelvin_per_watt', 'thermal_conductivity': 0.038, + 'thermal_conductivity_unit': 'watt_per_meter_kelvin', + 'link': None, + 'created_at': None, 'is_active': True} +] + +wall_parts = external_wall_insulation_parts + internal_wall_insulation_parts + cavity_wall_insulation_parts class TestWallRecommendations: @@ -210,19 +220,17 @@ class TestWallRecommendations: property_mock.data = {"construction-age-band": "1950"} # or any other data that fits your tests mock_wall_rec_instance = WallRecommendations( - property_mock, "Decile 1", materials=wall_parts + property_mock, materials=wall_parts ) return mock_wall_rec_instance def test_init(self, input_properties): obj = WallRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=wall_parts ) assert obj assert obj.property - assert obj.total_floor_area_group_decile == "Decile 1" def test_uvalue_0_16(self, input_properties): """ @@ -230,13 +238,15 @@ class TestWallRecommendations: The important data for this recommendation is: - u value of 0.16 - property built in 2014 - Since properties built after 1990 are typically built with insulation and this property + Since epc built after 1990 are typically built with insulation and this property already has really good insulation, we do NOT recommend any measures for this property """ input_properties[0].year_built = 2014 + input_properties[0].in_conservation_area = None + input_properties[0].restricted_measures = False + recommender = WallRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=wall_parts ) assert recommender.property.walls["original_description"] == "Average thermal transmittance 0.16 W/m-¦K" @@ -258,10 +268,10 @@ class TestWallRecommendations: input_properties[1].walls["clean_description"] = "Solid brick, as built, no insulation" input_properties[1].walls["is_sandstone_or_limestone"] = False input_properties[1].age_band = "A" + input_properties[1].restricted_measures = False recommender = WallRecommendations( property_instance=input_properties[1], - total_floor_area_group_decile="Decile 1", materials=wall_parts ) assert recommender.property.walls["original_description"] == "Solid brick, as built, no insulation (assumed)" @@ -295,9 +305,9 @@ class TestWallRecommendations: """ input_properties[6].year_built = 1991 + input_properties[6].restricted_measures = False recommender = WallRecommendations( property_instance=input_properties[6], - total_floor_area_group_decile="Decile 1", materials=wall_parts ) @@ -372,17 +382,19 @@ class TestWallRecommendationsBase: property_mock = MagicMock(spec=Property) property_mock.full_sap_epc = {"lodgement-date": "1999-12-31"} property_mock.in_conservation_area = "not_in_conservation_area" + property_mock.restricted_measures = False return property_mock @pytest.fixture def wall_recommendations_instance(self, property_mock): wall_recommendations_instance = WallRecommendations( - property_mock, "Decile 1", materials=wall_parts + property_mock, materials=wall_parts ) return wall_recommendations_instance def test_ewi_valid_in_conservation_area(self, wall_recommendations_instance): wall_recommendations_instance.property.in_conservation_area = "in_conversation_area" + wall_recommendations_instance.property.restricted_measures = True assert wall_recommendations_instance.ewi_valid is False def test_ewi_valid_is_flat(self, wall_recommendations_instance): @@ -391,6 +403,7 @@ class TestWallRecommendationsBase: def test_ewi_valid_not_in_conservation_area_and_not_flat(self, wall_recommendations_instance): wall_recommendations_instance.property.in_conservation_area = "not_in_conversation_area" + wall_recommendations_instance.property.restricted_measures = False wall_recommendations_instance.property.data = {"property-type": "house"} assert wall_recommendations_instance.ewi_valid is True @@ -407,3 +420,86 @@ class TestWallRecommendationsBase: wall_recommendations_instance.property.age_band = "A" with pytest.raises(NotImplementedError): wall_recommendations_instance.recommend() + + +class TestCavityWallRecommensations: + data = { + 'low-energy-fixed-light-count': '', 'address': '123 Fake Street', + 'floor-height': '', 'construction-age-band': 'England and Wales: 1950-1966', + 'address3': '', 'property-type': 'House', 'local-authority-label': 'Melton', + 'county': 'Leicestershire', 'postcode': 'LE14 2QH', + 'solar-water-heating-flag': 'N', 'constituency': 'E14000909', + 'number-heated-rooms': '5', 'local-authority': 'E07000133', 'built-form': 'End-Terrace', + 'address1': '1, 23 fake', 'total-floor-area': '85.0', 'environment-impact-current': '49', + 'number-habitable-rooms': 3, 'address2': 'Fake', 'posttown': 'IDK', + 'walls-energy-eff': 'Poor', 'current-energy-rating': 'D', + 'transaction-type': 'ECO assessment', 'uprn': '999', 'current-energy-efficiency': '57', + 'lodgement-date': '2019-07-10', 'lmk-key': '999', 'tenure': 'rental (private)', 'floor-level': 'NODATA!', + 'walls-description': 'Cavity wall, as built, no insulation (assumed)', + } + + def test_fill_empty_cavity(self): + input_property = Property(id=1, postcode="F4k3", address1="123 fake street", epc_client=Mock()) + input_property.walls = { + 'original_description': 'Cavity wall, as built, no insulation (assumed)', + 'clean_description': 'Cavity wall, as built, no insulation', + 'thermal_transmittance': None, 'thermal_transmittance_unit': None, + 'is_cavity_wall': True, 'is_filled_cavity': False, 'is_solid_brick': False, + 'is_system_built': False, 'is_timber_frame': False, 'is_granite_or_whinstone': False, + 'is_as_built': True, 'is_cob': False, 'is_assumed': True, + 'is_sandstone_or_limestone': False, 'is_park_home': False, + 'insulation_thickness': 'none', 'external_insulation': False, + 'internal_insulation': False + } + input_property.age_band = "C" + input_property.insulation_wall_area = 50 + + recommender = WallRecommendations( + property_instance=input_property, + materials=cavity_wall_insulation_parts + ) + + assert not recommender.recommendations + + recommender.recommend() + + assert recommender.recommendations + assert recommender.estimated_u_value == 1.5 + assert np.isclose(recommender.recommendations[0]["new_u_value"], 0.25) + assert np.isclose(recommender.recommendations[0]["cost"], 1000) + + assert np.isclose(recommender.recommendations[1]["new_u_value"], 0.26) + assert np.isclose(recommender.recommendations[1]["cost"], 1250) + + def test_fill_partial_filled_cavity(self): + input_property = Property(id=1, postcode="F4k3", address1="123 fake street", epc_client=Mock()) + input_property.walls = { + 'original_description': 'Cavity wall, as built, partial insulation (assumed)', + 'clean_description': 'Cavity wall, as built, partial insulation', + 'thermal_transmittance': None, 'thermal_transmittance_unit': None, + 'is_cavity_wall': True, 'is_filled_cavity': False, 'is_solid_brick': False, + 'is_system_built': False, 'is_timber_frame': False, 'is_granite_or_whinstone': False, + 'is_as_built': True, 'is_cob': False, 'is_assumed': True, + 'is_sandstone_or_limestone': False, 'is_park_home': False, + 'insulation_thickness': 'below average', 'external_insulation': False, + 'internal_insulation': False + } + input_property.age_band = "C" + input_property.insulation_wall_area = 50 + + recommender = WallRecommendations( + property_instance=input_property, + materials=cavity_wall_insulation_parts + ) + + assert not recommender.recommendations + + recommender.recommend() + + assert recommender.recommendations + assert recommender.estimated_u_value == 1.3 + assert np.isclose(recommender.recommendations[0]["new_u_value"], 0.56) + assert np.isclose(recommender.recommendations[0]["cost"], 1000) + + assert np.isclose(recommender.recommendations[1]["new_u_value"], 0.57) + assert np.isclose(recommender.recommendations[1]["cost"], 1250) diff --git a/sapmodel.serverless.yml b/sapmodel.serverless.yml deleted file mode 100644 index 8e811a57..00000000 --- a/sapmodel.serverless.yml +++ /dev/null @@ -1,62 +0,0 @@ -service: sapmodel - -provider: - name: aws - region: eu-west-2 - architecture: x86_64 - environment: - RUNTIME_ENVIRONMENT: ${env:RUNTIME_ENVIRONMENT} - MODEL_DIRECTORY_BUCKET: ${env:MODEL_DIRECTORY_BUCKET} - PREDICTIONS_BUCKET: ${env:PREDICTIONS_BUCKET} - DATA_BUCKET: ${env:DATA_BUCKET} - DOMAIN_NAME: ${env:DOMAIN_NAME} - ECR_URI: ${env:ECR_URI} - GITHUB_SHA: ${env:GITHUB_SHA} - iam: - role: - name: sapmodel_s3_access - statements: - # Allow reading from MODEL_DIRECTORY_BUCKET and DATA_BUCKET - - Effect: Allow - Action: - - s3:* - # - s3:GetObject - # - s3:ListBucket - Resource: - - arn:aws:s3:::${env:MODEL_DIRECTORY_BUCKET} - - arn:aws:s3:::${env:MODEL_DIRECTORY_BUCKET}/* - - arn:aws:s3:::${env:DATA_BUCKET} - - arn:aws:s3:::${env:DATA_BUCKET}/* - # Allow reading and writing to PREDICTIONS_BUCKET - - Effect: Allow - Action: - - s3:* - # - s3:GetObject - # - s3:PutObject - # - s3:ListBucket - Resource: - - arn:aws:s3:::${env:PREDICTIONS_BUCKET} - - arn:aws:s3:::${env:PREDICTIONS_BUCKET}/* - - - -plugins: - - serverless-domain-manager - -custom: - customDomain: - domainName: api.${self:provider.environment.DOMAIN_NAME} - basePath: 'sapmodel' - createRoute53Record: true - certificateArn: ${ssm:/ssl_certificate_arn} - -functions: - sap_prediction_lambda: - image: - uri: ${env:ECR_URI}:${env:GITHUB_SHA} - # role: sapPredictionLambdaRole - events: - - http: - path: /predict - method: POST - timeout: 120 # Set max run time to 2 minutes - we shouldn't need this much time so this can be reviewed diff --git a/utils/s3.py b/utils/s3.py index 8d24d6c0..7414da3f 100644 --- a/utils/s3.py +++ b/utils/s3.py @@ -2,6 +2,9 @@ import boto3 from io import BytesIO from botocore.exceptions import NoCredentialsError, PartialCredentialsError import pandas as pd +from utils.logger import setup_logger + +logger = setup_logger() def read_from_s3(bucket_name, s3_file_name): @@ -46,6 +49,27 @@ def save_data_to_s3(data, bucket_name, s3_file_name): print(f'Failed to upload data to {bucket_name}/{s3_file_name}: {str(e)}') +def read_io_from_s3(bucket_name, file_key): + """ + Read a file from S3 into a BytesIO object. This can be used by other methods to parse the response + + Because we use + + :param bucket_name: The name of the S3 bucket + :param file_key: The file name of the shapefile in S3 + :return: Io file to be parsed by another method + """ + client = boto3.client('s3') + + # Get the Parquet file from S3 + response = client.get_object(Bucket=bucket_name, Key=file_key) + + # Read the file into an io object + buffer = BytesIO(response['Body'].read()) + + return buffer + + def save_dataframe_to_s3_parquet(df, bucket_name, file_key): """ Save a pandas DataFrame to S3 as a Parquet file. @@ -75,14 +99,17 @@ def read_dataframe_from_s3_parquet(bucket_name, file_key): :return: A pandas DataFrame. """ - # Create the boto3 client - client = boto3.client('s3') + if bucket_name is None: + raise ValueError("Bucket name is None when trying to read dataframe from parquet") - # Get the Parquet file from S3 - response = client.get_object(Bucket=bucket_name, Key=file_key) + if not file_key.endswith(".parquet"): + raise ValueError("This file doesn't look like a parquet file") + + parquet_buffer = read_io_from_s3( + bucket_name=bucket_name, + file_key=file_key + ) - # Read the file into a pandas DataFrame - parquet_buffer = BytesIO(response['Body'].read()) df = pd.read_parquet(parquet_buffer) return df diff --git a/utils/tests/test_uvalue_estimates.py b/utils/tests/test_uvalue_estimates.py deleted file mode 100644 index 1b29994c..00000000 --- a/utils/tests/test_uvalue_estimates.py +++ /dev/null @@ -1,80 +0,0 @@ -from utils.uvalue_estimates import classify_decile_newvalues - - -def test_classify_decile_newvalues_edge_cases(): - decile_labels = [f"Decile {i + 1}" for i in range(10)] - decile_boundaries = list(range(11)) - - # Test with values at the exact boundaries - assert classify_decile_newvalues(decile_boundaries, decile_labels, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) == ['Decile 1', - 'Decile 2', - 'Decile 3', - 'Decile 4', - 'Decile 5', - 'Decile 6', - 'Decile 7', - 'Decile 8', - 'Decile 9', - 'Decile 10'] - - # Test with values at the exact boundaries, but in reverse order - assert classify_decile_newvalues(decile_boundaries, decile_labels, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) == ['Decile 10', - 'Decile 9', - 'Decile 8', - 'Decile 7', - 'Decile 6', - 'Decile 5', - 'Decile 4', - 'Decile 3', - 'Decile 2', - 'Decile 1'] - - # Test with values just below the boundaries - assert classify_decile_newvalues(decile_boundaries, decile_labels, [x - 0.5 for x in range(2, 12)]) == ['Decile 1', - 'Decile 2', - 'Decile 3', - 'Decile 4', - 'Decile 5', - 'Decile 6', - 'Decile 7', - 'Decile 8', - 'Decile 9', - 'Decile 10'] - - # Test with values just above the boundaries - assert classify_decile_newvalues(decile_boundaries, decile_labels, [x + 0.5 for x in range(1, 11)]) == ['Decile 2', - 'Decile 3', - 'Decile 4', - 'Decile 5', - 'Decile 6', - 'Decile 7', - 'Decile 8', - 'Decile 9', - 'Decile 10', - None] - - # Test with empty list - assert classify_decile_newvalues(decile_boundaries, decile_labels, []) == [] - - # Test with a single value - assert classify_decile_newvalues(decile_boundaries, decile_labels, [5.5]) == ['Decile 6'] - - # Test with all values the same - assert classify_decile_newvalues(decile_boundaries, decile_labels, [5, 5, 5, 5, 5]) == ['Decile 5', 'Decile 5', - 'Decile 5', 'Decile 5', - 'Decile 5'] - - # Test with values out of order - assert classify_decile_newvalues(decile_boundaries, decile_labels, [10, 5, 1, 7, 3]) == ['Decile 10', 'Decile 5', - 'Decile 1', 'Decile 7', - 'Decile 3'] - - # Test with negative decile boundaries - decile_boundaries = list(range(-10, 1)) - assert classify_decile_newvalues(decile_boundaries, decile_labels, [-9, -5, -1]) == ['Decile 2', 'Decile 6', - 'Decile 10'] - - # Test with floating point decile boundaries - decile_boundaries = [x / 10 for x in range(11)] - assert classify_decile_newvalues(decile_boundaries, decile_labels, [0.35, 0.55, 0.75]) == ['Decile 4', 'Decile 6', - 'Decile 8'] diff --git a/utils/uvalue_estimates.py b/utils/uvalue_estimates.py deleted file mode 100644 index 8e2dbaa6..00000000 --- a/utils/uvalue_estimates.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from bisect import bisect_left - - -def classify_decile_newvalues( - decile_boundaries: List[float], decile_labels: List[str], new_values: List[float] -) -> List[str]: - """ - Classify a list of new values into pre-established deciles. - - This function is an alternative to UvalueEstimations.classify_decile_newvalues that does not depend on pandas, - making it suitable for use in environments where pandas may not be available (such as AWS Lambda). - - :param decile_boundaries: A list of decile boundaries. These define the ranges of the deciles. - :param decile_labels: A list of labels for the deciles. These are the classifications to be assigned to the values. - :param new_values: A list of new values to be classified into the deciles. - - :return: A list of classifications for the new values. Each classification corresponds to the decile in which - the respective new value falls. If a value falls outside the range of the deciles, its classification is - None. - """ - classifications = [] - - # For each new value... - for value in new_values: - # If the value is outside the range of the deciles, classify it as None - if value < decile_boundaries[0] or value > decile_boundaries[-1]: - classifications.append(None) - else: - # Use bisect_left to find the decile in which the value falls - i = bisect_left(decile_boundaries, value) - # If the value falls exactly on a decile boundary, classify it in the lower decile - if i: - i -= 1 - # Append the classification to the list of classifications - classifications.append(decile_labels[i]) - return classifications -