From 21348e76419e8abcc54b1dd27953050e0a7e63fa Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 27 Mar 2026 17:23:38 +0000 Subject: [PATCH] handling case of nothing to re-baseline --- backend/engine/engine.py | 90 ++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/backend/engine/engine.py b/backend/engine/engine.py index 43362935..76b6751d 100644 --- a/backend/engine/engine.py +++ b/backend/engine/engine.py @@ -718,58 +718,60 @@ async def model_engine(body: PlanTriggerRequest): scoring_data = p.base_difference_record.df.copy() rebaselining_scoring_data.append(scoring_data) - rebaselining_scoring_data = pd.concat(rebaselining_scoring_data) + rebaselining_scoring_data = ( + pd.concat(rebaselining_scoring_data) if len(rebaselining_scoring_data) else pd.DataFrame([]) + ) + predictions_by_model_and_uprn = {} if not rebaselining_scoring_data.empty: logger.info(f"{rebaselining_scoring_data.shape[0]} properties require re-baselineing") - # Trigger re-scoring - rebaselining_scoring_data["is_post_sap10_starting"] = True + # Trigger re-scoring + rebaselining_scoring_data["is_post_sap10_starting"] = True - rebaselining_response = model_api.predict_all( - df=rebaselining_scoring_data, - bucket=get_settings().DATA_BUCKET, - model_prefixes=model_api.BASELINE_MODEL_PREFIXES, - extract_ids=False, - extract_uprn=True - ) + rebaselining_response = model_api.predict_all( + df=rebaselining_scoring_data, + bucket=get_settings().DATA_BUCKET, + model_prefixes=model_api.BASELINE_MODEL_PREFIXES, + extract_ids=False, + extract_uprn=True + ) - # Update EPC records with new model predictions - input_properties_by_uprn = {int(p.uprn): p for p in input_properties if p.uprn is not None} + # Update EPC records with new model predictions + input_properties_by_uprn = {int(p.uprn): p for p in input_properties if p.uprn is not None} - # Pre-index predictions for each model by UPRN - model_names = [ - "retrofit_sap_baseline_predictions", - "retrofit_carbon_baseline_predictions", - "retrofit_heat_baseline_predictions", - ] - predictions_by_model_and_uprn = {} - for model in model_names: - df = rebaselining_response[model] - predictions_by_model_and_uprn[model] = dict(zip(df["uprn"].astype(int), df["predictions"])) + # Pre-index predictions for each model by UPRN + model_names = [ + "retrofit_sap_baseline_predictions", + "retrofit_carbon_baseline_predictions", + "retrofit_heat_baseline_predictions", + ] + for model in model_names: + df = rebaselining_response[model] + predictions_by_model_and_uprn[model] = dict(zip(df["uprn"].astype(int), df["predictions"])) - for uprn_int in rebaselining_scoring_data["uprn"].unique().astype(int): - try: - property_instance = input_properties_by_uprn[uprn_int] - if property_instance is None: - logger.warning(f"No property found for UPRN {uprn_int} during rebaselining update.") - continue - # Gather predictions for this UPRN + for uprn_int in rebaselining_scoring_data["uprn"].unique().astype(int): try: - new_sap = predictions_by_model_and_uprn["retrofit_sap_baseline_predictions"][uprn_int] - new_carbon = predictions_by_model_and_uprn["retrofit_carbon_baseline_predictions"][uprn_int] - new_heat_demand = predictions_by_model_and_uprn["retrofit_heat_baseline_predictions"][uprn_int] - except KeyError as e: - logger.warning(f"Missing prediction for UPRN {uprn_int}: {e}") - continue - # Update EPC record - property_instance.epc_record.insert_new_performance_values( - new_sap=new_sap, - new_epc=sap_to_epc(new_sap), - new_carbon=new_carbon, - new_heat_demand=new_heat_demand, - ) - except Exception as e: - logger.error(f"Error updating EPC record for UPRN {uprn_int}: {e}") + property_instance = input_properties_by_uprn[uprn_int] + if property_instance is None: + logger.warning(f"No property found for UPRN {uprn_int} during rebaselining update.") + continue + # Gather predictions for this UPRN + try: + new_sap = predictions_by_model_and_uprn["retrofit_sap_baseline_predictions"][uprn_int] + new_carbon = predictions_by_model_and_uprn["retrofit_carbon_baseline_predictions"][uprn_int] + new_heat_demand = predictions_by_model_and_uprn["retrofit_heat_baseline_predictions"][uprn_int] + except KeyError as e: + logger.warning(f"Missing prediction for UPRN {uprn_int}: {e}") + continue + # Update EPC record + property_instance.epc_record.insert_new_performance_values( + new_sap=new_sap, + new_epc=sap_to_epc(new_sap), + new_carbon=new_carbon, + new_heat_demand=new_heat_demand, + ) + except Exception as e: + logger.error(f"Error updating EPC record for UPRN {uprn_int}: {e}") kwh_client = KwhData(bucket=get_settings().DATA_BUCKET, read_consumption_data=True)