refactored est no floors

This commit is contained in:
Khalim Conn-Kowlessar 2025-02-20 09:04:26 +00:00
parent ecc9d99540
commit ed333e1714
3 changed files with 37 additions and 9 deletions

View file

@ -15,6 +15,12 @@ import asset_list.mappings.walls as walls_mappings
import asset_list.mappings.heating_systems as heating_mappings import asset_list.mappings.heating_systems as heating_mappings
import asset_list.mappings.exising_pv as existing_pv_mappings import asset_list.mappings.exising_pv as existing_pv_mappings
from recommendations.recommendation_utils import (
estimate_perimeter,
estimate_external_wall_area,
estimate_number_of_floors
)
logger = setup_logger() logger = setup_logger()
# OpenAI API Key (set this in your environment variables for security) # OpenAI API Key (set this in your environment variables for security)
@ -224,6 +230,7 @@ class AssetList:
"secondheat-description": "epc_secondary_heating", "secondheat-description": "epc_secondary_heating",
"transaction-type": "epc_reason", "transaction-type": "epc_reason",
"energy-consumption-current": "epc_heat_demand", "energy-consumption-current": "epc_heat_demand",
"photo-supply": "epc_photo_supply"
} }
FIND_EPC_DATA_NAMES = { FIND_EPC_DATA_NAMES = {
"heating_text": "epc_estiamted_heating_kwh", "heating_text": "epc_estiamted_heating_kwh",
@ -274,6 +281,7 @@ class AssetList:
# Attributes - these are columns that we produce, calcualted based on other pieces of data # Attributes - these are columns that we produce, calcualted based on other pieces of data
ATTRIBUTE_HAS_SOLAR = "attribute_has_solar" ATTRIBUTE_HAS_SOLAR = "attribute_has_solar"
ATTRIBUTE_NUMBER_OF_FLOORS = "attribute_est_number_floors"
def __init__( def __init__(
self, self,
@ -645,3 +653,22 @@ class AssetList:
self.standardised_asset_list[self.FIND_EPC_DATA_NAMES["Solar photovoltaics"]] | self.standardised_asset_list[self.FIND_EPC_DATA_NAMES["Solar photovoltaics"]] |
~self.standardised_asset_list[self.EPC_API_DATA_NAMES["photo-supply"]].isin(["0.0", 0, None, ""]) ~self.standardised_asset_list[self.EPC_API_DATA_NAMES["photo-supply"]].isin(["0.0", 0, None, ""])
) )
accepted_epc_property_types = ["House", "Flat", "Bungalow", "Maisonette"]
# The logic here is:
# 1) Take the property type provided by the HA themselves
# 2) In absence of that, take the EPC property type
# 3) Otherwise use None
self.standardised_asset_list[self.ATTRIBUTE_NUMBER_OF_FLOORS] = self.standardised_asset_list.apply(
lambda x: estimate_number_of_floors(
property_type=(
x[self.STANDARD_PROPERTY_TYPE].title() if
x[self.STANDARD_PROPERTY_TYPE].title() in accepted_epc_property_types else (
x[self.EPC_API_DATA_NAMES["property-type"]] if not
pd.isnull(x[self.EPC_API_DATA_NAMES["property-type"]]) else None
)
)
),
axis=1
)

View file

@ -514,7 +514,6 @@ def app():
find_my_epc_data["Solar photovoltaics"] = False find_my_epc_data["Solar photovoltaics"] = False
# Retrieve just the data we need # Retrieve just the data we need
epc_df = epc_df[ epc_df = epc_df[
[asset_list.DOMNA_PROPERTY_ID] + list(asset_list.EPC_API_DATA_NAMES.keys()) [asset_list.DOMNA_PROPERTY_ID] + list(asset_list.EPC_API_DATA_NAMES.keys())
].rename( ].rename(
@ -529,15 +528,14 @@ def app():
) )
asset_list.merge_data(epc_df) asset_list.merge_data(epc_df)
# TODO: TEMP!!!
epc_df["epc_os_uprn"] = epc_df["epc_os_uprn"].astype("Int64").astype(str)
asset_list.standardised_asset_list = asset_list.standardised_asset_list.merge(
epc_df, how="left", left_on="ordnance_survey_uprn", right_on="epc_os_uprn"
)
asset_list.extract_attributes() asset_list.extract_attributes()
asset_list["Has Solar PV"] = asset_list["Has Solar PV"] | ~asset_list["photo-supply"].isin(["0.0", 0, None, ""])
asset_list = asset_list.drop(columns=["photo-supply"])
# Rename the columns
asset_list = asset_list
asset_list["Estimated Number of Floors"] = asset_list.apply( asset_list["Estimated Number of Floors"] = asset_list.apply(
lambda x: estimate_number_of_floors(property_type=x["Property Type"]) if not pd.isnull( lambda x: estimate_number_of_floors(property_type=x["Property Type"]) if not pd.isnull(
x["Property Type"]) else None, axis=1 x["Property Type"]) else None, axis=1

View file

@ -205,7 +205,7 @@ def get_wall_u_value(
mapped_value = wall_uvalues_df[ mapped_value = wall_uvalues_df[
wall_uvalues_df["Wall_type"] == mapped_description wall_uvalues_df["Wall_type"] == mapped_description
][age_band].values[0] ][age_band].values[0]
if pd.isnull(mapped_value) and "Park home" in mapped_description: if pd.isnull(mapped_value) and "Park home" in mapped_description:
# We don't know enough in this case so we default to 0 # We don't know enough in this case so we default to 0
@ -428,6 +428,9 @@ def estimate_number_of_floors(property_type):
Using the property type, we estimate the number of floors in the property Using the property type, we estimate the number of floors in the property
""" """
if property_type is None:
return None
if property_type == "House": if property_type == "House":
number_of_floors = 2 number_of_floors = 2
elif property_type in ["Flat", "Bungalow"]: elif property_type in ["Flat", "Bungalow"]:
@ -560,7 +563,7 @@ def get_floor_u_value(
insulation_lookup = s11[ insulation_lookup = s11[
s11["Age_band"].str.contains(age_band) & s11["Floor_construction"] s11["Age_band"].str.contains(age_band) & s11["Floor_construction"]
== floor_type == floor_type
] ]
if insulation_lookup.empty: if insulation_lookup.empty:
insulation_thickness = 0 insulation_thickness = 0
else: else: