added further categories and modifying A rated boiler efficiency categories

This commit is contained in:
Khalim Conn-Kowlessar 2026-02-03 16:51:03 +00:00
parent 2331228ff6
commit 4de7dafccb
2 changed files with 139 additions and 35 deletions

View file

@ -5,6 +5,7 @@ class EpcFuel(Enum):
electricity_not_community = "electricity (not community)" electricity_not_community = "electricity (not community)"
lpg_not_community = "LPG (not community)" lpg_not_community = "LPG (not community)"
mains_gas_not_community = "mains gas (not community)" mains_gas_not_community = "mains gas (not community)"
oil_not_community = "oil (not community)"
class EpcHeatingControls(Enum): class EpcHeatingControls(Enum):
@ -17,3 +18,4 @@ class EpcHeatingSystems(Enum):
boiler_and_radiators_electric = "Boiler and radiators, electric" boiler_and_radiators_electric = "Boiler and radiators, electric"
boiler_and_radiators_lpg = "Boiler and radiators, LPG" boiler_and_radiators_lpg = "Boiler and radiators, LPG"
boiler_radiators_mains_gas = "Boiler and radiators, mains gas" boiler_radiators_mains_gas = "Boiler and radiators, mains gas"
boiler_radiators_oil = "Boiler and radiators, oil"

View file

@ -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 # 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 # 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 # 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 # Boiler ratings based on efficiency
# 90%+ = A # 90%+ = A
@ -487,72 +487,173 @@ agg = data.groupby(['Heating', 'Boiler Efficiency', 'Main Fuel', 'Controls Adequ
# <60% = G # <60% = G
heating_map = { heating_map = {
# 0
('Boilers', 'A', 'ElectricityNotCommunity', 'Optimal'): ( ('Boilers', 'A', 'ElectricityNotCommunity', 'Optimal'): (
EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, 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
), ),
# 1
('Boilers', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): ( ('Boilers', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE
), ),
# 2
('Boilers', 'A', 'ElectricityNotCommunity', 'Top Spec'): ( ('Boilers', 'A', 'ElectricityNotCommunity', 'Top Spec'): (
EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community, 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
), ),
# 3
('Boilers', 'A', 'LPGNotCommunity', 'Optimal'): ( ('Boilers', 'A', 'LPGNotCommunity', 'Optimal'): (
EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community, 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
), ),
# 4
('Boilers', 'A', 'MainsGasNotCommunity', 'Optimal'): ( ('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 EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD
), ),
# 5
('Boilers', 'A', 'MainsGasNotCommunity', 'Sub Optimal'): ( ('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 EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE
), ),
# 6
('Boilers', 'A', 'MainsGasNotCommunity', 'Top Spec'): ( ('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 EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD
), ),
# 7
('Boilers', 'B', 'MainsGasNotCommunity', 'Optimal'): ( ('Boilers', 'B', 'MainsGasNotCommunity', 'Optimal'): (
EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, 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
), ),
# 8
('Boilers', 'B', 'MainsGasNotCommunity', 'Sub Optimal'): ( ('Boilers', 'B', 'MainsGasNotCommunity', 'Sub Optimal'): (
EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE
), ),
# 9
('Boilers', 'B', 'MainsGasNotCommunity', 'Top Spec'): ( ('Boilers', 'B', 'MainsGasNotCommunity', 'Top Spec'): (
EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community, 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
), ),
('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): None, # 10
('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): None, ('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): (
('Boilers', 'C', 'ElectricityNotCommunity', 'Top Spec'): None, EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): None, EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD
('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): None, ),
('Boilers', 'C', 'MainsGasNotCommunity', 'Optimal'): None, # 11
('Boilers', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): None, ('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): (
('Boilers', 'C', 'MainsGasNotCommunity', 'Top Spec'): None, EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
('Boilers', 'C', 'OilNotCommunity', 'Optimal'): None, EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE
('Boilers', 'C', 'OilNotCommunity', 'Sub Optimal'): None, ),
('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): None, # 12
('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): None, ('Boilers', 'C', 'ElectricityNotCommunity', 'Top Spec'): (
('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): None, EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
('Boilers', 'D', 'MainsGasNotCommunity', 'Top Spec'): None, EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD
('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): None, ),
('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): None, # 13
('Boilers', 'E', 'MainsGasNotCommunity', 'Sub Optimal'): None, ('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): (
('Boilers', 'E', 'MainsGasNotCommunity', 'Top Spec'): None, EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community,
('Boilers', 'E', 'OilNotCommunity', 'Optimal'): None, EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD
('Boilers', 'E', 'OilNotCommunity', 'Sub Optimal'): None, ),
('Boilers', 'F', 'MainsGasNotCommunity', 'Optimal'): None, # 14
('Boilers', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): None, ('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): (
('Boilers', 'F', 'MainsGasNotCommunity', 'Top Spec'): None, EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community,
('Boilers', 'G', 'MainsGasNotCommunity', 'Optimal'): None, EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE
('Boilers', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): None, ),
# 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, ('Boilers', 'G', 'MainsGasNotCommunity', 'Top Spec'): None,
('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): None, ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): None,
('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Sub 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 ('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[ example_data = data[
(data["Heating"] == example[0]) & (data["Boiler Efficiency"] == example[1]) & (data["Main Fuel"] == example[2]) & ( (data["Heating"] == example[0]) & (data["Boiler Efficiency"] == example[1]) & (data["Main Fuel"] == example[2]) & (
data["Controls Adequacy"] == example[3]) data["Controls Adequacy"] == example[3])
] ]
example_data["UPRN"].values.tolist() print(example_data["UPRN"].values.tolist())
agg_tuples = { agg_tuples = {
(row['Heating'], row['Boiler Efficiency'], row['Main Fuel']): None for _, row in agg.iterrows() (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["LODGEMENT_DATE"] > "2025-07-01"]["GLAZED_AREA"].value_counts()
epcs[ epcs[
(epcs["MAINHEAT_DESCRIPTION"] == EpcHeatingSystems.boiler_radiators_mains_gas.value) & ( (epcs["MAINHEAT_DESCRIPTION"] == "Boiler and radiators, mains gas")
epcs["LODGEMENT_DATE"] > "2025-07-01") ]["MAINHEAT_ENERGY_EFF"].value_counts()
]["MAINHEAT_ENERGY_EFF"].value_counts()
z = data[data["Address 1"].str.lower().str.contains("133, mayo")]
# ------------ Fuel ------------ # ------------ Fuel ------------