Model/model_data/epc_attributes/MainheatAttributes.py
2023-09-08 13:08:54 +03:00

103 lines
4.3 KiB
Python

from model_data.BaseUtility import Definitions
from model_data.epc_attributes.attribute_utils import clean_description, process_part, switch_chars
from typing import Dict, Union
class MainHeatAttributes(Definitions):
HEAT_SYSTEMS = [
"boiler", "air source heat pump", "room heaters", "electric storage heaters", "warm air",
"electric underfloor heating", "electric ceiling heating", "community scheme",
"ground source heat pump", "no system present", "portable electric heaters",
"water source heat pump", "electric heat pump",
# "Micro-cogeneration", also known as micro combined heat and power (micro-CHP), is a technology that
# generates heat and electricity simultaneously from the same energy source in residential or commercial
# buildings. The main output of micro-CHP systems is heat, with electricity generation as a secondary output.
"micro-cogeneration",
"solar assisted heat pump",
"exhaust source heat pump",
"community heat pump",
]
FUEL_TYPES = ["electric", "mains gas", "wood logs", "LPG", "coal", "oil", "wood pellets", "anthracite",
"dual fuel mineral and wood", "smokeless fuel", "lpg"]
DISTRIBUTION_SYSTEMS = ["radiators", "fan coil units", "pipes in screed above insulation",
"pipes in insulated timber floor", "pipes in concrete slab"]
OTHERS = ["assumed", "electricaire", "assumed for most rooms"]
WELSH_TEXT = {
"bwyler a rheiddiaduron, nwy prif gyflenwad": "boiler and radiators, mains gas",
"st+¦r wresogyddion trydan": "electric storage heaters",
"bwyler a rheiddiaduron, olew": "boiler and radiators, oil",
"heat pumptrydan": "electric heat pump",
"bwyler a rheiddiaduron, trydan": "boiler and radiators, electric",
"bwyler a gwres dan y llawr, olew": "boiler and underfloor heating, oil"
}
REMAP = {
"electric ceiling": "electric ceiling heating",
"electric heat pumps": "electric heat pump",
}
def __init__(self, description: str):
self.description = switch_chars(description.lower())
self.description: str = clean_description(self.description)
# Remove special characters
self.nodata = not description or description in self.DATA_ANOMALY_MATCHES
translation = self.WELSH_TEXT.get(self.description)
if translation:
self.nodata = False
self.description = translation
remapped = []
for term in self.description.split(", "):
remap = self.REMAP.get(term)
if remap:
remapped.append(remap)
else:
remapped.append(term)
remapped = ", ".join(remapped)
self.description = remapped
if not description or not any(
rt in self.description for rt in
self.HEAT_SYSTEMS + self.FUEL_TYPES + self.DISTRIBUTION_SYSTEMS + self.OTHERS
):
raise ValueError('Invalid description')
def process(self) -> Dict[str, Union[str, bool]]:
result: Dict[str, Union[str, bool]] = {f'has_{ds.replace(" ", "_")}': False for ds in self.DISTRIBUTION_SYSTEMS}
result.update({f'has_{hs.replace(" ", "_")}': False for hs in self.HEAT_SYSTEMS})
result.update({f'has_{ft.replace(" ", "_")}': False for ft in self.FUEL_TYPES})
result.update({f'has_{ot.replace(" ", "_")}': False for ot in self.OTHERS})
result['has_underfloor_heating'] = False
if self.nodata:
return result
description = self.description.split(',')
# Process each part separately
for part in description:
part = part.strip() # remove leading/trailing white spaces
# Heating Systems
process_part(result, part, self.HEAT_SYSTEMS, 'has_')
# Fuel Types
process_part(result, part, self.FUEL_TYPES, 'has_')
# Distribution Systems
process_part(result, part, self.DISTRIBUTION_SYSTEMS, 'has_')
# Other epc_attributes
process_part(result, part, self.OTHERS, 'has_')
# Check for "underfloor" separately in the entire description
if "underfloor" in self.description:
result['has_underfloor_heating'] = True
return result