diff --git a/backend/onboarders/epc/placeholder.py b/backend/onboarders/epc/placeholder.py index 70a4f9f9..64807c49 100644 --- a/backend/onboarders/epc/placeholder.py +++ b/backend/onboarders/epc/placeholder.py @@ -6,6 +6,8 @@ class EpcFuel(Enum): lpg_not_community = "LPG (not community)" mains_gas_not_community = "mains gas (not community)" oil_not_community = "oil (not community)" + manufactured_smokeless_fuel = "Solid fuel: manufactured smokeless fuel" + smokeless_coal = "smokeless coal" class EpcHeatingControls(Enum): @@ -13,9 +15,43 @@ class EpcHeatingControls(Enum): programmers_trvs_bypass = "Programmer, TRVs and bypass" time_and_temperature_zone_control = "Time and temperature zone control" + # Room heaters + programmer_and_appliance_thermostats = "Programmer and appliance thermostats" + appliance_thermostats = "Appliance thermostats" + + # Storage heaters + automatic_charge_control = "Automatic charge control" + manual_charge_control = "Manual charge control" + + # Warm air + programmer_and_atleast_two_room_thermostats = "Programmer and at least two room thermostats" + class EpcHeatingSystems(Enum): + # boiler and radiators boiler_and_radiators_electric = "Boiler and radiators, electric" boiler_and_radiators_lpg = "Boiler and radiators, LPG" boiler_radiators_mains_gas = "Boiler and radiators, mains gas" boiler_radiators_oil = "Boiler and radiators, oil" + # underfloor + electric_underfloor_heating = "Electric underfloor heating" + # ashp + air_to_air_ashp = "Air source heat pump, warm air, electric" + ashp_radiators_electric = "Air source heat pump, radiators, electric" + # Room heaters + room_heaters_electric = "Room heaters, electric" + room_heaters_mains_gas = "Room heaters, mains gas" + room_heaters_smokeless_fuel = "Room heaters, smokeless fuel" + room_heaters_coal = "Room heaters, coal" + # Storage heaters + electric_storage_heaters = "Electric storage heaters" + # Warm air + warm_air_electricaire = "Warm air, Electricaire" + warm_air_mains_gas = "Warm air, mains gas" + + +class EpcHotWaterSystems(Enum): + # from primary heating system + from_main_system = "From main system" + # Common for heater-based systems, e.g. room heaters or storage heaters + electric_immersion_off_peak = "Electric immersion, off-peak" diff --git a/backend/onboarders/parity.py b/backend/onboarders/parity.py index 438ce215..88e548c2 100644 --- a/backend/onboarders/parity.py +++ b/backend/onboarders/parity.py @@ -7,7 +7,7 @@ from backend.onboarders.mappings.age_band import parity_map as age_band_map from backend.onboarders.mappings.built_form import parity_map as built_form_map from backend.onboarders.epc_descriptions import EpcWallDescriptions, EpcConstructionAgeBand, EpcEfficiency, \ WALL_DESCRIPTION_EFFICIENCIES, EpcRoofDescriptions, resolve_roof_efficiency, EpcFloorDescriptions -from backend.onboarders.epc.placeholder import EpcFuel, EpcHeatingControls, EpcHeatingSystems +from backend.onboarders.epc.placeholder import EpcFuel, EpcHeatingControls, EpcHeatingSystems, EpcHotWaterSystems from backend.onboarders.mappings.as_built_wall_classifiers import AS_BUILT_WALL_CLASSIFIERS from backend.onboarders.mappings.as_built_roof_classifiers import AS_BUILT_ROOF_CLASSIFIERS from backend.onboarders.mappings.as_built_floor_classifiers import unknown_floor_as_built, unknown_floor_retrofitted, \ @@ -460,9 +460,8 @@ data[["landlord_windows_description", # 3) landlord_multi_glaze_proportion - maybe don't need to store this, same for glazing type and area -# ------------ Heating ------------ +# ------------ Heating, fuel, controls & hot water ------------ -agg = data.groupby(['Heating', 'Boiler Efficiency', 'Main Fuel', 'Controls Adequacy']).size().reset_index(name='counts') # We map to: # 1) Heating description @@ -470,6 +469,8 @@ agg = data.groupby(['Heating', 'Boiler Efficiency', 'Main Fuel', 'Controls Adequ # 3) Fuel type # 4) Heating controls # 5) Heating controls efficiency +# 6) Hot water system +# 7) Hot water efficiency # TODO - when mapping heating controls, we should check the existing heating controls and the efficiency rating # For sub optimal heating controls, we're going to make an assumption as to what the heating controls are @@ -490,229 +491,349 @@ heating_map = { # 0 ('Boilers', 'A', 'ElectricityNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 1 ('Boilers', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 2 ('Boilers', 'A', 'ElectricityNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 3 ('Boilers', 'A', 'LPGNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 4 ('Boilers', 'A', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 5 ('Boilers', 'A', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 6 ('Boilers', 'A', 'MainsGasNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 7 ('Boilers', 'B', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 8 ('Boilers', 'B', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 9 ('Boilers', 'B', 'MainsGasNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 10 ('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 11 ('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 12 ('Boilers', 'C', 'ElectricityNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 13 ('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 14 ('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 15 ('Boilers', 'C', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 16 ('Boilers', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 17 ('Boilers', 'C', 'MainsGasNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), - # 18 - oil boilers have an average efficiency rating ('Boilers', 'C', 'OilNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD - ), - # 18 - ('Boilers', 'C', 'OilNotCommunity', 'Sub Optimal'): ( - EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 19 - ('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): ( + ('Boilers', 'C', 'OilNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 20 - ('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): ( - EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 21 - ('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): ( + ('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 22 - ('Boilers', 'D', 'MainsGasNotCommunity', 'Top Spec'): ( + ('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 23 - ('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): ( - EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ('Boilers', 'D', 'MainsGasNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 24 - ('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): ( - EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), # 25 + ('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 26 ('Boilers', 'E', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 27 ('Boilers', 'E', 'MainsGasNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 28 ('Boilers', 'E', 'OilNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 29 ('Boilers', 'E', 'OilNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 30 ('Boilers', 'F', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 31 ('Boilers', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 32 ('Boilers', 'F', 'MainsGasNotCommunity', 'Top Spec'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 33 ('Boilers', 'G', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), + # 34 ('Boilers', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, - EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE ), - ('Boilers', 'G', 'MainsGasNotCommunity', 'Top Spec'): None, - ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): None, - ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Top Spec'): None, - ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Optimal'): None, - ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Optimal'): None, - ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Top Spec'): None, - ('Room heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): None, - ('Room heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Room heaters', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Room heaters', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Room heaters', 'G', 'MainsGasNotCommunity', 'Optimal'): None, - ('Room heaters', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Room heaters', 'G', 'SmokelessCoal', 'Sub Optimal'): None, - ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): None, - ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Warm Air (not heat pump)', 'G', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Warm Air (not heat pump)', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): None + # 35 + ('Boilers', 'G', 'MainsGasNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.AVERAGE, EpcFuel.mains_gas_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 36 + ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 37 + ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 38 + ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 39 + ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.air_to_air_ashp, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 40 + ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.air_to_air_ashp, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 41 + ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 42 + ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 43 + ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD, + EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE + ), + # 44 + ('Room heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.room_heaters_electric, EpcEfficiency.POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_and_appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 45 + ('Room heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.room_heaters_electric, EpcEfficiency.POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 46 + ('Room heaters', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.AVERAGE, EpcFuel.mains_gas_not_community, + EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + # 47 - water done from here + ('Room heaters', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community, + EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Room heaters', 'G', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_and_appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Room heaters', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community, + EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Room heaters', 'G', 'SmokelessCoal', 'Sub Optimal'): ( + EpcHeatingSystems.room_heaters_smokeless_fuel, EpcEfficiency.VERY_POOR, EpcFuel.smokeless_coal, + EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.electric_storage_heaters, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.automatic_charge_control, EpcEfficiency.AVERAGE, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.electric_storage_heaters, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community, + EpcHeatingControls.manual_charge_control, EpcEfficiency.POOR, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Warm Air (not heat pump)', 'G', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.warm_air_electricaire, EpcEfficiency.GOOD, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_and_atleast_two_room_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ), + ('Warm Air (not heat pump)', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.warm_air_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_and_atleast_two_room_thermostats, EpcEfficiency.GOOD, + EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE + ) } -example = list(heating_map.keys())[25] - -example_data = data[ - (data["Heating"] == example[0]) & (data["Boiler Efficiency"] == example[1]) & (data["Main Fuel"] == example[2]) & ( - data["Controls Adequacy"] == example[3]) +# Apply the mapping +data[ + [ + "landlord_heating_description", + "landlord_heating_efficiency", + "landlord_fuel_type", + "landlord_heating_controls_description", + "landlord_heating_controls_efficiency", + "landlord_hot_water_system_description", + "landlord_hot_water_efficiency" ] - -print(example_data["UPRN"].values.tolist()) - -agg_tuples = { - (row['Heating'], row['Boiler Efficiency'], row['Main Fuel']): None for _, row in agg.iterrows() -} -epcs = pd.read_csv("/Users/khalimconn-kowlessar/Downloads/domestic-E08000003-Manchester/certificates.csv") - -epcs[epcs["LODGEMENT_DATE"] > "2025-07-01"]["WINDOWS_DESCRIPTION"].value_counts() -epcs[epcs["LODGEMENT_DATE"] > "2025-07-01"]["GLAZED_AREA"].value_counts() - -epcs[ - (epcs["MAINHEAT_DESCRIPTION"] == "Boiler and radiators, mains gas") -]["MAINHEAT_ENERGY_EFF"].value_counts() - -z = data[data["Address 1"].str.lower().str.contains("133, mayo")] - -# ------------ Fuel ------------ - -# ------------ Heating Controls ------------ +] = data[ + [ + "Heating", + "Boiler Efficiency", + "Main Fuel", + "Controls Adequacy" + ] +].progress_apply(tuple, axis=1).map(heating_map).progress_apply(pd.Series) # ------------ Floor Area ------------ -# TODO: Convert everything to values - -# Variables we want to map -# 'Org Ref', 'Address 1', 'Address 2', 'Address 3', 'Postcode', -# 'Glazing', 'Heating', -# 'Boiler Efficiency', 'Main Fuel', 'Controls Adequacy', 'UPRN', -# 'Total Floor Area (m2)' - - -data["Glazing"].value_counts() - -data["Glazing"].value_counts() +# This is just a rename +data = data.rename( + columns={"Total Floor Area (m2)": "landlord_total_floor_area_m2"} +)