mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Added rightmove property valuation increase estimates
This commit is contained in:
parent
7a275deb6d
commit
03ca16bfc5
8 changed files with 137 additions and 19 deletions
2
.idea/Model.iml
generated
2
.idea/Model.iml
generated
|
|
@ -7,7 +7,7 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/open_uprn" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/recommendations" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.10 (model_data)" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.10 (backend)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PyNamespacePackagesService">
|
||||
|
|
|
|||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
|
|
@ -3,7 +3,7 @@
|
|||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.10 (backend)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (model_data)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (backend)" project-jdk-type="Python SDK" />
|
||||
<component name="PythonCompatibilityInspectionAdvertiser">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
|
|
|
|||
|
|
@ -282,16 +282,16 @@ async def trigger_plan(body: PlanTriggerRequest):
|
|||
property_id, is_new = create_property(
|
||||
session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean, epc_searcher.uprn
|
||||
)
|
||||
# if not is_new:
|
||||
# continue
|
||||
#
|
||||
# create_property_targets(
|
||||
# session,
|
||||
# property_id=property_id,
|
||||
# portfolio_id=body.portfolio_id,
|
||||
# epc_target=body.goal_value,
|
||||
# heat_demand_target=None
|
||||
# )
|
||||
if not is_new:
|
||||
continue
|
||||
|
||||
create_property_targets(
|
||||
session,
|
||||
property_id=property_id,
|
||||
portfolio_id=body.portfolio_id,
|
||||
epc_target=body.goal_value,
|
||||
heat_demand_target=None
|
||||
)
|
||||
|
||||
epc_records = {
|
||||
'original_epc': epc_searcher.newest_epc.copy(),
|
||||
|
|
|
|||
|
|
@ -71,6 +71,14 @@ class PropertyValuation:
|
|||
90013980: 148_000, # Based on Zoopla
|
||||
90087154: 184_000, # Based on Zoopla
|
||||
90046817: 167_000, # Based on Zoopla
|
||||
# Goldman Sachs Pilot for inrto - search by going to https://www.zoopla.co.uk/property/uprn/{uprn}/
|
||||
100070358888: 153_000, # Based on Zoopla
|
||||
10090436544: 282_000, # Based on Zoopla
|
||||
100070365751: 177_000, # Based on Zoopla
|
||||
10095952767: 168_000, # Based on Zoopla
|
||||
100070520130: 177_000, # Based on Zoopla
|
||||
100070333957: 185_000, # Based on Zoopla
|
||||
100070543258: 211_000, # Based on Zoopla
|
||||
}
|
||||
|
||||
# We base our valuation uplifts on a number of sources
|
||||
|
|
@ -108,6 +116,29 @@ class PropertyValuation:
|
|||
# {"start": "D", "end": "A", "increase_percentage": 0.017},
|
||||
]
|
||||
|
||||
# Found here: https://www.rightmove.co.uk/news/articles/property-news/green-premium-epc-ratings/
|
||||
# F -> C is + 15%
|
||||
# E -> C is +7%
|
||||
# D -> C is +3%
|
||||
RIGHTMOVE_MAPPING = [
|
||||
{"start": "G", "end": "C", "increase_percentage": 0.15},
|
||||
{"start": "G", "end": "B", "increase_percentage": 0.15},
|
||||
{"start": "G", "end": "A", "increase_percentage": 0.15},
|
||||
|
||||
{"start": "F", "end": "C", "increase_percentage": 0.15},
|
||||
{"start": "F", "end": "B", "increase_percentage": 0.15},
|
||||
{"start": "F", "end": "A", "increase_percentage": 0.15},
|
||||
|
||||
{"start": "E", "end": "C", "increase_percentage": 0.07},
|
||||
{"start": "E", "end": "B", "increase_percentage": 0.07},
|
||||
{"start": "E", "end": "A", "increase_percentage": 0.07},
|
||||
|
||||
{"start": "D", "end": "C", "increase_percentage": 0.03},
|
||||
{"start": "D", "end": "B", "increase_percentage": 0.03},
|
||||
{"start": "D", "end": "A", "increase_percentage": 0.03},
|
||||
|
||||
]
|
||||
|
||||
EPC_BANDS = ["G", "F", "E", "D", "C", "B", "A"]
|
||||
|
||||
@classmethod
|
||||
|
|
@ -159,14 +190,18 @@ class PropertyValuation:
|
|||
|
||||
msm_increase, lloyds_increase = cls.get_increase(epc_band_range)
|
||||
|
||||
# We now use the knight frank and nationwide data to get further valuation evidence, if we have it
|
||||
# We now use the knight frank, nationwide and Rightmove data to get further valuation evidence, if we have it
|
||||
kf_increase = [x for x in cls.KNIGHT_FRANK_MAPPING if x["start"] == current_epc and x["end"] == target_epc]
|
||||
nw_increase = [x for x in cls.NATIONWIDE_MAPPING if x["start"] == current_epc and x["end"] == target_epc]
|
||||
rm_increase = [x for x in cls.RIGHTMOVE_MAPPING if x["start"] == current_epc and x["end"] == target_epc]
|
||||
|
||||
kf_increase = kf_increase[0]["increase_percentage"] if kf_increase else None
|
||||
nw_increase = nw_increase[0]["increase_percentage"] if nw_increase else None
|
||||
rm_increase = rm_increase[0]["increase_percentage"] if rm_increase else None
|
||||
|
||||
all_increases = [x for x in [msm_increase, lloyds_increase, kf_increase, nw_increase] if x is not None]
|
||||
all_increases = [
|
||||
x for x in [msm_increase, lloyds_increase, kf_increase, nw_increase, rm_increase] if x is not None
|
||||
]
|
||||
|
||||
max_increase = max(all_increases)
|
||||
min_increase = min(all_increases)
|
||||
|
|
|
|||
|
|
@ -34,10 +34,6 @@ def app():
|
|||
low_memory=False
|
||||
)
|
||||
|
||||
z = epc_data[epc_data["MAINHEAT_DESCRIPTION"] == "Boiler and radiators, mains gas"]
|
||||
z["HOTWATER_DESCRIPTION"].value_counts()
|
||||
z["MAIN_FUEL"].value_counts()
|
||||
|
||||
# Filter on entries where we have a UPRN
|
||||
epc_data = epc_data[~pd.isnull(epc_data["UPRN"])]
|
||||
|
||||
|
|
|
|||
63
etl/customers/goldman/asset_list.py
Normal file
63
etl/customers/goldman/asset_list.py
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
import pandas as pd
|
||||
from utils.s3 import read_excel_from_s3
|
||||
from utils.s3 import save_csv_to_s3
|
||||
|
||||
PORTFOLIO_ID = 75
|
||||
USER_ID = 8
|
||||
|
||||
|
||||
def app():
|
||||
asset_list = [
|
||||
{
|
||||
"address": "19 Emily Gardens",
|
||||
"postcode": "B16 0ED",
|
||||
},
|
||||
{
|
||||
"address": "Flat 6 41 Bradford Street",
|
||||
"postcode": "B5 6HX",
|
||||
},
|
||||
{
|
||||
"address": "197 FIELD LANE",
|
||||
"postcode": "B32 4HL",
|
||||
},
|
||||
{
|
||||
"address": "FLAT 4 108 SUMMER ROAD",
|
||||
"postcode": "B23 6DY",
|
||||
},
|
||||
{
|
||||
"address": "1, St. Benedicts Road",
|
||||
"postcode": "B10 9DP",
|
||||
},
|
||||
{
|
||||
"address": "29 COOKSEY LANE",
|
||||
"postcode": "B44 9QL",
|
||||
},
|
||||
{
|
||||
"address": "40 TRITTIFORD ROAD",
|
||||
"postcode": "B13 0HG",
|
||||
}
|
||||
]
|
||||
|
||||
asset_list = pd.DataFrame(asset_list)
|
||||
|
||||
# Store the asset list in s3
|
||||
filename = f"{USER_ID}/{PORTFOLIO_ID}/pilot.csv"
|
||||
save_csv_to_s3(
|
||||
dataframe=asset_list,
|
||||
bucket_name="retrofit-plan-inputs-dev",
|
||||
file_name=filename
|
||||
)
|
||||
|
||||
# EPC C portoflio
|
||||
body = {
|
||||
"portfolio_id": str(PORTFOLIO_ID),
|
||||
"housing_type": "Private",
|
||||
"goal": "Increase EPC",
|
||||
"goal_value": "B",
|
||||
"trigger_file_path": filename,
|
||||
"already_installed_file_path": "",
|
||||
"patches_file_path": "",
|
||||
"non_invasive_recommendations_file_path": "",
|
||||
"budget": None,
|
||||
}
|
||||
print(body)
|
||||
25
etl/customers/goldman/epc_f_g_properties.py
Normal file
25
etl/customers/goldman/epc_f_g_properties.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import pandas as pd
|
||||
|
||||
|
||||
def app():
|
||||
"""
|
||||
Pulling the list of EPC G & F properties in Birmingham for Goldman Sachs
|
||||
"""
|
||||
epc_data = pd.read_csv(
|
||||
"local_data/all-domestic-certificates/domestic-E08000025-Birmingham/certificates.csv",
|
||||
low_memory=False
|
||||
)
|
||||
|
||||
epc_data = epc_data[~pd.isnull(epc_data["UPRN"])]
|
||||
epc_data["UPRN"] = epc_data["UPRN"].astype(int).astype(str)
|
||||
|
||||
# Get the newest EPC for each UPRN. We use LODGEMENT_DATE as a proxy for this
|
||||
epc_data["LODGEMENT_DATETIME"] = pd.to_datetime(epc_data["LODGEMENT_DATETIME"], format='mixed')
|
||||
|
||||
epc_data = epc_data.sort_values("LODGEMENT_DATETIME", ascending=False).drop_duplicates("UPRN")
|
||||
|
||||
# Get G & F properties
|
||||
epc_data = epc_data[epc_data["CURRENT_ENERGY_RATING"].isin(["G", "F"])]
|
||||
|
||||
# Save as an excel
|
||||
epc_data.to_excel("Birmingham EPC F & G Properties.xlsx", index=False)
|
||||
|
|
@ -359,7 +359,6 @@ class HeatingRecommender:
|
|||
**heating_simulation_config,
|
||||
**hotwater_simulation_config,
|
||||
**fuel_simulation_config,
|
||||
"hot_water_energy_eff_ending": "Good"
|
||||
}
|
||||
|
||||
boiler_costs = self.costs.boiler(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue