mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
updating how we simulate the impact of floor insultion
This commit is contained in:
parent
5bd6366ad2
commit
69d53c85f9
6 changed files with 65 additions and 9 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$/open_uprn" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/recommendations" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/recommendations" isTestSource="false" />
|
||||||
</content>
|
</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" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PyNamespacePackagesService">
|
<component name="PyNamespacePackagesService">
|
||||||
|
|
|
||||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
|
|
@ -3,7 +3,7 @@
|
||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Python 3.10 (backend)" />
|
<option name="sdkName" value="Python 3.10 (backend)" />
|
||||||
</component>
|
</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">
|
<component name="PythonCompatibilityInspectionAdvertiser">
|
||||||
<option name="version" value="3" />
|
<option name="version" value="3" />
|
||||||
</component>
|
</component>
|
||||||
|
|
|
||||||
|
|
@ -197,10 +197,11 @@ class Property:
|
||||||
if len(recommendation["parts"]) > 1:
|
if len(recommendation["parts"]) > 1:
|
||||||
raise NotImplementedError("Have more than 1 floor insulation part - handle this case")
|
raise NotImplementedError("Have more than 1 floor insulation part - handle this case")
|
||||||
|
|
||||||
recommendation_record["floor_thermal_transmittance_ending"] = recommendation["new_u_value"]
|
# recommendation_record["floor_thermal_transmittance_ending"] = recommendation["new_u_value"]
|
||||||
# We don't really see above average for this in the training data
|
# We don't really see above average for this in the training data
|
||||||
recommendation_record["floor_insulation_thickness_ending"] = "average"
|
recommendation_record["floor_insulation_thickness_ending"] = "average"
|
||||||
recommendation_record["floor_energy_eff_ending"] = "Good"
|
# This is rarely ever populated in the training data
|
||||||
|
# recommendation_record["floor_energy_eff_ending"] = "Good"
|
||||||
else:
|
else:
|
||||||
if recommendation_record["floor_thermal_transmittance_ending"] is None:
|
if recommendation_record["floor_thermal_transmittance_ending"] is None:
|
||||||
raise ValueError("We should not have a None value for the u value")
|
raise ValueError("We should not have a None value for the u value")
|
||||||
|
|
|
||||||
|
|
@ -75,8 +75,8 @@ def sap_to_epc(sap_points: int | float):
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if sap_points <= 0 or sap_points > 100:
|
if sap_points <= 0:
|
||||||
raise ValueError("SAP points should be between 1 and 100.")
|
raise ValueError("SAP points should be above 0.")
|
||||||
|
|
||||||
if sap_points >= 92:
|
if sap_points >= 92:
|
||||||
return "A"
|
return "A"
|
||||||
|
|
|
||||||
55
etl/testing_data/retrofitted_properties.py
Normal file
55
etl/testing_data/retrofitted_properties.py
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
"""
|
||||||
|
This script will create an input csv for the recommendation engine and upload it to S3, which can be used for
|
||||||
|
testing
|
||||||
|
"""
|
||||||
|
import pandas as pd
|
||||||
|
from utils.s3 import save_csv_to_s3
|
||||||
|
|
||||||
|
USER_ID = 8
|
||||||
|
PORTFOLIO_ID = 62
|
||||||
|
|
||||||
|
|
||||||
|
def app():
|
||||||
|
"""
|
||||||
|
This portfolio contains propertyies that we have demo'd in pilots, or properties that were provided to us
|
||||||
|
as proprties that are being treated under funding scehemes and we have pre/post EPRs for
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
test_file = pd.DataFrame(
|
||||||
|
[
|
||||||
|
# Pilot properties
|
||||||
|
{'address': '113 Tenby Road', 'postcode': 'B13 9LT', 'Notes': ''},
|
||||||
|
{'address': '139 School Road', 'postcode': 'B28 8JF', 'Notes': ''},
|
||||||
|
{'address': '77 Simmons Drive', 'postcode': 'B32 1SL', 'Notes': ''},
|
||||||
|
{'address': 'Flat 2, 54 Wedgewood Road', 'postcode': 'B32 1LS', 'Notes': ''},
|
||||||
|
# Warmfront ECO4 Properties
|
||||||
|
{'address': '73 Long Chaulden', 'postcode': 'HP1 2HX', 'Notes': ''},
|
||||||
|
{'address': '8 Lindlings', 'postcode': 'HP1 2HA', 'Notes': ''},
|
||||||
|
{'address': '44 Lindlings', 'postcode': 'HP1 2HE', 'Notes': ''},
|
||||||
|
{'address': '46 Chaulden Terrace', 'postcode': 'HP1 2AN', 'Notes': ''},
|
||||||
|
# Osmosis SHDF Properties
|
||||||
|
{'address': '4, Heather Shaw', 'postcode': 'BA14 7JS', 'Notes': ''},
|
||||||
|
{'address': '16 Glastonbury Road', 'postcode': 'M32 9PE', 'Notes': ''},
|
||||||
|
{'address': '31 Loddon Way', 'postcode': 'BA15 1HG', 'Notes': ''},
|
||||||
|
{'address': '62 Pearmain Drive', 'postcode': 'NG3 3DJ', 'Notes': ''},
|
||||||
|
]
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
# Store the data in s3
|
||||||
|
filename = f"{USER_ID}/{PORTFOLIO_ID}/eco4_shdf_retrofits.csv"
|
||||||
|
save_csv_to_s3(
|
||||||
|
dataframe=test_file,
|
||||||
|
bucket_name="retrofit-plan-inputs-dev",
|
||||||
|
file_name=filename
|
||||||
|
)
|
||||||
|
|
||||||
|
body = {
|
||||||
|
"portfolio_id": str(PORTFOLIO_ID),
|
||||||
|
"housing_type": "Social",
|
||||||
|
"goal": "Increase EPC",
|
||||||
|
"goal_value": "A",
|
||||||
|
"trigger_file_path": filename
|
||||||
|
}
|
||||||
|
print(body)
|
||||||
|
|
@ -5,8 +5,8 @@ from recommendations.Costs import Costs
|
||||||
class SolarPvRecommendations:
|
class SolarPvRecommendations:
|
||||||
# Approximate area of the solar panels
|
# Approximate area of the solar panels
|
||||||
SOLAR_PANEL_AREA = 1.6
|
SOLAR_PANEL_AREA = 1.6
|
||||||
# Wattage per panel
|
# Wattage per panel - this is based on the average wattage of a solar panel being between 250w and 420w
|
||||||
SOLAR_PANEL_WATTAGE = 360
|
SOLAR_PANEL_WATTAGE = 250
|
||||||
|
|
||||||
def __init__(self, property_instance):
|
def __init__(self, property_instance):
|
||||||
"""
|
"""
|
||||||
|
|
@ -47,7 +47,7 @@ class SolarPvRecommendations:
|
||||||
# of solar PV installations
|
# of solar PV installations
|
||||||
cost_result = self.costs.solar_pv(wattage=solar_panel_wattage)
|
cost_result = self.costs.solar_pv(wattage=solar_panel_wattage)
|
||||||
|
|
||||||
kw = int(np.round(solar_panel_wattage / 1000))
|
kw = np.floor(solar_panel_wattage / 100) / 10
|
||||||
|
|
||||||
self.recommendation = [
|
self.recommendation = [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue