adding heating unit test coverage

This commit is contained in:
Khalim Conn-Kowlessar 2024-09-16 14:43:21 +01:00
parent 7e11584407
commit f86a7cb97d
2 changed files with 171 additions and 19 deletions

View file

@ -14,13 +14,6 @@ class HeatingRecommender:
"No system present, electric heaters assumed"
]
ELECTRIC_HEATING_DESCRIPTIONS = [
"Room heaters, electric",
"Electric storage heaters",
"Electric storage heaters, radiators",
"Portable electric heaters assumed for most rooms",
]
ROOM_HEATERS_DESCRIPTIONS = [
"Room heaters, mains gas", "Room heaters, electric", "Portable electric heaters assumed for most rooms",
]
@ -39,9 +32,7 @@ class HeatingRecommender:
self.heating_recommendations = []
self.heating_control_recommendations = []
self.has_electric_heating_description = self.property.main_heating["clean_description"] in (
self.ELECTRIC_HEATING_DESCRIPTIONS + self.ASSUMED_ELECTRIC_HEATING
)
self.has_electric_heating_description = self.property.main_heating["has_electric"]
def is_high_heat_retention_valid(self, ashp_only_heating_recommendation, measures):
"""
@ -49,14 +40,8 @@ class HeatingRecommender:
:return:
"""
# If the property has assumed electric heating, regardless of whether or not it has a mains connection, we
# can consider hhr storage heaters
electric_heating_assumed = self.property.main_heating["clean_description"] in self.ASSUMED_ELECTRIC_HEATING
has_electric = self.has_electric_heating_description or electric_heating_assumed
return (
has_electric and (not ashp_only_heating_recommendation) and
self.has_electric_heating_description and (not ashp_only_heating_recommendation) and
("high_heat_retention_storage_heater" in measures)
)

View file

@ -464,6 +464,168 @@ testing_examples = [
"heating_controls_recommendation_descriptions": [],
"notes": "This property has an oil boiler and doesn't have a mains gas connection so we can only recommend"
"an air source heat pump"
},
{
"epc": {
'lmk-key': '351990902052009082517013406210567', 'address1': '56, Collingham Road', 'address2': None,
'address3': None, 'postcode': 'LE3 2BA', 'building-reference-number': 5783266668,
'current-energy-rating': 'F', 'potential-energy-rating': 'F', 'current-energy-efficiency': 28,
'potential-energy-efficiency': 33, 'property-type': 'House', 'built-form': 'Semi-Detached',
'inspection-date': '2009-08-25', 'local-authority': 'E06000016', 'constituency': 'E14000784',
'county': None,
'lodgement-date': '2009-08-25', 'transaction-type': 'marketed sale', 'environment-impact-current': 31,
'environment-impact-potential': 33, 'energy-consumption-current': 579, 'energy-consumption-potential': 549,
'co2-emissions-current': 7.4, 'co2-emiss-curr-per-floor-area': 95, 'co2-emissions-potential': 7.1,
'lighting-cost-current': 78, 'lighting-cost-potential': 39, 'heating-cost-current': 985,
'heating-cost-potential': 1015, 'hot-water-cost-current': 381, 'hot-water-cost-potential': 281,
'total-floor-area': 87.8, 'energy-tariff': 'Single', 'mains-gas-flag': 'Y', 'floor-level': 'NO DATA!',
'flat-top-storey': None, 'flat-storey-count': None, 'main-heating-controls': 2601.0,
'multi-glaze-proportion': 35.0, 'glazed-type': 'double glazing installed before 2002',
'glazed-area': 'Normal', 'extension-count': 0, 'number-habitable-rooms': 5, 'number-heated-rooms': 2,
'low-energy-lighting': 0, 'number-open-fireplaces': 0,
'hotwater-description': 'Electric immersion, standard tariff', 'hot-water-energy-eff': 'Very Poor',
'hot-water-env-eff': 'Poor', 'floor-description': 'Suspended, no insulation (assumed)',
'floor-energy-eff': None, 'windows-description': 'Partial double glazing', 'windows-energy-eff': 'Poor',
'windows-env-eff': 'Poor', 'walls-description': 'Solid brick, as built, no insulation (assumed)',
'walls-energy-eff': 'Very Poor', 'walls-env-eff': 'Very Poor',
'secondheat-description': 'Room heaters, mains gas', 'roof-description': 'Pitched, no insulation (assumed)',
'roof-energy-eff': 'Very Poor', 'roof-env-eff': 'Very Poor',
'mainheat-description': 'Room heaters, mains gas', 'mainheat-energy-eff': 'Average',
'mainheat-env-eff': 'Average', 'mainheatcont-description': 'No thermostatic control of room temperature',
'mainheatc-energy-eff': 'Poor', 'mainheatc-env-eff': 'Poor',
'lighting-description': 'No low energy lighting', 'lighting-energy-eff': 'Very Poor',
'lighting-env-eff': 'Very Poor',
'main-fuel': 'mains gas - this is for backwards compatibility only and should not be used',
'wind-turbine-count': 0, 'heat-loss-corridor': 'NO DATA!', 'unheated-corridor-length': None,
'floor-height': 2.48, 'photo-supply': 0.0, 'solar-water-heating-flag': 'N',
'mechanical-ventilation': 'natural', 'address': '56, Collingham Road', 'local-authority-label': 'Leicester',
'constituency-label': 'Leicester West', 'posttown': 'LEICESTER',
'construction-age-band': 'England and Wales: 1930-1949',
'lodgement-datetime': '2009-08-25 17:01:34', 'tenure': 'owner-occupied',
'fixed-lighting-outlets-count': None, 'low-energy-fixed-light-count': None, 'uprn': 2465031849,
'uprn-source': 'Address Matched', 'sheating-energy-eff': None, 'sheating-env-eff': None
},
"heating_recommendation_descriptions": [
'Upgrade to a new condensing boiler upgrade heating controls to Room thermostat, programmer and TRVs',
'Upgrade to a new condensing boiler Upgrade heating controls to Smart Thermostats, room sensors and smart '
'radiator valves (time & temperature zone control)',
'Install an air source heat pump, and upgrade heating controls to Smart Thermostats, room sensors and '
'smart radiator valves (time & temperature zone control). The cost includes the £7500 boiler upgrade '
'scheme grant'
],
"heating_controls_recommendation_descriptions": [],
"notes": "This property has room heaters, from the mains gas supply. We recommend a boiler upgrade as"
"well as an air source heat pump"
},
{
"epc": {
'lmk-key': 'f9997a382dca2a1b5dc916a21cf1a28327fc6ffe32fa4c5eeb7a859fe73cabf4',
'address1': '39 Parkes Street', 'address2': None, 'address3': None, 'postcode': 'WV13 2LR',
'building-reference-number': 10005271458, 'current-energy-rating': 'G', 'potential-energy-rating': 'B',
'current-energy-efficiency': 17, 'potential-energy-efficiency': 89, 'property-type': 'House',
'built-form': 'Mid-Terrace', 'inspection-date': '2023-11-10', 'local-authority': 'E08000030',
'constituency': 'E14001011', 'county': None, 'lodgement-date': '2023-11-10', 'transaction-type': 'rental',
'environment-impact-current': 29, 'environment-impact-potential': 88, 'energy-consumption-current': 582,
'energy-consumption-potential': 71, 'co2-emissions-current': 7.4, 'co2-emiss-curr-per-floor-area': 98,
'co2-emissions-potential': 1.0, 'lighting-cost-current': 193, 'lighting-cost-potential': 121,
'heating-cost-current': 3789, 'heating-cost-potential': 774, 'hot-water-cost-current': 1241,
'hot-water-cost-potential': 165, 'total-floor-area': 75.0, 'energy-tariff': 'Single', 'mains-gas-flag': 'Y',
'floor-level': None, 'flat-top-storey': None, 'flat-storey-count': None, 'main-heating-controls': None,
'multi-glaze-proportion': 100.0, 'glazed-type': 'double glazing, unknown install date',
'glazed-area': 'Normal', 'extension-count': 0, 'number-habitable-rooms': 5, 'number-heated-rooms': 0,
'low-energy-lighting': 40, 'number-open-fireplaces': 0,
'hotwater-description': 'No system present: electric immersion assumed',
'hot-water-energy-eff': 'Very Poor', 'hot-water-env-eff': 'Poor',
'floor-description': 'Suspended, no insulation (assumed)', 'floor-energy-eff': None,
'windows-description': 'Fully double glazed', 'windows-energy-eff': 'Average', 'windows-env-eff': 'Average',
'walls-description': 'Solid brick, as built, no insulation (assumed)', 'walls-energy-eff': 'Very Poor',
'walls-env-eff': 'Very Poor', 'secondheat-description': 'None',
'roof-description': 'Pitched, 200 mm loft insulation', 'roof-energy-eff': 'Good', 'roof-env-eff': 'Good',
'mainheat-description': 'No system present: electric heaters assumed', 'mainheat-energy-eff': 'Very Poor',
'mainheat-env-eff': 'Poor', 'mainheatcont-description': 'None', 'mainheatc-energy-eff': 'Very Poor',
'mainheatc-env-eff': 'Very Poor', 'lighting-description': 'Low energy lighting in 40% of fixed outlets',
'lighting-energy-eff': 'Average', 'lighting-env-eff': 'Average',
'main-fuel': 'To be used only when there is no heating/hot-water system or data is from a community '
'network',
'wind-turbine-count': 0, 'heat-loss-corridor': None, 'unheated-corridor-length': None, 'floor-height': 2.5,
'photo-supply': 0.0, 'solar-water-heating-flag': 'N', 'mechanical-ventilation': 'natural',
'address': '39 Parkes Street', 'local-authority-label': 'Walsall', 'constituency-label': 'Walsall North',
'posttown': 'WILLENHALL', 'construction-age-band': 'England and Wales: 1900-1929',
'lodgement-datetime': '2023-11-10 18:06:18', 'tenure': 'Rented (social)',
'fixed-lighting-outlets-count': 10.0, 'low-energy-fixed-light-count': None, 'uprn': 100071113763,
'uprn-source': 'Energy Assessor', 'sheating-energy-eff': None, 'sheating-env-eff': None
},
"heating_recommendation_descriptions": [
'Upgrade to a new condensing boiler upgrade heating controls to Room thermostat, programmer and TRVs',
'Upgrade to a new condensing boiler Upgrade heating controls to Smart Thermostats, room sensors and smart '
'radiator valves (time & temperature zone control)',
'Install high heat retention electric storage heaters. Upgrade heating controls to High Heat Retention '
'Storage Heater Controls',
'Install an air source heat pump, and upgrade heating controls to Smart Thermostats, room sensors and '
'smart radiator valves (time & temperature zone control). The cost includes the £7500 boiler upgrade '
'scheme grant'
],
"heating_controls_recommendation_descriptions": [],
"notes": "This property has assumed electric heaters. Boiler upgrade, HHR and ASHP are all recommended"
},
{
"epc": {
'lmk-key': 'dca62e7f9e21ac21d9c8af1029102cbe47c0509b8e6fc302cd7df079f8fc3a53',
'address1': '58 Telford Road', 'address2': None, 'address3': None, 'postcode': 'WS2 7LD',
'building-reference-number': 10003473159, 'current-energy-rating': 'F', 'potential-energy-rating': 'C',
'current-energy-efficiency': 37, 'potential-energy-efficiency': 77, 'property-type': 'House',
'built-form': 'Mid-Terrace', 'inspection-date': '2022-10-26', 'local-authority': 'E08000030',
'constituency': 'E14001011', 'county': None, 'lodgement-date': '2022-10-26',
'transaction-type': 'marketed sale', 'environment-impact-current': 47, 'environment-impact-potential': 80,
'energy-consumption-current': 380, 'energy-consumption-potential': 130, 'co2-emissions-current': 4.5,
'co2-emiss-curr-per-floor-area': 65, 'co2-emissions-potential': 1.6, 'lighting-cost-current': 101,
'lighting-cost-potential': 63, 'heating-cost-current': 1267, 'heating-cost-potential': 733,
'hot-water-cost-current': 386, 'hot-water-cost-potential': 67, 'total-floor-area': 69.0,
'energy-tariff': 'Single', 'mains-gas-flag': 'Y', 'floor-level': None, 'flat-top-storey': None,
'flat-storey-count': None, 'main-heating-controls': None, 'multi-glaze-proportion': 90.0,
'glazed-type': 'double glazing, unknown install date', 'glazed-area': 'Normal', 'extension-count': 0,
'number-habitable-rooms': 4, 'number-heated-rooms': 1, 'low-energy-lighting': 40,
'number-open-fireplaces': 0, 'hotwater-description': 'Electric immersion, standard tariff',
'hot-water-energy-eff': 'Very Poor', 'hot-water-env-eff': 'Poor',
'floor-description': 'Solid, no insulation (assumed)', 'floor-energy-eff': None,
'windows-description': 'Mostly double glazing', 'windows-energy-eff': 'Average',
'windows-env-eff': 'Average', 'walls-description': 'Cavity wall, filled cavity',
'walls-energy-eff': 'Average', 'walls-env-eff': 'Average',
'secondheat-description': 'Room heaters, mains gas', 'roof-description': 'Pitched, 100 mm loft insulation',
'roof-energy-eff': 'Average', 'roof-env-eff': 'Average',
'mainheat-description': 'Portable electric heaters assumed for most rooms, Room heaters, electric',
'mainheat-energy-eff': 'Very Poor', 'mainheat-env-eff': 'Poor',
'mainheatcont-description': 'No thermostatic control of room temperature', 'mainheatc-energy-eff': 'Poor',
'mainheatc-env-eff': 'Poor', 'lighting-description': 'Low energy lighting in 40% of fixed outlets',
'lighting-energy-eff': 'Average', 'lighting-env-eff': 'Average', 'main-fuel': 'mains gas (not community)',
'wind-turbine-count': 0, 'heat-loss-corridor': None, 'unheated-corridor-length': None, 'floor-height': 2.46,
'photo-supply': 0.0, 'solar-water-heating-flag': 'N', 'mechanical-ventilation': 'natural',
'address': '58 Telford Road', 'local-authority-label': 'Walsall', 'constituency-label': 'Walsall North',
'posttown': 'WALSALL', 'construction-age-band': 'England and Wales: 1950-1966',
'lodgement-datetime': '2022-10-26 13:46:05', 'tenure': 'Owner-occupied',
'fixed-lighting-outlets-count': 10.0, 'low-energy-fixed-light-count': None, 'uprn': 100071089116,
'uprn-source': 'Energy Assessor', 'sheating-energy-eff': None, 'sheating-env-eff': None
},
"heating_recommendation_descriptions": [
'Upgrade to a new condensing boiler upgrade heating controls to Room thermostat, programmer and TRVs',
'Upgrade to a new condensing boiler Upgrade heating controls to Smart Thermostats, room sensors and smart '
'radiator valves (time & temperature zone control)',
'Install high heat retention electric storage heaters. Upgrade heating controls to High Heat Retention '
'Storage Heater Controls',
],
"heating_controls_recommendation_descriptions": [
'Upgrade to a new condensing boiler upgrade heating controls to Room thermostat, programmer and TRVs',
'Upgrade to a new condensing boiler Upgrade heating controls to Smart Thermostats, room sensors and smart '
'radiator valves (time & temperature zone control)',
'Install high heat retention electric storage heaters. Upgrade heating controls to High Heat Retention '
'Storage Heater Controls',
'Install an air source heat pump, and upgrade heating controls to Smart Thermostats, room sensors and '
'smart radiator valves (time & temperature zone control). The cost includes the £7500 boiler upgrade '
'scheme grant'
],
"notes": "This has a form of assumed electric heating and has a mains connection so we recommend HHR, boiler"
"upgrade and ASHP"
}
]
@ -509,7 +671,11 @@ print(eg["mainheatcont-description"])
### We also use the Midlands EPC F/G portfolio to get examples to create tests
completed_descriptions = [
"Portable electric heaters assumed for most rooms"
"Portable electric heaters assumed for most rooms",
"Boiler and radiators, oil",
"Boiler and radiators, mains gas",
"Room heaters, mains gas",
"No system present: electric heaters assumed"
]
portfolio = pd.read_excel(
@ -517,8 +683,9 @@ portfolio = pd.read_excel(
)
portfolio.columns = [c.replace("_", "-").lower() for c in portfolio.columns]
portfolio = portfolio[~portfolio["mainheat-description"].isin(completed_descriptions)]
portfolio["mainheat-description"].value_counts()
eg = portfolio[
(portfolio["mainheat-description"] == "Boiler and radiators, oil")
(portfolio["mainheat-description"] == "Portable electric heaters assumed for most rooms, Room heaters, electric")
].sample(1)
eg = eg.squeeze().to_dict()