structure[C for parity largely complete

This commit is contained in:
Khalim Conn-Kowlessar 2026-02-05 09:37:05 +00:00
parent ae02561cd0
commit 87ebc672b8
4 changed files with 36 additions and 26 deletions

View file

@ -1,4 +1,5 @@
from backend.onboarders.epc_descriptions import EpcConstructionAgeBand, EpcFloorDescriptions from datatypes.epc.construction_age_band import EpcConstructionAgeBand
from datatypes.epc.floor import EpcFloorDescriptions
def unknown_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions: def unknown_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions:
@ -25,7 +26,7 @@ def unknown_floor_retrofitted(age_band: EpcConstructionAgeBand) -> EpcFloorDescr
return EpcFloorDescriptions.suspended_insulated return EpcFloorDescriptions.suspended_insulated
def solid_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions: def map_solid_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions:
year = age_band.start_year() year = age_band.start_year()
if year >= 2003: if year >= 2003:
@ -35,7 +36,7 @@ def solid_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptio
return EpcFloorDescriptions.solid_no_insulation_assumed return EpcFloorDescriptions.solid_no_insulation_assumed
def suspended_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions: def map_suspended_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescriptions:
year = age_band.start_year() year = age_band.start_year()
if year >= 2003: if year >= 2003:
@ -44,3 +45,15 @@ def suspended_floor_as_built(age_band: EpcConstructionAgeBand) -> EpcFloorDescri
return EpcFloorDescriptions.suspended_limited_insulation_assumed return EpcFloorDescriptions.suspended_limited_insulation_assumed
return EpcFloorDescriptions.suspended_no_insulation_assumed return EpcFloorDescriptions.suspended_no_insulation_assumed
as_built_floor_classifiers = {
"Solid": map_solid_floor_as_built,
"SuspendedTimber": map_suspended_floor_as_built,
"SuspendedNotTimber": map_suspended_floor_as_built,
}
unknown_as_built_floor_classifiers = {
"RetroFitted": unknown_floor_retrofitted,
"AsBuilt": unknown_floor_as_built,
}

View file

@ -1,7 +1,7 @@
from backend.onboarders.epc_descriptions import EpcConstructionAgeBand, EpcRoofDescriptions from backend.onboarders.epc_descriptions import EpcConstructionAgeBand, EpcRoofDescriptions
def classify_flat_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDescriptions: def map_flat_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDescriptions:
""" """
For a flat, as built roof, these are the breakdowns: For a flat, as built roof, these are the breakdowns:
@ -26,7 +26,7 @@ def classify_flat_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDescriptions:
return EpcRoofDescriptions.flat_no_insulation return EpcRoofDescriptions.flat_no_insulation
def classify_sloping_ceiling_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDescriptions: def map_sloping_ceiling_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDescriptions:
""" """
For a sloping ceiling, as built roof, these are the breakdowns: For a sloping ceiling, as built roof, these are the breakdowns:
2023 onwards Sloping pitched, insulated 2023 onwards Sloping pitched, insulated
@ -48,8 +48,8 @@ def classify_sloping_ceiling_roof(age_band: EpcConstructionAgeBand) -> EpcRoofDe
return EpcRoofDescriptions.sloping_pitched_no_insulation return EpcRoofDescriptions.sloping_pitched_no_insulation
AS_BUILT_ROOF_CLASSIFIERS = { as_built_roof_classifiers = {
# Only need to apply this to flat and sloping ceiling roofs # Only need to apply this to flat and sloping ceiling roofs
"Flat": classify_flat_roof, "Flat": map_flat_roof,
"PitchedWithSlopingCeiling": classify_sloping_ceiling_roof, "PitchedWithSlopingCeiling": map_sloping_ceiling_roof,
} }

View file

@ -101,7 +101,7 @@ def map_cob_wall_insulation(age_band: EpcConstructionAgeBand):
) )
AS_BUILT_WALL_CLASSIFIERS = { as_built_wall_classifiers = {
"Cavity": map_cavity_wall_insulation, "Cavity": map_cavity_wall_insulation,
"Solid Brick": map_solid_wall_insulation, "Solid Brick": map_solid_wall_insulation,
"Timber Frame": map_timber_frame_wall_insulation, "Timber Frame": map_timber_frame_wall_insulation,

View file

@ -8,11 +8,11 @@ from backend.onboarders.mappings.parity.built_form import parity_map as built_fo
from backend.onboarders.mappings.parity.walls import wall_map, wall_unknown_age_fallback from backend.onboarders.mappings.parity.walls import wall_map, wall_unknown_age_fallback
from backend.onboarders.epc_descriptions import EpcWallDescriptions, EpcConstructionAgeBand, EpcEfficiency, \ from backend.onboarders.epc_descriptions import EpcWallDescriptions, EpcConstructionAgeBand, EpcEfficiency, \
WALL_DESCRIPTION_EFFICIENCIES, resolve_roof_efficiency WALL_DESCRIPTION_EFFICIENCIES, resolve_roof_efficiency
from backend.onboarders.mappings.parity.as_built_wall_classifiers import AS_BUILT_WALL_CLASSIFIERS from backend.onboarders.mappings.parity.as_built_wall_classifiers import as_built_wall_classifiers
from backend.onboarders.mappings.parity.as_built_roof_classifiers import AS_BUILT_ROOF_CLASSIFIERS from backend.onboarders.mappings.parity.as_built_roof_classifiers import as_built_roof_classifiers
from backend.onboarders.mappings.parity.as_built_floor_classifiers import unknown_floor_as_built, \ from backend.onboarders.mappings.parity.as_built_floor_classifiers import (
unknown_floor_retrofitted, \ as_built_floor_classifiers, unknown_as_built_floor_classifiers
solid_floor_as_built, suspended_floor_as_built )
from datatypes.epc.roof import EpcRoofDescriptions from datatypes.epc.roof import EpcRoofDescriptions
from datatypes.epc.floor import EpcFloorDescriptions from datatypes.epc.floor import EpcFloorDescriptions
from onboarders.mappings.parity.roof import roof_map, roof_unknown_age_fallback from onboarders.mappings.parity.roof import roof_map, roof_unknown_age_fallback
@ -58,7 +58,7 @@ class ParityOnboarder(OnboarderBase):
self.assert_no_nulls(self.data, self.landlord_built_form) self.assert_no_nulls(self.data, self.landlord_built_form)
@staticmethod @staticmethod
def _fill_as_built(row: pd.Series) -> EpcWallDescriptions | None: def _fill_wall_as_built(row: pd.Series) -> EpcWallDescriptions | None:
""" """
Utility function, used by map_wall_construction in parity transformation module Utility function, used by map_wall_construction in parity transformation module
:param row: row of input sustainability data, being transformed :param row: row of input sustainability data, being transformed
@ -75,7 +75,7 @@ class ParityOnboarder(OnboarderBase):
if pd.isnull(row.construction_age_band): if pd.isnull(row.construction_age_band):
return wall_unknown_age_fallback.get(wall_type) return wall_unknown_age_fallback.get(wall_type)
classifier = AS_BUILT_WALL_CLASSIFIERS.get(wall_type) classifier = as_built_wall_classifiers.get(wall_type)
if classifier is None: if classifier is None:
return None return None
@ -111,7 +111,7 @@ class ParityOnboarder(OnboarderBase):
.map(wall_map) .map(wall_map)
) )
self.data[self.landlord_wall_construction] = self.data.progress_apply(self._fill_as_built, axis=1) self.data[self.landlord_wall_construction] = self.data.progress_apply(self._fill_wall_as_built, axis=1)
# Sanity check # Sanity check
self.assert_no_nulls(self.data, self.landlord_wall_construction) self.assert_no_nulls(self.data, self.landlord_wall_construction)
@ -134,7 +134,7 @@ class ParityOnboarder(OnboarderBase):
roof_type = row["Roof Construction"] roof_type = row["Roof Construction"]
classifier = AS_BUILT_ROOF_CLASSIFIERS.get(roof_type) classifier = as_built_roof_classifiers.get(roof_type)
if classifier is None: if classifier is None:
raise NotImplementedError(f"No roof classifier for roof type '{roof_type}'") raise NotImplementedError(f"No roof classifier for roof type '{roof_type}'")
@ -214,17 +214,14 @@ class ParityOnboarder(OnboarderBase):
return EpcFloorDescriptions.unknown return EpcFloorDescriptions.unknown
# 3. Known floor types # 3. Known floor types
if floor_type == "Solid": if floor_type in ["Solid", "SuspendedTimber", "SuspendedNotTimber"]:
return solid_floor_as_built(age_band) classifier = as_built_floor_classifiers[floor_type]
return classifier(age_band)
if floor_type in {"SuspendedTimber", "SuspendedNotTimber"}:
return suspended_floor_as_built(age_band)
# 4. Unknown floor type # 4. Unknown floor type
if floor_type == "Unknown": if floor_type == "Unknown":
if insulation == "RetroFitted": classifier = unknown_as_built_floor_classifiers[insulation]
return unknown_floor_retrofitted(age_band) return classifier(age_band)
return unknown_floor_as_built(age_band)
# 5. Truly missing / garbage input # 5. Truly missing / garbage input
return EpcFloorDescriptions.unknown return EpcFloorDescriptions.unknown