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
-