From 2f88f2a0afa4e812549207d33fc689b9cd580f5b Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 21 Jul 2023 15:22:22 +0100 Subject: [PATCH] erfactoring recommendations --- backend/app/plan/router.py | 36 +++++++---- backend/app/plan/uvalue_estimates_floors.py | 42 ++++++------- backend/app/plan/uvalue_estimates_walls.py | 70 ++++++++++----------- recommendations/FloorRecommendations.py | 61 +++--------------- recommendations/WallRecommendations.py | 7 ++- recommendations/recommendation_utils.py | 4 +- 6 files changed, 98 insertions(+), 122 deletions(-) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 73993e78..aa8655bf 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -101,7 +101,6 @@ async def trigger_plan(body: PlanTriggerRequest): p.set_is_in_conservation_area(in_conservation_area) logger.info("Getting components and properties recommendations") - recommendations = [] for property_id, p in enumerate(input_properties): # For each property, classiy floor area decide @@ -114,14 +113,29 @@ async def trigger_plan(body: PlanTriggerRequest): # 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=uvalue_estimates_floors) + floor_recommender = FloorRecommendations( + property_instance=p, uvalue_estimates=floors_u_value_estimate, + total_floor_area_group_decile=total_floor_area_group_decile + ) floor_recommender.recommend() - floor_recommendations = floor_recommender.recommendations # insert property id - for rec in floor_recommendations: + for rec in floor_recommender.recommendations: rec["property_id"] = property_id + recommendations.extend(floor_recommender.recommendations) + # Wall recommendations # We would make this u-value query directly to the database total_floor_area_group_decile = classify_decile_newvalues( @@ -137,20 +151,20 @@ async def trigger_plan(body: PlanTriggerRequest): 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"]) & - (x['walls-env-eff'] == p.data["walls-env-eff"]) + (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_recomendations = WallRecommendations( - property_instance=p, uvalue_estimates=walls_u_value_estimate, + property_instance=p, + uvalue_estimates=walls_u_value_estimate, total_floor_area_group_decile=total_floor_area_group_decile ) wall_recomendations.recommend() - wall_recomendations = wall_recomendations.recommendations # insert property id - for rec in wall_recomendations: + for rec in wall_recomendations.recommendations: rec["property_id"] = property_id - recommendations.extend(floor_recommendations) + recommendations.extend(wall_recomendations.recommendations) - return {"message": "Plan complete"} + return {"recommendations": recommendations} diff --git a/backend/app/plan/uvalue_estimates_floors.py b/backend/app/plan/uvalue_estimates_floors.py index bb570138..cba31508 100644 --- a/backend/app/plan/uvalue_estimates_floors.py +++ b/backend/app/plan/uvalue_estimates_floors.py @@ -64,13 +64,13 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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': nan, 'n_samples': 1}, + '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}, @@ -190,7 +190,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -591,13 +591,13 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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}, @@ -832,7 +832,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -1032,7 +1032,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1137,7 +1137,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1200,7 +1200,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1372,7 +1372,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1807,7 +1807,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1819,7 +1819,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1882,7 +1882,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 1}, + '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}, @@ -2114,7 +2114,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2186,7 +2186,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2277,7 +2277,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2963,11 +2963,11 @@ uvalue_estimates_floors = [ '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': nan, + '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': nan, 'n_samples': 2}, + '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, @@ -3015,7 +3015,7 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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}, @@ -3633,10 +3633,10 @@ uvalue_estimates_floors = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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}, diff --git a/backend/app/plan/uvalue_estimates_walls.py b/backend/app/plan/uvalue_estimates_walls.py index aa5f9781..edf114ce 100644 --- a/backend/app/plan/uvalue_estimates_walls.py +++ b/backend/app/plan/uvalue_estimates_walls.py @@ -91,16 +91,16 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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}, @@ -208,13 +208,13 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 3}, + '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': nan, 'n_samples': 4}, + '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}, @@ -334,7 +334,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 8}, + '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}, @@ -352,7 +352,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -622,7 +622,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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, @@ -894,13 +894,13 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 4}, + '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}, @@ -1122,7 +1122,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1221,7 +1221,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 6}, + '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}, @@ -1281,10 +1281,10 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 1}, + '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}, @@ -1634,7 +1634,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -1643,7 +1643,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -1682,10 +1682,10 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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}, @@ -1694,7 +1694,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -1859,7 +1859,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1964,7 +1964,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 1}, + '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}, @@ -1979,10 +1979,10 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 1}, + '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': nan, 'n_samples': 2}, + '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}, @@ -2036,7 +2036,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2299,7 +2299,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2466,7 +2466,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -2533,7 +2533,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, @@ -3234,10 +3234,10 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, + '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', @@ -3267,7 +3267,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 4}, + '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}, @@ -3572,7 +3572,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 4}, + '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}, @@ -3735,7 +3735,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 1}, + '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}, @@ -3919,10 +3919,10 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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': nan, 'n_samples': 2}, + '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}, @@ -3973,7 +3973,7 @@ uvalue_estimates_walls = [ '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': nan, 'n_samples': 2}, + '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}, diff --git a/recommendations/FloorRecommendations.py b/recommendations/FloorRecommendations.py index 6641bd28..afdea35f 100644 --- a/recommendations/FloorRecommendations.py +++ b/recommendations/FloorRecommendations.py @@ -1,10 +1,11 @@ import math +from typing import List from model_data.BaseUtility import BaseUtility from model_data.Property import Property from model_data.rdsap_tables import default_wall_thickness, age_band_data 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_recommended_part, get_uvalue_estimate ) suspended_floor_insulation_parts = [ @@ -91,11 +92,13 @@ class FloorRecommendations(BaseUtility): "4th": 4, # We set "00": 0, + "3rd": 3 } - def __init__(self, property_instance: Property, uvalue_estimates): + def __init__(self, property_instance: Property, uvalue_estimates: List, total_floor_area_group_decile: str): self.property = property_instance self.uvalue_estimates = uvalue_estimates + 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 @@ -242,7 +245,11 @@ class FloorRecommendations(BaseUtility): age_band=age_band, ) else: - u_value = self._get_floors_uvalue_estimate() + u_value = get_uvalue_estimate( + uvalue_estimates=self.uvalue_estimates, + property=self.property, + total_floor_area_group_decile=self.total_floor_area_group_decile + ) self.estimated_u_value = u_value @@ -254,54 +261,6 @@ class FloorRecommendations(BaseUtility): # Given the U-value, we recommend solid floor insulation options which are usually solid foam self.recommend_floor_insulation(u_value=u_value, parts=solid_floor_insulation_parts) - def _get_floors_uvalue_estimate(self, total_floor_area_group_decile): - blah - """ - Wrapper function which contains the methodology to extract a property's walls u-value estimate - when we don't have a true value and if we can't base our assumption off of the material - :return: - """ - - # total_floor_area_group_decile = UvalueEstimations.classify_decile_newvalues( - # decile_boundaries=self.uvalue_estimates.floors_decile_data["decile_boundaries"], - # decile_labels=self.uvalue_estimates.floors_decile_data["decile_labels"], - # new_values=[float(self.property.data["total-floor-area"])], - # )[0] - - u_value_estimate = self.uvalue_estimates.floors[ - (self.uvalue_estimates.floors["local-authority"] == self.property.data["local-authority"]) & - (self.uvalue_estimates.floors["property-type"] == self.property.data["property-type"]) & - (self.uvalue_estimates.floors["built-form"] == self.property.data["built-form"]) & - (self.uvalue_estimates.floors["floor-energy-eff"] == self.property.data["floor-energy-eff"]) & - (self.uvalue_estimates.floors["floor-env-eff"] == self.property.data["floor-env-eff"]) & - (self.uvalue_estimates.floors["total-floor-area_group"] == total_floor_area_group_decile) - ] - - if u_value_estimate.empty: - raise ValueError("No U-value estimate found for the given property") - - # Because of how spuriously populated the data is for number-habitable-rooms and number-heated-rooms, - # we will try and filter on these to see if we get a result - - habitable_rooms_filter = ( - self.uvalue_estimates.walls["number-habitable-rooms"] == self.property.data["number-habitable-rooms"] - ) - - if any(habitable_rooms_filter): - u_value_estimate = u_value_estimate[habitable_rooms_filter] - - heated_rooms_filter = ( - self.uvalue_estimates.walls["number-heated-rooms"] == self.property.data["number-heated-rooms"] - ) - - if any(heated_rooms_filter): - u_value_estimate = u_value_estimate[heated_rooms_filter] - - # It's possible for us to have multiple rows if we didn't do a habitable/heated rooms filter so we - # average - - return u_value_estimate["median_thermal_transmittance"].mean() - def recommend_floor_insulation(self, u_value, parts): """ This method is tasked with estimating the impact of performing suspended floor insulation diff --git a/recommendations/WallRecommendations.py b/recommendations/WallRecommendations.py index 2e14aef5..261c26a0 100644 --- a/recommendations/WallRecommendations.py +++ b/recommendations/WallRecommendations.py @@ -5,7 +5,7 @@ from model_data.Property import Property from model_data.BaseUtility import BaseUtility 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_recommended_part, get_uvalue_estimate ) external_wall_insulation_parts = [ @@ -284,7 +284,10 @@ class WallRecommendations(BaseUtility): # This is an estimated figure based on industry standards u_value = self.DEFAULT_U_VALUES["solid_brick"] else: - u_value = self._get_walls_uvalue_estimate() + u_value = get_uvalue_estimate( + uvalue_estimates=self.uvalue_estimates, property=self.property, + total_floor_area_group_decile=self.total_floor_area_group_decile + ) self.estimated_u_value = u_value if u_value >= self.BUILDING_REGULATIONS_PART_L_MAX_U_VALUE: diff --git a/recommendations/recommendation_utils.py b/recommendations/recommendation_utils.py index bb6ed9b9..9d09a13a 100644 --- a/recommendations/recommendation_utils.py +++ b/recommendations/recommendation_utils.py @@ -114,7 +114,7 @@ def get_recommended_part(part, selected_depth): return recommended_part -def get_uvalue_estimate(uvalue_estimates, property: Property): +def get_uvalue_estimate(uvalue_estimates, property: Property, total_floor_area_group_decile): """ Wrapper function which contains the methodology to extract a property's walls u-value estimate when we don't have a true value and if we can't base our assumption off of the material @@ -127,7 +127,7 @@ def get_uvalue_estimate(uvalue_estimates, property: Property): # We try and filter on total_floor_area_group_decile floor_area_filter = [ x for x in uvalue_estimates if - x["total-floor-area_group"] == property.data["total_floor_area_group_decile"] + x["total-floor-area_group"] == total_floor_area_group_decile ] if not floor_area_filter: