Model/recommendations/tests/test_window_recommendations.py
2025-05-15 17:12:19 +01:00

689 lines
40 KiB
Python

import pytest
import pickle
from recommendations.WindowsRecommendations import WindowsRecommendations
from backend.Property import Property
from recommendations.tests.test_data.materials import materials
from etl.epc.Record import EPCRecord
class TestWindowRecommendations:
@pytest.fixture()
def cleaning_data(self):
with open("recommendations/tests/test_data/cleaning_data.pkl", "rb") as f:
data = pickle.load(f)
return data
@pytest.fixture()
def cleaned(self):
with open("recommendations/tests/test_data/cleaned.pkl", "rb") as f:
df = pickle.load(f)
return df
def test_fully_single_glazed(self):
"""
For this property, we expect all windows to be single glazed and should recommend full double glazing
:return:
"""
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 0,
"uprn": 0,
"windows-energy-eff": "Very Poor",
"floor-area": 2.5,
"number-habitable-rooms": 5,
"number-heated-rooms": 5,
}
property_1 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_1.windows = {
'original_description': 'Single glazed', 'has_glazing': False, 'glazing_coverage': 'full',
'glazing_type': 'single',
'no_data': False
}
property_1.number_of_windows = 7
recommender = WindowsRecommendations(property_instance=property_1, materials=materials)
assert not recommender.recommendation
recommender.recommend()
# The home is going from single glazing (v poor energy eff) -> double glazing (average energy eff)
assert recommender.recommendation == [
{
'phase': 0, 'parts': [], 'type': 'windows_glazing', "measure_type": "double_glazing",
'description': 'Install double glazing to all windows',
'starting_u_value': None, 'new_u_value': None, 'sap_points': None, 'already_installed': False,
'total': 7980.0, 'labour_hours': 0.0, 'labour_days': 0.0, 'is_secondary_glazing': False,
'description_simulation': {
'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good',
'windows-description': 'Fully double glazed',
'glazed-type': 'double glazing installed during or after 2002'
},
'simulation_config': {
'has_glazing_ending': True, 'glazing_type_ending': 'double',
'multi_glaze_proportion_ending': 100, 'windows_energy_eff_ending': 'Good',
'glazed_type_ending': 'double glazing installed during or after 2002'
},
"survey": None
}
]
def test_partial_double_glazed(self):
"""
For this property, the double glazing is describes as partial, therefore we recommend completion of
double glazing
:return:
"""
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 33,
"uprn": 0,
"windows-energy-eff": "Good" # This has been observed in the EPC data
}
property_2 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_2.windows = {'original_description': 'Mostly double glazing', 'has_glazing': True,
'glazing_coverage': 'most',
'glazing_type': 'double', 'no_data': False}
property_2.number_of_windows = 7
recommender2 = WindowsRecommendations(property_instance=property_2, materials=materials)
assert not recommender2.recommendation
recommender2.recommend()
assert recommender2.recommendation == [
{
'phase': 0, 'parts': [], 'type': 'windows_glazing', "measure_type": "double_glazing",
'description': 'Install double glazing to the remaining windows', 'starting_u_value': None,
'new_u_value': None, 'sap_points': None, 'already_installed': False, 'total': 5700.0,
'labour_hours': 0.0,
'labour_days': 0.0, 'is_secondary_glazing': False,
'description_simulation': {
'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good',
'windows-description': 'Fully double glazed',
'glazed-type': 'double glazing installed during or after 2002'
},
'simulation_config': {
'glazing_coverage_ending': 'full', 'multi_glaze_proportion_ending': 100,
'windows_energy_eff_ending': 'Good', 'glazing_type_ending': 'double',
'glazed_type_ending': 'double glazing installed during or after 2002'
},
"survey": None
}
]
def test_fully_double_glazed(self):
"""
This property has full double glazing so we shouldn't recommend anything
:return:
"""
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 100,
"uprn": 0
}
property_3 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_3.windows = {'original_description': 'Fully double glazed', 'has_glazing': True,
'glazing_coverage': 'full',
'glazing_type': 'double', 'no_data': False}
property_3.number_of_windows = 7
recommender3 = WindowsRecommendations(property_instance=property_3, materials=materials)
assert not recommender3.recommendation
recommender3.recommend()
assert not recommender3.recommendation
def test_fully_secondary_glazed(self):
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 100,
"uprn": 0
}
property_4 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_4.windows = {'original_description': 'Full secondary glazing', 'has_glazing': True,
'glazing_coverage': 'full',
'glazing_type': 'secondary', 'no_data': False}
property_4.number_of_windows = 7
recommender4 = WindowsRecommendations(property_instance=property_4, materials=materials)
assert not recommender4.recommendation
recommender4.recommend()
assert not recommender4.recommendation
def test_partial_secondary_glazing(self):
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 50,
"uprn": 0,
"windows-energy-eff": "Poor" # This has been observed in the EPC data
}
property_5 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_5.windows = {'original_description': 'Partial secondary glazing', 'has_glazing': True,
'glazing_coverage': 'partial',
'glazing_type': 'secondary', 'no_data': False}
property_5.number_of_windows = 7
recommender5 = WindowsRecommendations(property_instance=property_5, materials=materials)
assert not recommender5.recommendation
recommender5.recommend()
assert recommender5.recommendation == [
{
'phase': 0, 'parts': [], 'type': 'windows_glazing', 'measure_type': 'secondary_glazing',
'description': 'Install secondary glazing to the remaining windows', 'starting_u_value': None,
'new_u_value': None, 'sap_points': None, 'already_installed': False, 'total': 4560.0,
'labour_hours': 0.0, 'labour_days': 0.0, 'is_secondary_glazing': True,
'description_simulation': {
'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good',
'windows-description': 'Full secondary glazing',
'glazed-type': 'secondary glazing'
},
'simulation_config': {
'glazing_coverage_ending': 'full', 'multi_glaze_proportion_ending': 100,
'windows_energy_eff_ending': 'Good', 'glazing_type_ending': 'secondary',
'glazed_type_ending': 'secondary glazing'
},
"survey": None
}
]
def test_single_glazed_restricted_measures(self):
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 0,
"uprn": 0,
"windows-energy-eff": "Very Poor"
}
property_6 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_6.windows = {'original_description': 'Single glazed', 'has_glazing': False, 'glazing_coverage': None,
'glazing_type': 'single',
'no_data': False}
property_6.number_of_windows = 7
property_6.restricted_measures = True
property_6.is_heritage = True
recommender6 = WindowsRecommendations(property_instance=property_6, materials=materials)
assert not recommender6.recommendation
recommender6.recommend()
assert recommender6.recommendation == [
{
'phase': 0, 'parts': [], 'type': 'windows_glazing', 'measure_type': 'secondary_glazing',
'description': 'Install secondary glazing to all windows. Secondary glazing recommended due to '
'herigate building status',
'starting_u_value': None, 'new_u_value': None, 'sap_points': None, 'already_installed': False,
'total': 7980.0, 'labour_hours': 0.0, 'labour_days': 0.0, 'is_secondary_glazing': True,
'description_simulation': {
'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good',
'windows-description': 'Full secondary glazing',
'glazed-type': 'secondary glazing'
},
'simulation_config': {
'has_glazing_ending': True, 'glazing_coverage_ending': 'full',
'glazing_type_ending': 'secondary', 'multi_glaze_proportion_ending': 100,
'windows_energy_eff_ending': 'Good', 'glazed_type_ending': 'secondary glazing'
},
"survey": None
},
]
def test_full_triple_glazed(self):
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 100,
"uprn": 0
}
property_7 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_7.windows = {'original_description': 'Fully triple glazed', 'has_glazing': True,
'glazing_coverage': 'full',
'glazing_type': 'triple', 'no_data': False}
property_7.number_of_windows = 7
recommender7 = WindowsRecommendations(property_instance=property_7, materials=materials)
assert not recommender7.recommendation
recommender7.recommend()
assert not recommender7.recommendation
def test_partial_triple_glazed(self):
"""
We don't recommend anything here
"""
epc_record = EPCRecord()
epc_record.prepared_epc = {
"county": "Wychavon",
"multi-glaze-proportion": 80,
"uprn": 1
}
property_8 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_8.windows = {'original_description': 'Mostly triple glazing', 'has_glazing': True,
'glazing_coverage': 'most',
'glazing_type': 'triple', 'no_data': False}
property_8.number_of_windows = 7
recommender8 = WindowsRecommendations(property_instance=property_8, materials=materials)
assert not recommender8.recommendation
recommender8.recommend()
assert not recommender8.recommendation
def test_simulating_outcome_single_glazed(self, cleaning_data, cleaned):
epc = {
'lmk-key': 'f4cf43c90ab3140112a9d1c8cfb21ec1bf73f5a2ca3c75118f289d3447dddf15', 'address1': '3 The Green',
'address2': 'Old Dalby', 'address3': None, 'postcode': 'LE14 3LL',
'building-reference-number': 10006291833, 'current-energy-rating': 'E', 'potential-energy-rating': 'B',
'current-energy-efficiency': 47, 'potential-energy-efficiency': 82, 'property-type': 'House',
'built-form': 'Semi-Detached', 'inspection-date': '2024-07-19', 'local-authority': 'E07000133',
'constituency': 'E14000909', 'county': 'Leicestershire', 'lodgement-date': '2024-07-21',
'transaction-type': 'rental', 'environment-impact-current': 41, 'environment-impact-potential': 79,
'energy-consumption-current': 478, 'energy-consumption-potential': 155.0, 'co2-emissions-current': 5.1,
'co2-emiss-curr-per-floor-area': 85, 'co2-emissions-potential': 1.7, 'lighting-cost-current': 91.0,
'lighting-cost-potential': 91.0, 'heating-cost-current': 1677.0, 'heating-cost-potential': 874.0,
'hot-water-cost-current': 161.0, 'hot-water-cost-potential': 109.0, 'total-floor-area': 61.0,
'energy-tariff': 'dual', 'mains-gas-flag': 'Y', 'floor-level': None, 'flat-top-storey': None,
'flat-storey-count': None, 'main-heating-controls': None, 'multi-glaze-proportion': 0.0,
'glazed-type': 'not defined', 'glazed-area': 'Normal', 'extension-count': 3.0,
'number-habitable-rooms': 4.0, 'number-heated-rooms': 4.0, 'low-energy-lighting': 100.0,
'number-open-fireplaces': 0.0, 'hotwater-description': 'From main system',
'hot-water-energy-eff': 'Good', 'hot-water-env-eff': 'Good',
'floor-description': 'Solid, no insulation (assumed)', 'floor-energy-eff': None, 'floor-env-eff': None,
'windows-description': 'Single glazed', 'windows-energy-eff': 'Very Poor',
'windows-env-eff': 'Very Poor', 'walls-description': 'Solid brick, as built, no insulation (assumed)',
'walls-energy-eff': 'Very Poor', 'walls-env-eff': 'Very Poor', 'secondheat-description': 'None',
'sheating-energy-eff': None, 'sheating-env-eff': None,
'roof-description': 'Pitched, no insulation (assumed)', 'roof-energy-eff': 'Very Poor',
'roof-env-eff': 'Very Poor', 'mainheat-description': 'Boiler and radiators, mains gas',
'mainheat-energy-eff': 'Good', 'mainheat-env-eff': 'Good',
'mainheatcont-description': 'Programmer and room thermostat', 'mainheatc-energy-eff': 'Average',
'mainheatc-env-eff': 'Average', 'lighting-description': 'Low energy lighting in all fixed outlets',
'lighting-energy-eff': 'Very Good', 'lighting-env-eff': 'Very Good',
'main-fuel': 'mains gas (not community)', 'wind-turbine-count': 0.0, 'heat-loss-corridor': None,
'unheated-corridor-length': None, 'floor-height': 2.37, 'photo-supply': 0.0,
'solar-water-heating-flag': 'N', 'mechanical-ventilation': 'natural',
'address': '3 The Green, Old Dalby', 'local-authority-label': 'Melton',
'constituency-label': 'Rutland and Melton', 'posttown': 'MELTON MOWBRAY',
'construction-age-band': 'England and Wales: before 1900', 'lodgement-datetime': '2024-07-21 19:29:04',
'tenure': 'Rented (private)', 'fixed-lighting-outlets-count': 7.0, 'low-energy-fixed-light-count': None,
'uprn': 200001041444.0, 'uprn-source': 'Energy Assessor'
}
epc_records = {
"original_epc": epc,
"full_sap_epc": {},
"old_data": []
}
epc_record = EPCRecord(
epc_records=epc_records,
run_mode="newdata",
cleaning_data=cleaning_data
)
property_9 = Property(
id=1,
postcode='1',
address='1',
epc_record=epc_record
)
property_9.windows = {
'original_description': 'Single glazed', 'has_glazing': False, 'glazing_coverage': None,
'glazing_type': 'single',
'no_data': False
}
property_9.perimeter = 23.430749027719962
property_9.number_of_windows = 7
property_9.restricted_measures = False
property_9.is_heritage = False
recommender9 = WindowsRecommendations(property_instance=property_9, materials=materials)
assert not recommender9.recommendation
recommender9.recommend()
assert recommender9.recommendation == [
{
'phase': 0, 'parts': [], 'type': 'windows_glazing', 'measure_type': 'double_glazing',
'description': 'Install double glazing to all windows', 'starting_u_value': None, 'new_u_value': None,
'sap_points': None, 'already_installed': False, 'total': 7980.0, 'labour_hours': 0.0,
'labour_days': 0.0, 'is_secondary_glazing': False,
'description_simulation': {
'multi-glaze-proportion': 100, 'windows-energy-eff': 'Good',
'windows-description': 'Fully double glazed',
'glazed-type': 'double glazing installed during or after 2002'
},
'simulation_config': {
'has_glazing_ending': True, 'glazing_coverage_ending': 'full',
'glazing_type_ending': 'double', 'multi_glaze_proportion_ending': 100,
'windows_energy_eff_ending': 'Good',
'glazed_type_ending': 'double glazing installed during or after 2002'
},
"survey": None
}
]
# We now simulate the outcome
windows_rec = recommender9.recommendation.copy()
windows_rec[0]["recommendation_id"] = 1
property_recommendations = [windows_rec]
property_9.create_base_difference_epc_record(cleaned_lookup=cleaned)
starting_record = property_9.base_difference_record.df.to_dict("records")[0]
expected_base_difference_record = {
'uprn': 200001041444, 'rdsap_change': 0, 'heat_demand_change': 0, 'carbon_change': 0.0,
'potential_energy_efficiency': 82.0, 'environment_impact_potential': 79.0,
'energy_consumption_potential': 155.0, 'co2_emissions_potential': 1.7, 'property_type': 'House',
'built_form': 'Semi-Detached', 'constituency': 'E14000909', 'number_habitable_rooms': 4.0,
'number_heated_rooms': 4.0, 'construction_age_band': 'England and Wales: before 1900',
'fixed_lighting_outlets_count': 7.0, 'walls_thermal_transmittance': 1.7,
'walls_thermal_transmittance_unit': 'Unknown', 'is_cavity_wall': False, 'is_filled_cavity': False,
'is_solid_brick': True, 'is_system_built': False, 'is_timber_frame': False,
'is_granite_or_whinstone': False, 'is_as_built': True, 'is_cob': False, 'walls_is_assumed': True,
'is_sandstone_or_limestone': False, 'is_park_home': False, 'walls_insulation_thickness': 'none',
'external_insulation': False, 'internal_insulation': False, 'floor_thermal_transmittance': 0.96,
'is_to_unheated_space': False, 'is_to_external_air': False, 'is_suspended': False, 'is_solid': True,
'another_property_below': False, 'floor_insulation_thickness': 'none', 'roof_thermal_transmittance': 2.3,
'is_pitched': True, 'is_roof_room': False, 'is_loft': False, 'is_flat': False, 'is_thatched': False,
'is_at_rafters': False, 'has_dwelling_above': False, 'roof_insulation_thickness': 'none',
'heater_type': 'Unknown', 'system_type': 'from main system', 'thermostat_characteristics': 'Unknown',
'heating_scope': 'Unknown', 'energy_recovery': 'Unknown', 'hotwater_tariff_type': 'Unknown',
'extra_features': 'Unknown', 'chp_systems': 'Unknown', 'distribution_system': 'Unknown',
'no_system_present': 'Unknown', 'appliance': 'Unknown', 'has_radiators': True, 'has_fan_coil_units': False,
'has_pipes_in_screed_above_insulation': False, 'has_pipes_in_insulated_timber_floor': False,
'has_pipes_in_concrete_slab': False, 'has_boiler': True, 'has_air_source_heat_pump': False,
'has_room_heaters': False, 'has_electric_storage_heaters': False, 'has_warm_air': False,
'has_electric_underfloor_heating': False, 'has_electric_ceiling_heating': False,
'has_community_scheme': False, 'has_ground_source_heat_pump': False, 'has_no_system_present': False,
'has_portable_electric_heaters': False, 'has_water_source_heat_pump': False,
'has_electric_heat_pump': False, 'has_micro-cogeneration': False, 'has_solar_assisted_heat_pump': False,
'has_exhaust_source_heat_pump': False, 'has_community_heat_pump': False, 'has_electric': False,
'has_mains_gas': True, 'has_wood_logs': False, 'has_coal': False, 'has_oil': False,
'has_wood_pellets': False, 'has_anthracite': False, 'has_dual_fuel_mineral_and_wood': False,
'has_smokeless_fuel': False, 'has_lpg': False, 'has_b30k': False, 'has_electricaire': False,
'has_assumed_for_most_rooms': False, 'has_underfloor_heating': False,
'thermostatic_control': 'room thermostat', 'charging_system': 'Unknown', 'switch_system': 'programmer',
'no_control': 'Unknown', 'dhw_control': 'Unknown', 'community_heating': 'Unknown',
'multiple_room_thermostats': False, 'auxiliary_systems': 'Unknown', 'trvs': 'Unknown',
'rate_control': 'Unknown', 'glazing_type': 'single', 'fuel_type': 'mains gas',
'main-fuel_tariff_type': 'Unknown', 'is_community': False,
'no_individual_heating_or_community_network': False, 'complex_fuel_type': 'Unknown',
'walls_thermal_transmittance_ending': 1.7, 'walls_thermal_transmittance_unit_ending': 'Unknown',
'is_filled_cavity_ending': False, 'is_as_built_ending': True, 'walls_is_assumed_ending': True,
'is_park_home_ending': False, 'walls_insulation_thickness_ending': 'none',
'external_insulation_ending': False, 'internal_insulation_ending': False,
'floor_thermal_transmittance_ending': 0.96, 'floor_insulation_thickness_ending': 'none',
'roof_thermal_transmittance_ending': 2.3, 'is_at_rafters_ending': False,
'roof_insulation_thickness_ending': 'none', 'heater_type_ending': 'Unknown',
'system_type_ending': 'from main system', 'thermostat_characteristics_ending': 'Unknown',
'heating_scope_ending': 'Unknown', 'energy_recovery_ending': 'Unknown',
'hotwater_tariff_type_ending': 'Unknown', 'extra_features_ending': 'Unknown',
'chp_systems_ending': 'Unknown', 'distribution_system_ending': 'Unknown',
'no_system_present_ending': 'Unknown', 'appliance_ending': 'Unknown', 'has_radiators_ending': True,
'has_fan_coil_units_ending': False, 'has_pipes_in_screed_above_insulation_ending': False,
'has_pipes_in_insulated_timber_floor_ending': False, 'has_pipes_in_concrete_slab_ending': False,
'has_boiler_ending': True, 'has_air_source_heat_pump_ending': False, 'has_room_heaters_ending': False,
'has_electric_storage_heaters_ending': False, 'has_warm_air_ending': False,
'has_electric_underfloor_heating_ending': False, 'has_electric_ceiling_heating_ending': False,
'has_community_scheme_ending': False, 'has_ground_source_heat_pump_ending': False,
'has_no_system_present_ending': False, 'has_portable_electric_heaters_ending': False,
'has_water_source_heat_pump_ending': False, 'has_electric_heat_pump_ending': False,
'has_micro-cogeneration_ending': False, 'has_solar_assisted_heat_pump_ending': False,
'has_exhaust_source_heat_pump_ending': False, 'has_community_heat_pump_ending': False,
'has_electric_ending': False, 'has_mains_gas_ending': True, 'has_wood_logs_ending': False,
'has_coal_ending': False, 'has_oil_ending': False, 'has_wood_pellets_ending': False,
'has_anthracite_ending': False, 'has_dual_fuel_mineral_and_wood_ending': False,
'has_smokeless_fuel_ending': False, 'has_lpg_ending': False, 'has_b30k_ending': False,
'has_electricaire_ending': False, 'has_assumed_for_most_rooms_ending': False,
'has_underfloor_heating_ending': False, 'thermostatic_control_ending': 'room thermostat',
'charging_system_ending': 'Unknown', 'switch_system_ending': 'programmer', 'no_control_ending': 'Unknown',
'dhw_control_ending': 'Unknown', 'community_heating_ending': 'Unknown',
'multiple_room_thermostats_ending': False, 'auxiliary_systems_ending': 'Unknown', 'trvs_ending': 'Unknown',
'rate_control_ending': 'Unknown', 'glazing_type_ending': 'single', 'fuel_type_ending': 'mains gas',
'main-fuel_tariff_type_ending': 'Unknown', 'is_community_ending': False,
'no_individual_heating_or_community_network_ending': False, 'complex_fuel_type_ending': 'Unknown',
'sap_starting': 47, 'sap_ending': 47, 'heat_demand_starting': 478, 'heat_demand_ending': 478,
'carbon_starting': 5.1, 'carbon_ending': 5.1, 'lighting_cost_starting': 91.0, 'lighting_cost_ending': 91.0,
'heating_cost_starting': 1677.0, 'heating_cost_ending': 1677.0, 'hot_water_cost_starting': 161.0,
'hot_water_cost_ending': 161.0, 'mechanical_ventilation_starting': 'natural',
'mechanical_ventilation_ending': 'natural', 'secondheat_description_starting': 'None',
'secondheat_description_ending': 'None', 'glazed_type_starting': 'not defined',
'glazed_type_ending': 'not defined', 'multi_glaze_proportion_starting': 0.0,
'multi_glaze_proportion_ending': 0.0, 'low_energy_lighting_starting': 100.0,
'low_energy_lighting_ending': 100.0, 'number_open_fireplaces_starting': 0.0,
'number_open_fireplaces_ending': 0.0, 'solar_water_heating_flag_starting': 'N',
'solar_water_heating_flag_ending': 'N', 'photo_supply_starting': 0.0, 'photo_supply_ending': 0.0,
'transaction_type_starting': 'rental', 'transaction_type_ending': 'rental',
'energy_tariff_starting': 'dual', 'energy_tariff_ending': 'dual', 'extension_count_starting': 3.0,
'extension_count_ending': 3.0, 'total_floor_area_starting': 61.0, 'total_floor_area_ending': 61.0,
'floor_height_starting': 2.37, 'floor_height_ending': 2.37, 'hot_water_energy_eff_starting': 'Good',
'hot_water_energy_eff_ending': 'Good', 'floor_energy_eff_starting': 'NO_RATING',
'floor_energy_eff_ending': 'NO_RATING', 'windows_energy_eff_starting': 'Very Poor',
'windows_energy_eff_ending': 'Very Poor', 'walls_energy_eff_starting': 'Very Poor',
'walls_energy_eff_ending': 'Very Poor', 'sheating_energy_eff_starting': 'NO_RATING',
'sheating_energy_eff_ending': 'NO_RATING', 'roof_energy_eff_starting': 'Very Poor',
'roof_energy_eff_ending': 'Very Poor', 'mainheat_energy_eff_starting': 'Good',
'mainheat_energy_eff_ending': 'Good', 'mainheatc_energy_eff_starting': 'Average',
'mainheatc_energy_eff_ending': 'Average', 'lighting_energy_eff_starting': 'Very Good',
'lighting_energy_eff_ending': 'Very Good', 'number_habitable_rooms_starting': 4.0,
'number_habitable_rooms_ending': 4.0, 'number_heated_rooms_starting': 4.0,
'number_heated_rooms_ending': 4.0, 'days_to_starting': 3642, 'days_to_ending': 3642,
'estimated_perimeter_starting': 23.430749027719962, 'estimated_perimeter_ending': 23.430749027719962
}
assert starting_record == expected_base_difference_record
# Simulate outcome
property_9.adjust_difference_record_with_recommendations(
property_recommendations, windows_rec
)
simulated_data = property_9.recommendations_scoring_data.copy()
assert len(simulated_data) == 1
expected_simulated_outcome = {
'uprn': 200001041444, 'rdsap_change': 0, 'heat_demand_change': 0, 'carbon_change': 0.0,
'potential_energy_efficiency': 82.0, 'environment_impact_potential': 79.0,
'energy_consumption_potential': 155.0, 'co2_emissions_potential': 1.7, 'property_type': 'House',
'built_form': 'Semi-Detached', 'constituency': 'E14000909', 'number_habitable_rooms': 4.0,
'number_heated_rooms': 4.0, 'construction_age_band': 'England and Wales: before 1900',
'fixed_lighting_outlets_count': 7.0, 'walls_thermal_transmittance': 1.7,
'walls_thermal_transmittance_unit': 'Unknown', 'is_cavity_wall': False, 'is_filled_cavity': False,
'is_solid_brick': True, 'is_system_built': False, 'is_timber_frame': False,
'is_granite_or_whinstone': False, 'is_as_built': True, 'is_cob': False, 'walls_is_assumed': True,
'is_sandstone_or_limestone': False, 'is_park_home': False, 'walls_insulation_thickness': 'none',
'external_insulation': False, 'internal_insulation': False, 'floor_thermal_transmittance': 0.96,
'is_to_unheated_space': False, 'is_to_external_air': False, 'is_suspended': False, 'is_solid': True,
'another_property_below': False, 'floor_insulation_thickness': 'none', 'roof_thermal_transmittance': 2.3,
'is_pitched': True, 'is_roof_room': False, 'is_loft': False, 'is_flat': False, 'is_thatched': False,
'is_at_rafters': False, 'has_dwelling_above': False, 'roof_insulation_thickness': 'none',
'heater_type': 'Unknown', 'system_type': 'from main system', 'thermostat_characteristics': 'Unknown',
'heating_scope': 'Unknown', 'energy_recovery': 'Unknown', 'hotwater_tariff_type': 'Unknown',
'extra_features': 'Unknown', 'chp_systems': 'Unknown', 'distribution_system': 'Unknown',
'no_system_present': 'Unknown', 'appliance': 'Unknown', 'has_radiators': True, 'has_fan_coil_units': False,
'has_pipes_in_screed_above_insulation': False, 'has_pipes_in_insulated_timber_floor': False,
'has_pipes_in_concrete_slab': False, 'has_boiler': True, 'has_air_source_heat_pump': False,
'has_room_heaters': False, 'has_electric_storage_heaters': False, 'has_warm_air': False,
'has_electric_underfloor_heating': False, 'has_electric_ceiling_heating': False,
'has_community_scheme': False, 'has_ground_source_heat_pump': False, 'has_no_system_present': False,
'has_portable_electric_heaters': False, 'has_water_source_heat_pump': False,
'has_electric_heat_pump': False, 'has_micro-cogeneration': False, 'has_solar_assisted_heat_pump': False,
'has_exhaust_source_heat_pump': False, 'has_community_heat_pump': False, 'has_electric': False,
'has_mains_gas': True, 'has_wood_logs': False, 'has_coal': False, 'has_oil': False,
'has_wood_pellets': False, 'has_anthracite': False, 'has_dual_fuel_mineral_and_wood': False,
'has_smokeless_fuel': False, 'has_lpg': False, 'has_b30k': False, 'has_electricaire': False,
'has_assumed_for_most_rooms': False, 'has_underfloor_heating': False,
'thermostatic_control': 'room thermostat', 'charging_system': 'Unknown', 'switch_system': 'programmer',
'no_control': 'Unknown', 'dhw_control': 'Unknown', 'community_heating': 'Unknown',
'multiple_room_thermostats': False, 'auxiliary_systems': 'Unknown', 'trvs': 'Unknown',
'rate_control': 'Unknown', 'glazing_type': 'single', 'fuel_type': 'mains gas',
'main-fuel_tariff_type': 'Unknown', 'is_community': False,
'no_individual_heating_or_community_network': False, 'complex_fuel_type': 'Unknown',
'walls_thermal_transmittance_ending': 1.7, 'walls_thermal_transmittance_unit_ending': 'Unknown',
'is_filled_cavity_ending': False, 'is_as_built_ending': True, 'walls_is_assumed_ending': True,
'is_park_home_ending': False, 'walls_insulation_thickness_ending': 'none',
'external_insulation_ending': False, 'internal_insulation_ending': False,
'floor_thermal_transmittance_ending': 0.96, 'floor_insulation_thickness_ending': 'none',
'roof_thermal_transmittance_ending': 2.3, 'is_at_rafters_ending': False,
'roof_insulation_thickness_ending': 'none', 'heater_type_ending': 'Unknown',
'system_type_ending': 'from main system', 'thermostat_characteristics_ending': 'Unknown',
'heating_scope_ending': 'Unknown', 'energy_recovery_ending': 'Unknown',
'hotwater_tariff_type_ending': 'Unknown', 'extra_features_ending': 'Unknown',
'chp_systems_ending': 'Unknown', 'distribution_system_ending': 'Unknown',
'no_system_present_ending': 'Unknown', 'appliance_ending': 'Unknown', 'has_radiators_ending': True,
'has_fan_coil_units_ending': False, 'has_pipes_in_screed_above_insulation_ending': False,
'has_pipes_in_insulated_timber_floor_ending': False, 'has_pipes_in_concrete_slab_ending': False,
'has_boiler_ending': True, 'has_air_source_heat_pump_ending': False, 'has_room_heaters_ending': False,
'has_electric_storage_heaters_ending': False, 'has_warm_air_ending': False,
'has_electric_underfloor_heating_ending': False, 'has_electric_ceiling_heating_ending': False,
'has_community_scheme_ending': False, 'has_ground_source_heat_pump_ending': False,
'has_no_system_present_ending': False, 'has_portable_electric_heaters_ending': False,
'has_water_source_heat_pump_ending': False, 'has_electric_heat_pump_ending': False,
'has_micro-cogeneration_ending': False, 'has_solar_assisted_heat_pump_ending': False,
'has_exhaust_source_heat_pump_ending': False, 'has_community_heat_pump_ending': False,
'has_electric_ending': False, 'has_mains_gas_ending': True, 'has_wood_logs_ending': False,
'has_coal_ending': False, 'has_oil_ending': False, 'has_wood_pellets_ending': False,
'has_anthracite_ending': False, 'has_dual_fuel_mineral_and_wood_ending': False,
'has_smokeless_fuel_ending': False, 'has_lpg_ending': False, 'has_b30k_ending': False,
'has_electricaire_ending': False, 'has_assumed_for_most_rooms_ending': False,
'has_underfloor_heating_ending': False, 'thermostatic_control_ending': 'room thermostat',
'charging_system_ending': 'Unknown', 'switch_system_ending': 'programmer', 'no_control_ending': 'Unknown',
'dhw_control_ending': 'Unknown', 'community_heating_ending': 'Unknown',
'multiple_room_thermostats_ending': False, 'auxiliary_systems_ending': 'Unknown', 'trvs_ending': 'Unknown',
'rate_control_ending': 'Unknown', 'glazing_type_ending': 'double', 'fuel_type_ending': 'mains gas',
'main-fuel_tariff_type_ending': 'Unknown', 'is_community_ending': False,
'no_individual_heating_or_community_network_ending': False, 'complex_fuel_type_ending': 'Unknown',
'sap_starting': 47, 'sap_ending': 47, 'heat_demand_starting': 478, 'heat_demand_ending': 478,
'carbon_starting': 5.1, 'carbon_ending': 5.1, 'lighting_cost_starting': 91.0, 'lighting_cost_ending': 91.0,
'heating_cost_starting': 1677.0, 'heating_cost_ending': 1677.0, 'hot_water_cost_starting': 161.0,
'hot_water_cost_ending': 161.0, 'mechanical_ventilation_starting': 'natural',
'mechanical_ventilation_ending': 'natural', 'secondheat_description_starting': 'None',
'secondheat_description_ending': 'None', 'glazed_type_starting': 'not defined',
'glazed_type_ending': 'double glazing installed during or after 2002',
'multi_glaze_proportion_starting': 0.0, 'multi_glaze_proportion_ending': 100,
'low_energy_lighting_starting': 100.0, 'low_energy_lighting_ending': 100.0,
'number_open_fireplaces_starting': 0.0, 'number_open_fireplaces_ending': 0.0,
'solar_water_heating_flag_starting': 'N', 'solar_water_heating_flag_ending': 'N',
'photo_supply_starting': 0.0, 'photo_supply_ending': 0.0, 'transaction_type_starting': 'rental',
'transaction_type_ending': 'rental', 'energy_tariff_starting': 'dual', 'energy_tariff_ending': 'dual',
'extension_count_starting': 3.0, 'extension_count_ending': 3.0, 'total_floor_area_starting': 61.0,
'total_floor_area_ending': 61.0, 'floor_height_starting': 2.37, 'floor_height_ending': 2.37,
'hot_water_energy_eff_starting': 'Good', 'hot_water_energy_eff_ending': 'Good',
'floor_energy_eff_starting': 'NO_RATING', 'floor_energy_eff_ending': 'NO_RATING',
'windows_energy_eff_starting': 'Very Poor', 'windows_energy_eff_ending': 'Good',
'walls_energy_eff_starting': 'Very Poor', 'walls_energy_eff_ending': 'Very Poor',
'sheating_energy_eff_starting': 'NO_RATING', 'sheating_energy_eff_ending': 'NO_RATING',
'roof_energy_eff_starting': 'Very Poor', 'roof_energy_eff_ending': 'Very Poor',
'mainheat_energy_eff_starting': 'Good', 'mainheat_energy_eff_ending': 'Good',
'mainheatc_energy_eff_starting': 'Average', 'mainheatc_energy_eff_ending': 'Average',
'lighting_energy_eff_starting': 'Very Good', 'lighting_energy_eff_ending': 'Very Good',
'number_habitable_rooms_starting': 4.0, 'number_habitable_rooms_ending': 4.0,
'number_heated_rooms_starting': 4.0, 'number_heated_rooms_ending': 4.0, 'days_to_starting': 3642,
'days_to_ending': 3713, 'estimated_perimeter_starting': 23.430749027719962,
'estimated_perimeter_ending': 23.430749027719962, 'has_glazing_ending': True,
'glazing_coverage_ending': 'full', 'id': '1+1'
}
# Make sure all keys are the same, apart from days_to_ending
assert all([v == expected_simulated_outcome[k] for k, v in simulated_data[0].items() if k != "days_to_ending"])
# has_glazing_ending and glazing_coverage_ending are not in the starting record - test for this in case it
# changes
assert "has_glazing_ending" not in starting_record
assert "glazing_coverage_ending" not in starting_record
# Check which keys are different
different = []
for k in simulated_data[0].keys():
if k in ["id", 'has_glazing_ending', 'glazing_coverage_ending', 'days_to_ending']:
continue
if simulated_data[0][k] != starting_record[k]:
different.append(
{
"variable": k,
"starting": starting_record[k],
"simulated": simulated_data[0][k],
}
)
expected_different = [
{'variable': 'glazing_type_ending', 'starting': 'single', 'simulated': 'double'},
{'variable': 'glazed_type_ending', 'starting': 'not defined',
'simulated': 'double glazing installed during or after 2002'},
{'variable': 'multi_glaze_proportion_ending', 'starting': 0.0, 'simulated': 100},
{'variable': 'windows_energy_eff_ending', 'starting': 'Very Poor', 'simulated': 'Good'},
]
assert different == expected_different