diff --git a/epc_data/app.py b/epc_data/app.py index 2006213f..7e543b2d 100644 --- a/epc_data/app.py +++ b/epc_data/app.py @@ -1,3 +1,4 @@ +import pandas as pd from tqdm import tqdm from epc_data.temp_inputs import input_data @@ -41,5 +42,14 @@ def handler(): # For testing: from epc_data.cleaning.Floor import CleanFloor descriptions = {x["floor-description"] for x in data} + out = [] for description in descriptions: res = CleanFloor(description).clean() + out.append( + { + "original_description": description, + **res + } + ) + df = pd.DataFrame(out) + df = df.sort_values("original_description") diff --git a/epc_data/cleaning/Floor.py b/epc_data/cleaning/Floor.py index 67386290..9decf67d 100644 --- a/epc_data/cleaning/Floor.py +++ b/epc_data/cleaning/Floor.py @@ -14,47 +14,104 @@ class CleanFloor: """ description_lower = self.description.lower().strip() + assumed = "assumed" in description_lower to_unheated_space = "to unheated space" in description_lower + to_external_air = "to external air" in description_lower + is_suspended = "suspended" in description_lower + is_solid = "solid" in description_lower + thermal_transmittence, thermal_transmittence_unit, insulation_thickness = None, None, None + is_valid = "invalid" not in description_lower - if "another dwelling below" in description_lower: + if "another dwelling below" in description_lower or "other premises below" in description_lower: return self._make_clean_output( + is_valid=is_valid, has_dwelling_below=True, thermal_transmittence=None, thermal_transmittence_unit=None, to_unheated_space=to_unheated_space, - assumed=assumed + to_external_air=to_external_air, + is_suspended=is_suspended, + is_solid=is_solid, + assumed=assumed, + insulation_thickness=insulation_thickness ) - thermal_transmittence, thermal_transmittence_unit = None, None - if "insulated" in description_lower: - bh + if "insulation" in description_lower or "insulated" in description_lower: + insulation_thickness = self._find_insulation_thickness( + description_lower, to_unheated_space, to_external_air, is_suspended, is_solid + ) elif "thermal transmittance" in description_lower: thermal_transmittence, thermal_transmittence_unit = extract_thermal_transmittence(description_lower) return self._make_clean_output( + is_valid=is_valid, has_dwelling_below=False, thermal_transmittence=thermal_transmittence, thermal_transmittence_unit=thermal_transmittence_unit, to_unheated_space=to_unheated_space, - assumed=assumed + to_external_air=to_external_air, + is_suspended=is_suspended, + is_solid=is_solid, + assumed=assumed, + insulation_thickness=insulation_thickness ) @classmethod - def _find_insulation_thickness(cls, description_lower, to_unheated_space): + def _find_insulation_thickness(cls, description_lower, to_unheated_space, to_external_air, is_suspended, is_solid): - if to_unheated_space: - desc_split = description_lower.split("to unheated space,")[-1].strip().split("(assumed)")[0].strip() + if to_unheated_space | to_external_air | is_suspended | is_solid: + if to_unheated_space: + split_on = "to unheated space," + elif to_external_air: + split_on = "to external air," + elif is_suspended: + split_on = "suspended," + elif is_solid: + split_on = "solid," + else: + raise NotImplementedError("Not handled this 2") + desc_split = description_lower.split(split_on)[-1].strip().split("(assumed)")[0].strip() return search_split_description(desc_split) + raise NotImplementedError("Not handled this") + @staticmethod def _make_clean_output( - has_dwelling_below, thermal_transmittence, thermal_transmittence_unit, to_unheated_space, assumed + is_valid, + has_dwelling_below, + thermal_transmittence, + thermal_transmittence_unit, + to_unheated_space, + to_external_air, + is_suspended, + is_solid, + assumed, + insulation_thickness ) -> Dict[str, Union[str, bool, int, None]]: + """ + + :param is_valid: + :param has_dwelling_below: + :param thermal_transmittence: + :param thermal_transmittence_unit: + :param to_unheated_space: + :param to_external_air: + :param is_suspended: + :param is_solid: + :param assumed: + :param insulation_thickness: + :return: + """ return { + "is_valid": is_valid, "has_dwelling_below": has_dwelling_below, "thermal_transmittence": thermal_transmittence, "thermal_transmittence_unit": thermal_transmittence_unit, "to_unheated_space": to_unheated_space, - "assumed": assumed + "to_external_air": to_external_air, + "is_suspended": is_suspended, + "is_solid": is_solid, + "assumed": assumed, + "insulation_thickness": insulation_thickness } diff --git a/epc_data/cleaning/cleaning_utils.py b/epc_data/cleaning/cleaning_utils.py index ec600bd4..a264b387 100644 --- a/epc_data/cleaning/cleaning_utils.py +++ b/epc_data/cleaning/cleaning_utils.py @@ -36,8 +36,16 @@ def search_split_description(desc: str) -> str: :param desc: Description to be searched. :return: Result of the search. """ - if desc == "insulated": - return "average" - if desc == "limited": - return "below average" + outputs = { + "insulated": "average", + "limited": "below average", + "no insulation": "none", + "limited insulation": "below average", + } + + out = outputs.get(desc, None) + + if out: + return out + raise NotImplementedError("Handle me") diff --git a/epc_data/requirements.txt b/epc_data/requirements.txt index 908ce76c..b8400828 100644 --- a/epc_data/requirements.txt +++ b/epc_data/requirements.txt @@ -3,4 +3,5 @@ python-dotenv tqdm pandas mypy -pytest \ No newline at end of file +pytest +mock \ No newline at end of file diff --git a/epc_data/tests/test_clean_floor.py b/epc_data/tests/test_clean_floor.py new file mode 100644 index 00000000..0c55b615 --- /dev/null +++ b/epc_data/tests/test_clean_floor.py @@ -0,0 +1,72 @@ +import pytest +from epc_data.tests.test_data.EpcClean_test_floor_cases import clean_floor_cases +from epc_data.cleaning.Floor import CleanFloor +from unittest.mock import patch + + +class TestEpcClean: + class TestCleanFloor: + + @patch('epc_data.cleaning.cleaning_utils.search_split_description') + def test_find_insulation_thickness_to_unheated_space(self, mock_search_split_description): + # Set up the mock to return a specific value + mock_search_split_description.return_value = 'average' + + # clean_floor = CleanFloor('description to unheated space') + insulation_thickness = CleanFloor._find_insulation_thickness( + 'to unheated space, insulated', True, False, False, False + ) + + assert insulation_thickness == 'average' + + @patch('epc_data.cleaning.cleaning_utils.search_split_description') + def test_find_insulation_thickness_to_external_air(self, mock_search_split_description): + # Set up the mock to return a specific value + mock_search_split_description.return_value = 'below average' + + # clean_floor = CleanFloor('To external air, limited insulation') + insulation_thickness = CleanFloor._find_insulation_thickness( + 'to external air, limited insulation', False, True, False, False + ) + + assert insulation_thickness == 'below average' + + @patch('epc_data.cleaning.cleaning_utils.search_split_description') + def test_find_insulation_thickness_is_suspended(self, mock_search_split_description): + # Set up the mock to return a specific value + mock_search_split_description.return_value = 'none' + + # clean_floor = CleanFloor('description suspended') + insulation_thickness = CleanFloor._find_insulation_thickness( + 'suspended, no insulation', False, False, True, False + ) + + assert insulation_thickness == 'none' + + @patch('epc_data.cleaning.cleaning_utils.search_split_description') + def test_find_insulation_thickness_is_solid(self, mock_search_split_description): + # Set up the mock to return a specific value + mock_search_split_description.return_value = 'none' + + # clean_floor = CleanFloor('description solid') + insulation_thickness = CleanFloor._find_insulation_thickness( + 'solid, no insulation (assumed)', False, False, False, True + ) + + assert insulation_thickness == 'none' + + def test_find_insulation_thickness_not_handled(self): + clean_floor = CleanFloor('description not handled') + with pytest.raises(NotImplementedError): + clean_floor._find_insulation_thickness( + 'description not handled', False, False, False, False + ) + + def test_clean_floor(self): + for test_case in clean_floor_cases: + result = CleanFloor(test_case['original_description']).clean() + # Ensure the output ordering is correct + expected_result = {key: test_case[key] for key in result.keys()} + expected_result["desc"] = test_case["original_description"] + result["desc"] = test_case["original_description"] + assert result == expected_result diff --git a/epc_data/tests/test_cleaning_utils.py b/epc_data/tests/test_cleaning_utils.py index dd9e4444..d7d867ac 100644 --- a/epc_data/tests/test_cleaning_utils.py +++ b/epc_data/tests/test_cleaning_utils.py @@ -10,5 +10,8 @@ def test__extract_thermal_transmittence(): def test__search_split_roof_description(): assert search_split_description("insulated") == "average" assert search_split_description("limited") == "below average" + assert search_split_description("no insulation") == "none" + assert search_split_description("limited insulation") == "below average" + with pytest.raises(NotImplementedError): search_split_description("unknown") diff --git a/epc_data/tests/test_data/EpcClean_test_floor_cases.py b/epc_data/tests/test_data/EpcClean_test_floor_cases.py new file mode 100644 index 00000000..10670709 --- /dev/null +++ b/epc_data/tests/test_data/EpcClean_test_floor_cases.py @@ -0,0 +1,241 @@ +clean_floor_cases = [ + {'original_description': 'Average thermal transmittance 0.11 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.11, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.19 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.19, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.10 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.1, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.12 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.12, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.90 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.9, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.24 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.24, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.30 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.3, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.14 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.14, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.29 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.29, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': '(other premises below)', 'is_valid': True, 'has_dwelling_below': True, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'To external air, insulated (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': True, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'average'}, + {'original_description': 'Average thermal transmittance 0.63 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.63, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Suspended, no insulation (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': True, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'none'}, + {'original_description': 'Average thermal transmittance 0.08 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.08, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.17 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.17, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Solid, insulated', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': True, 'assumed': False, + 'insulation_thickness': 'average'}, + {'original_description': 'Average thermal transmittance 0.44 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.44, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.13 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.13, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.07 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.07, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Solid, limited insulation (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': True, 'assumed': True, + 'insulation_thickness': 'below average'}, + {'original_description': 'Average thermal transmittance 0.42 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.42, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.35 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.35, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.36 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.36, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.23 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.23, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.21 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.21, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.20 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.2, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.66 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.66, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.15 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.15, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.28 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.28, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.43 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.43, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.59 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.59, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'To external air, limited insulation (assumed)', 'is_valid': True, + 'has_dwelling_below': False, 'thermal_transmittence': None, 'thermal_transmittence_unit': None, + 'to_unheated_space': False, 'to_external_air': True, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'below average'}, + {'original_description': 'Average thermal transmittance 0.34 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.34, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.47 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.47, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'To external air, no insulation (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': True, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'none'}, + {'original_description': 'Average thermal transmittance 0.48 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.48, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.32 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.32, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.50 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.5, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.09 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.09, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.33 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.33, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.25 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.25, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.72 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.72, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.55 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.55, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': '(another dwelling below)', 'is_valid': True, 'has_dwelling_below': True, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.18 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.18, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.16 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.16, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'To unheated space, limited insulation (assumed)', 'is_valid': True, + 'has_dwelling_below': False, 'thermal_transmittence': None, 'thermal_transmittence_unit': None, + 'to_unheated_space': True, 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'below average'}, + {'original_description': 'Suspended, insulated', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': True, 'is_solid': False, 'assumed': False, + 'insulation_thickness': 'average'}, + {'original_description': 'Solid, insulated (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': True, 'assumed': True, + 'insulation_thickness': 'average'}, + {'original_description': 'Average thermal transmittance 0.31 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.31, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Solid, no insulation (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': True, 'assumed': True, + 'insulation_thickness': 'none'}, + {'original_description': 'Average thermal transmittance 0.22 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.22, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'To unheated space, no insulation (assumed)', 'is_valid': True, + 'has_dwelling_below': False, 'thermal_transmittence': None, 'thermal_transmittence_unit': None, + 'to_unheated_space': True, 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'none'}, + {'original_description': 'Average thermal transmittance 0.27 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.27, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Suspended, limited insulation (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': True, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'below average'}, + {'original_description': 'To unheated space, insulated', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': True, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': 'average'}, + {'original_description': 'To unheated space, insulated (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': True, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'average'}, + {'original_description': 'Average thermal transmittance 0.05 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.05, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Average thermal transmittance 0.49 W/m-¦K', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': 0.49, 'thermal_transmittence_unit': 'w/m-¦k', 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': False, 'is_solid': False, 'assumed': False, + 'insulation_thickness': None}, + {'original_description': 'Suspended, insulated (assumed)', 'is_valid': True, 'has_dwelling_below': False, + 'thermal_transmittence': None, 'thermal_transmittence_unit': None, 'to_unheated_space': False, + 'to_external_air': False, 'is_suspended': True, 'is_solid': False, 'assumed': True, + 'insulation_thickness': 'average'}]