handle no data for floors

This commit is contained in:
Khalim Conn-Kowlessar 2023-07-01 17:00:05 +01:00
parent 4a1a3fec14
commit 1bd69e8c61
4 changed files with 21 additions and 8 deletions

View file

@ -408,6 +408,7 @@ def handler():
# TODO: Add in the u-values for roofs rather than the description
# TODO: Add in the actual property features for walls, floors, roof, not just the u-value
# TODO: Think about how we use sap vs rdsap - should we add a feature in the model for transaction-type?
# TODO: Remove cases where descriptions have no data or are error cases
#
# property type looks okay - we're definitely low on the number of bungalows
# number-habitable-rooms & number-heated-rooms is unpopulated so pretty useless atm

View file

@ -7,20 +7,26 @@ class FloorAttributes(BaseUtility):
DWELLING_BELOW = ["another dwelling below", "other premises below"]
FLOOR_TYPES = ["assumed", "to unheated space", "to external air", "suspended", "solid"]
# For the short term, while we are still exploring the data, we maintain a list of error cases which
# we want to ignore and consider as no data.
OBSERVED_ERRORS = ["Conservatory"]
def __init__(self, description: str):
self.description: str = description.lower()
self.nodata = not description or description in self.DATA_ANOMALY_MATCHES
self.nodata = not description or description in self.DATA_ANOMALY_MATCHES or description in self.OBSERVED_ERRORS
if not description or not any(
rt in self.description for rt in self.FLOOR_TYPES + self.DWELLING_BELOW + ["average thermal transmittance"]
if not self.nodata and not any(
rt in self.description for rt in
self.FLOOR_TYPES + self.DWELLING_BELOW + ["average thermal transmittance"]
):
raise ValueError('Invalid description')
def process(self) -> Dict[str, Union[str, bool, int, None]]:
if self.nodata:
return {}
return {"no_data": True}
result: Dict[str, Union[float, str, bool, None]] = {}
description = self.description

View file

@ -15,7 +15,7 @@ class RoofAttributes(BaseUtility):
self.description: str = description.lower()
self.nodata = not description or description in self.DATA_ANOMALY_MATCHES
if not self.nodata and not any(
rt in self.description for rt in self.ROOF_TYPES + self.DWELLING_ABOVE + ["average thermal transmittance"]
):

View file

@ -12,8 +12,10 @@ class TestCleanFloor:
assert floor_attr.description == valid_description.lower()
# Test initialization with an empty description
with pytest.raises(ValueError):
FloorAttributes('')
empty = FloorAttributes('')
assert empty.nodata
output = empty.process()
assert output == {"no_data": True}
# Test initialization with a description that contains none of the keywords
with pytest.raises(ValueError):
@ -33,7 +35,6 @@ class TestCleanFloor:
def test_invalid_description(self):
# Test that invalid descriptions raise a ValueError
invalid_descriptions = [
"",
"invalid description",
"description with no known floor types or thermal transmittance",
]
@ -47,3 +48,8 @@ class TestCleanFloor:
invalid_description = 'description without keywords'
with pytest.raises(ValueError):
FloorAttributes(invalid_description)
def test_known_errors(self):
error_description = "Conservatory"
obj = FloorAttributes(error_description)
assert obj.nodata