From cda0ceb00909be04c674cb3213c954d2ab3eceb8 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 12 Sep 2023 17:27:28 +0100 Subject: [PATCH] recommendation api working locally --- backend/app/plan/router.py | 80 ++++++++++----------- model_data/optimiser/optimiser_functions.py | 3 +- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index ece9f452..3884592a 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -304,11 +304,6 @@ async def trigger_plan(body: PlanTriggerRequest): if not property_recommendations: continue - # We'll unlist the recommendations so they're a bit easier to handle from here onwards - property_recommendations = [ - rec for recommendations_by_type in property_recommendations for rec in recommendations_by_type - ] - recommendations[p.id] = property_recommendations # Finally, we'll prepare data for predicting the impact on SAP @@ -330,25 +325,26 @@ async def trigger_plan(body: PlanTriggerRequest): 'Suspended, no insulation (assumed)': 'Suspended, insulated (assumed)', 'Solid, no insulation (assumed)': 'Solid, insulated (assumed)', } - for rec in property_recommendations: - scoring_dict = { - "UPRN": p.data["uprn"], - "id": "+".join([str(p.id), str(rec["recommendation_id"])]), - "LOCAL_AUTHORITY": p.data["local-authority"], - **starting_epc_data.to_dict("records")[0], - **ending_epc_data.to_dict("records")[0], - **fixed_data.to_dict("records")[0] - } + for recommendations_by_type in property_recommendations: + for rec in recommendations_by_type: + scoring_dict = { + "UPRN": p.data["uprn"], + "id": "+".join([str(p.id), str(rec["recommendation_id"])]), + "LOCAL_AUTHORITY": p.data["local-authority"], + **starting_epc_data.to_dict("records")[0], + **ending_epc_data.to_dict("records")[0], + **fixed_data.to_dict("records")[0] + } - # We update the description to indicate it's insulated - if rec["type"] == "wall_insulation": - scoring_dict["WALLS_DESCRIPTION_ENDING"] = scoring_map[p.walls["clean_description"]] - elif rec["type"] == "floor_insulation": - scoring_dict["FLOOR_DESCRIPTION_ENDING"] = scoring_map[p.floor["clean_description"]] - else: - raise NotImplementedError("Implement me") + # We update the description to indicate it's insulated + if rec["type"] == "wall_insulation": + scoring_dict["WALLS_DESCRIPTION_ENDING"] = scoring_map[p.walls["clean_description"]] + elif rec["type"] == "floor_insulation": + scoring_dict["FLOOR_DESCRIPTION_ENDING"] = scoring_map[p.floor["clean_description"]] + else: + raise NotImplementedError("Implement me") - recommendations_scoring_data.append(scoring_dict) + recommendations_scoring_data.append(scoring_dict) recommendations_scoring_data = pd.DataFrame(recommendations_scoring_data) @@ -416,10 +412,14 @@ async def trigger_plan(body: PlanTriggerRequest): property = [p for p in input_properties if p.id == property_id][0] property_predictions = predictions[predictions["property_id"] == str(property_id)] - for rec in recommendations[property_id]: - rec["sap_points"] = property_predictions[property_predictions["recommendation_id"] == str( - rec["recommendation_id"] - )]["RDSAP_CHANGE"].values[0] + for recommendations_by_type in recommendations[property_id]: + for rec in recommendations_by_type: + rec["sap_points"] = property_predictions[property_predictions["recommendation_id"] == str( + rec["recommendation_id"] + )]["RDSAP_CHANGE"].values[0] + + if not rec["sap_points"]: + raise ValueError("Sap points missing") input_measures = prepare_input_measures(recommendations[property_id], body.goal) @@ -441,20 +441,22 @@ async def trigger_plan(body: PlanTriggerRequest): selected_recommendations = {r["id"] for r in solution} - # For selected recommendations, mark them as default - for rec in recommendations[property_id]: - rec["default"] = rec["recommendation_id"] in selected_recommendations - - for p in input_properties: - property_recommendations = [ + # We'll use the set of selected recommendations to filter the recommendations to upload + final_recommendations = [ [ {**rec, "default": True if rec["recommendation_id"] in selected_recommendations else False} for rec in recommendations_by_type ] - for recommendations_by_type in property_recommendations + for recommendations_by_type in recommendations[property_id] ] - input_measures = prepare_input_measures(property_recommendations, body.goal) + # We'll also unlist the recommendations so they're a bit easier to handle from here onwards + final_recommendations = [ + rec for recommendations_by_type in final_recommendations for rec in recommendations_by_type + ] + # We update recommendations[property_id] + + recommendations[property_id] = final_recommendations # 1) the property data # 2) the property details (epc) @@ -476,16 +478,6 @@ async def trigger_plan(body: PlanTriggerRequest): if not recommendations_to_upload: continue - property_predictions = predictions[predictions["property_id"] == str(p.id)] - for rec in recommendations_to_upload: - # Insert the prediction for sap points - rec["sap_points"] = property_predictions[property_predictions["recommendation_id"] == str( - rec["recommendation_id"] - )]["RDSAP_CHANGE"].values[0] - - if not rec["sap_points"]: - raise ValueError("Sap points missing") - # Create a plan new_plan_id = create_plan( session, diff --git a/model_data/optimiser/optimiser_functions.py b/model_data/optimiser/optimiser_functions.py index 6ff0050a..869880cf 100644 --- a/model_data/optimiser/optimiser_functions.py +++ b/model_data/optimiser/optimiser_functions.py @@ -17,7 +17,7 @@ def prepare_input_measures(property_recommendations, goal): raise NotImplementedError("Not implemented this gain type - investigate me") input_measures = [] - for rec in property_recommendations: + for recs in property_recommendations: input_measures.append( [ { @@ -26,6 +26,7 @@ def prepare_input_measures(property_recommendations, goal): "gain": rec[goal_key], "type": rec["type"] } + for rec in recs ] )