mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
rounding up roof coverage %
This commit is contained in:
parent
e000c87cad
commit
acada27061
6 changed files with 50 additions and 11 deletions
|
|
@ -709,8 +709,13 @@ class SearchEpc:
|
|||
self.full_sap_epc = {}
|
||||
|
||||
# Finally, set a standardised address 1 and postcode
|
||||
self.address_clean = self.ordnance_survey_client.address_os
|
||||
self.postcode_clean = self.ordnance_survey_client.postcode_os
|
||||
self.address_clean = (
|
||||
self.ordnance_survey_client.address_os if self.ordnance_survey_client.address_os else self.address1
|
||||
)
|
||||
self.postcode_clean = (
|
||||
self.ordnance_survey_client.postcode_os if self.ordnance_survey_client.postcode_os else
|
||||
self.postcode
|
||||
)
|
||||
return
|
||||
|
||||
os_response = self.ordnance_survey_client.get_places_api()
|
||||
|
|
|
|||
|
|
@ -52,6 +52,10 @@ def patch_epc(patch, epc_records):
|
|||
"""
|
||||
|
||||
for patch_variable, patch_value in patch.items():
|
||||
|
||||
if patch_variable in ["address", "postcode"]:
|
||||
continue
|
||||
|
||||
if patch_value == "":
|
||||
continue
|
||||
if patch_variable in epc_records["original_epc"]:
|
||||
|
|
@ -268,9 +272,12 @@ async def trigger_plan(body: PlanTriggerRequest):
|
|||
postcode=config["postcode"],
|
||||
uprn=uprn,
|
||||
auth_token=get_settings().EPC_AUTH_TOKEN,
|
||||
os_api_key=get_settings().ORDNANCE_SURVEY_API_KEY
|
||||
os_api_key=get_settings().ORDNANCE_SURVEY_API_KEY,
|
||||
)
|
||||
epc_searcher.find_property()
|
||||
epc_searcher.ordnance_survey_client.built_form = config.get("built_form", None)
|
||||
epc_searcher.ordnance_survey_client.property_type = config.get("property_type", None)
|
||||
# For the moment, our OS API access is unavailable, so we skip and interpolate
|
||||
epc_searcher.find_property(skip_os=True)
|
||||
# Create a record in db
|
||||
property_id, is_new = create_property(
|
||||
session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean, epc_searcher.uprn
|
||||
|
|
|
|||
|
|
@ -63,6 +63,14 @@ class PropertyValuation:
|
|||
90093693: 279_000, # Based on Zoopla
|
||||
90055152: 149_000, # Based on Zoopla
|
||||
90028499: 238_000, # Based on Zoopla
|
||||
# IMMO Dudley Pilot 2- search by going to https://www.zoopla.co.uk/property/uprn/{uprn}/
|
||||
90039318: 177_000, # Based on Zoopla
|
||||
90038384: 170_000, # Based on Zoopla
|
||||
90105380: 185_000, # Based on Zoopla
|
||||
90124001: 165_000, # Based on Zoopla
|
||||
90013980: 148_000, # Based on Zoopla
|
||||
90087154: 184_000, # Based on Zoopla
|
||||
90046817: 167_000, # Based on Zoopla
|
||||
}
|
||||
|
||||
# We base our valuation uplifts on a number of sources
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ patches = [
|
|||
{
|
||||
'address': '116 Parkes Hall Road',
|
||||
'postcode': 'DY1 3RJ',
|
||||
'uprn': '90046817',
|
||||
'walls-description': 'Cavity wall, filled cavity',
|
||||
'walls-energy-eff': 'Average',
|
||||
'roof-description': 'Pitched, 270 mm loft insulation',
|
||||
|
|
@ -21,7 +22,7 @@ patches = [
|
|||
'mainheatcont-description': 'Programmer, room thermostat and TRVs',
|
||||
'mainheatc-energy-eff': 'Good',
|
||||
'lighting-description': 'Low energy lighting in 27% of fixed outlets',
|
||||
'lighting-energy-eff': 'Good',
|
||||
'lighting-energy-eff': 'Average',
|
||||
'floor-description': 'Solid, no insulation (assumed)',
|
||||
'secondheat-description': 'None',
|
||||
'current-energy-efficiency': '73',
|
||||
|
|
@ -39,7 +40,11 @@ patches = [
|
|||
# This is information that is found as a result of the non-invasives, that mean that certain measures
|
||||
# have been installed already. To reflect this in the front end, it is included in the recommendation, however
|
||||
# the cost is removed and instead, a message is presented saying that the measure is already installed.
|
||||
already_installed = []
|
||||
already_installed = [
|
||||
{
|
||||
'address': '28 Sangwin Road', 'postcode': 'WV14 9EQ', "already_installed": ["loft_insulation"]
|
||||
}
|
||||
]
|
||||
|
||||
non_invasive_recommendations = []
|
||||
|
||||
|
|
@ -58,13 +63,23 @@ def app():
|
|||
raw_asset_list["postcode"] = raw_asset_list["Full Address"].str.split(",").str[-1].str.strip()
|
||||
|
||||
# We're provided with number of bathrooms and number of bedrooms.
|
||||
# THe UPRNs are not the official ones
|
||||
asset_list = raw_asset_list.rename(
|
||||
columns={
|
||||
"No. of Beds": "n_bedrooms",
|
||||
"No. of WC's": "n_bathrooms"
|
||||
"No. of WC's": "n_bathrooms",
|
||||
'Property Type': 'property_type',
|
||||
'Architype': 'built_form'
|
||||
}
|
||||
)
|
||||
|
||||
# Remap the values
|
||||
asset_list["built_form"] = asset_list["built_form"].map({
|
||||
"SEMI DETACHED": "Semi-Detached",
|
||||
"MID TERRACE": "Mid-Terrace",
|
||||
"END TERRACE": "End-Terrace",
|
||||
})
|
||||
|
||||
# Store the asset list in s3
|
||||
filename = f"{USER_ID}/{PORTFOLIO_ID}/pilot.csv"
|
||||
save_csv_to_s3(
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ class EPCRecord:
|
|||
This method will clean the records using the data processor
|
||||
"""
|
||||
epc_data_processor = EPCDataProcessor(
|
||||
data=self.epc_record_as_dataframe("prepared_epc"),
|
||||
data=self.epc_record_as_dataframe("prepared_epc").copy(),
|
||||
run_mode="newdata",
|
||||
cleaning_averages=self.cleaning_data,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -56,14 +56,18 @@ class SolarPvRecommendations:
|
|||
if not is_valid_property_type or not is_valid_roof_type or not has_no_existing_solar_pv:
|
||||
return
|
||||
|
||||
solar_pv_percentage = self.property.solar_pv_percentage
|
||||
# We round up to the neaest 10%
|
||||
solar_pv_percentage = np.ceil(solar_pv_percentage * 10) / 10
|
||||
|
||||
# For the solar recommendations, we produce the following scenarios:
|
||||
# 1) Solar panels only, we present a high, medium and low coverage
|
||||
# 2) With and without battery
|
||||
roof_coverage_scenarios = [
|
||||
self.property.solar_pv_percentage - 0.1, self.property.solar_pv_percentage,
|
||||
solar_pv_percentage - 0.1, solar_pv_percentage,
|
||||
]
|
||||
if self.property.solar_pv_percentage <= 0.4:
|
||||
roof_coverage_scenarios.append(self.property.solar_pv_percentage + 0.1)
|
||||
if solar_pv_percentage <= 0.4:
|
||||
roof_coverage_scenarios.append(solar_pv_percentage + 0.1)
|
||||
# We make sure we haven't gone too low or high - we allow no more than 60% coverage
|
||||
roof_coverage_scenarios = [v for v in roof_coverage_scenarios if 0 <= v <= 0.6]
|
||||
# If we only have two scenarios, we add a coverage scenario 10% less than the smallest
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue