From 4de7dafccbeefefbd3139dbcbe18959fdcde7798 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 3 Feb 2026 16:51:03 +0000 Subject: [PATCH] added further categories and modifying A rated boiler efficiency categories --- backend/onboarders/epc/placeholder.py | 2 + backend/onboarders/parity.py | 172 ++++++++++++++++++++------ 2 files changed, 139 insertions(+), 35 deletions(-) diff --git a/backend/onboarders/epc/placeholder.py b/backend/onboarders/epc/placeholder.py index 2d52d4ad..70a4f9f9 100644 --- a/backend/onboarders/epc/placeholder.py +++ b/backend/onboarders/epc/placeholder.py @@ -5,6 +5,7 @@ class EpcFuel(Enum): electricity_not_community = "electricity (not community)" lpg_not_community = "LPG (not community)" mains_gas_not_community = "mains gas (not community)" + oil_not_community = "oil (not community)" class EpcHeatingControls(Enum): @@ -17,3 +18,4 @@ class EpcHeatingSystems(Enum): 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" diff --git a/backend/onboarders/parity.py b/backend/onboarders/parity.py index 3ca54cab..438ce215 100644 --- a/backend/onboarders/parity.py +++ b/backend/onboarders/parity.py @@ -475,7 +475,7 @@ agg = data.groupby(['Heating', 'Boiler Efficiency', 'Main Fuel', 'Controls Adequ # For sub optimal heating controls, we're going to make an assumption as to what the heating controls are # and the energy efficiency rating we prescribe here may not be accurate. We therefore use this as an upper limit # as opposed to a guaranteed efficiency rating. To stress, this is only relevant for sub optimal heating -# controls. +# controls. E.g. it may be programmer and room thermostat # Boiler ratings based on efficiency # 90%+ = A @@ -487,72 +487,173 @@ agg = data.groupby(['Heating', 'Boiler Efficiency', 'Main Fuel', 'Controls Adequ # <60% = G 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 ), + # 1 ('Boilers', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, EpcHeatingControls.programmers_trvs_bypass, 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 ), + # 3 ('Boilers', 'A', 'LPGNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD ), + # 4 ('Boilers', 'A', 'MainsGasNotCommunity', 'Optimal'): ( - EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD ), + # 5 ('Boilers', 'A', 'MainsGasNotCommunity', 'Sub Optimal'): ( - EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE ), + # 6 ('Boilers', 'A', 'MainsGasNotCommunity', 'Top Spec'): ( - EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community, EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD ), + # 7 ('Boilers', 'B', 'MainsGasNotCommunity', 'Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD ), + # 8 ('Boilers', 'B', 'MainsGasNotCommunity', 'Sub Optimal'): ( EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, EpcHeatingControls.programmers_trvs_bypass, 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 ), - ('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): None, - ('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'C', 'ElectricityNotCommunity', 'Top Spec'): None, - ('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): None, - ('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'C', 'MainsGasNotCommunity', 'Optimal'): None, - ('Boilers', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'C', 'MainsGasNotCommunity', 'Top Spec'): None, - ('Boilers', 'C', 'OilNotCommunity', 'Optimal'): None, - ('Boilers', 'C', 'OilNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): None, - ('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): None, - ('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'D', 'MainsGasNotCommunity', 'Top Spec'): None, - ('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): None, - ('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): None, - ('Boilers', 'E', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'E', 'MainsGasNotCommunity', 'Top Spec'): None, - ('Boilers', 'E', 'OilNotCommunity', 'Optimal'): None, - ('Boilers', 'E', 'OilNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'F', 'MainsGasNotCommunity', 'Optimal'): None, - ('Boilers', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): None, - ('Boilers', 'F', 'MainsGasNotCommunity', 'Top Spec'): None, - ('Boilers', 'G', 'MainsGasNotCommunity', 'Optimal'): None, - ('Boilers', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): None, + # 10 + ('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + # 11 + ('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.programmers_trvs_bypass, 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 + ), + # 13 + ('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + # 14 + ('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, + EpcHeatingControls.programmers_trvs_bypass, 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 + ), + # 16 + ('Boilers', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmers_trvs_bypass, 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 + ), + # 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 + ), + # 19 + ('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): ( + EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, + EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD + ), + # 20 + ('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + # 21 + ('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + ), + # 22 + ('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 + ), + # 23 + ('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + # 24 + ('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + # 25 + ('Boilers', 'E', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + ), + ('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 + ), + ('Boilers', 'E', 'OilNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + ('Boilers', 'E', 'OilNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + ), + ('Boilers', 'F', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + ('Boilers', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + ), + ('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 + ), + ('Boilers', 'G', 'MainsGasNotCommunity', 'Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD + ), + ('Boilers', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): ( + EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, + EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE + ), ('Boilers', 'G', 'MainsGasNotCommunity', 'Top Spec'): None, ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): None, ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): None, @@ -575,14 +676,14 @@ heating_map = { ('Warm Air (not heat pump)', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): None } -example = list(heating_map.keys())[5] +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]) ] -example_data["UPRN"].values.tolist() +print(example_data["UPRN"].values.tolist()) agg_tuples = { (row['Heating'], row['Boiler Efficiency'], row['Main Fuel']): None for _, row in agg.iterrows() @@ -593,9 +694,10 @@ 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"] == EpcHeatingSystems.boiler_radiators_mains_gas.value) & ( - epcs["LODGEMENT_DATE"] > "2025-07-01") - ]["MAINHEAT_ENERGY_EFF"].value_counts() + (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 ------------