From e966dfdf6e785cbcc1e2245cce852e842d0def92 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 6 Mar 2024 16:22:20 +0000 Subject: [PATCH] Adding cancellations to output --- .../ha_15_32/ha_analysis_batch_3.py | 68 +++++++++++++------ 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/etl/eligibility/ha_15_32/ha_analysis_batch_3.py b/etl/eligibility/ha_15_32/ha_analysis_batch_3.py index d4c3f74f..09b0910e 100644 --- a/etl/eligibility/ha_15_32/ha_analysis_batch_3.py +++ b/etl/eligibility/ha_15_32/ha_analysis_batch_3.py @@ -3301,6 +3301,10 @@ def forecast_remaining_sales(loader): # For any sales surveys that are complete, that could still cancel, we apply a conversion rate eco4_actually_sold = 0 gbis_actually_sold = 0 + eco4_confirmed_cancellations = 0 + eco4_expected_cancellations = 0 + gbis_confirmed_cancellations = 0 + gbis_expected_cancellations = 0 if not survey_list.empty: surveys_with_eligibility = survey_list.merge( asset_list[["asset_list_row_id", "ECO Eligibility"]], @@ -3308,34 +3312,54 @@ def forecast_remaining_sales(loader): ) completed_eco4_sales = surveys_with_eligibility[ surveys_with_eligibility["installation_status"] == "ECO4 - installed" - ] + ].shape[0] incomplete_eco4_sales = surveys_with_eligibility[ (surveys_with_eligibility["installation_status"] == "ECO4 - in progress") & (~surveys_with_eligibility["ECO Eligibility"].isin( ["eco4 - passed ciga"]) ) - ] + ].shape[0] incomplete_eco4_sales_ciga = surveys_with_eligibility[ (surveys_with_eligibility["installation_status"] == "ECO4 - in progress") & (surveys_with_eligibility["ECO Eligibility"].isin( ["eco4 - passed ciga"]) ) - ] + ].shape[0] - eco4_actually_sold = (completed_eco4_sales.shape[0] * eco4_rate) + ( - incomplete_eco4_sales.shape[0] * ha_eco4_to_sale_rate + - incomplete_eco4_sales_ciga.shape[0] * ha_ciga_pass_to_sale_rate - ) * eco4_rate + eco4_confirmed_cancellations = surveys_with_eligibility[ + surveys_with_eligibility["installation_status"] == "ECO4 - cancelled" + ].shape[0] + + expected_eco4_sales_no_ciga = np.round(incomplete_eco4_sales * ha_eco4_to_sale_rate) + expected_eco4_sales_ciga = np.round(incomplete_eco4_sales_ciga * ha_ciga_pass_to_sale_rate) + + eco4_expected_cancellations = (incomplete_eco4_sales + incomplete_eco4_sales_ciga) - ( + expected_eco4_sales_no_ciga + expected_eco4_sales_ciga + ) + eco4_expected_cancellations = int(np.round(eco4_expected_cancellations)) + + eco4_actually_sold = eco4_rate * ( + completed_eco4_sales + expected_eco4_sales_no_ciga + expected_eco4_sales_ciga + ) completed_gbis_sales = surveys_with_eligibility[ surveys_with_eligibility["installation_status"] == "GBIS - installed" - ] + ].shape[0] incomplete_gbis_sales = surveys_with_eligibility[ (surveys_with_eligibility["installation_status"] == "GBIS - in progress") - ] + ].shape[0] - gbis_actually_sold = completed_gbis_sales.shape[0] * gbis_rate + ( - incomplete_gbis_sales.shape[0] * ha_gbis_sale_conversion * gbis_rate + # Get confirmed cancellations + gbis_confirmed_cancellations = surveys_with_eligibility[ + surveys_with_eligibility["installation_status"] == "GBIS - cancelled" + ].shape[0] + + expected_gbis_unconfirmed_sales = incomplete_gbis_sales * ha_gbis_sale_conversion + + gbis_expected_cancellations = int(incomplete_gbis_sales - expected_gbis_unconfirmed_sales) + + gbis_actually_sold = completed_gbis_sales * gbis_rate + ( + expected_gbis_unconfirmed_sales * gbis_rate ) # Add in the variance: @@ -3381,6 +3405,9 @@ def forecast_remaining_sales(loader): ("ECO4 pre-ciga", "", "VARIANCE - TOTAL", ""): variance_total, ("ECO4 pre-ciga", "", "VARIANCE - REMAINING", ""): variance_remaining, ("ECO4 pre-ciga", "", "Sold - £", ""): eco4_actually_sold, + ("ECO4 pre-ciga", "", "Confirmed cancellations - £", ""): eco4_confirmed_cancellations, + # This is for jobs that are in-progress and could still cancel + ("ECO4 pre-ciga", "", "Unconfirmed cancellations - £", ""): eco4_expected_cancellations, ("ECO4 pre-ciga", "", "Remaining - £", ""): eco4_pre_ciga_remaining_revenue, # ECO4 - asset list, post ciga, total ("ECO4 post-ciga", "", "Estimated total eligible - #", "ECO4 total"): @@ -3403,6 +3430,13 @@ def forecast_remaining_sales(loader): eco4_post_ciga_remaining_results["Of which forecast - #"], ("ECO4 post-ciga", "", "Of which forecast - £", ""): eco4_post_ciga_remaining_results["Of which forecast - £"], + # Expected ECO4 cancellations + ("ECO4 Cancellations", "", "Of which expected cancellations - #", ""): eco4_post_ciga_remaining_results[ + "Expected cancellations - #" + ], + ("ECO4 Cancellations", "", "Of which expected cancellations - £", ""): eco4_post_ciga_remaining_results[ + "Expected cancellations - £" + ], # CIGA failures ("ECO4 CIGA failures", "", "Estimated total - failed CIGA - #", ""): eco4_post_ciga_remaining_results[ 'Estimated total - failed CIGA' @@ -3422,17 +3456,13 @@ def forecast_remaining_sales(loader): ("ECO4 CIGA failures", "", "Estimated failures - £", ""): eco4_post_ciga_remaining_results[ "Estimated CIGA failures - £" ], - # Expected ECO4 cancellations - ("ECO4 Cancellations", "", "Expected cancellations - #", ""): eco4_post_ciga_remaining_results[ - "Expected cancellations - #" - ], - ("ECO4 Cancellations", "", "Expected cancellations - £", ""): eco4_post_ciga_remaining_results[ - "Expected cancellations - £" - ], # GBIS postcode list ("GBIS Postcode list", "Warmfront post code list", "Total - #", "GBIS total"): gbis_total, ("GBIS Postcode list", "Warmfront post code list", "Total - £", "GBIS total"): gbis_total_revenue, ("GBIS Postcode list", "Warmfront post code list", "Sold - £", "GBIS total"): gbis_actually_sold, + ("GBIS Postcode list", "", "Confirmed cancellations - £", ""): gbis_confirmed_cancellations, + # This is for jobs that are in-progress and could still cancel + ("GBIS Postcode list", "", "Unconfirmed cancellations - £", ""): gbis_expected_cancellations, ("GBIS Postcode list", "Warmfront post code list", "Remaining - #", "GBIS total"): gbis_remaining, ("GBIS Postcode list", "Warmfront post code list", "Remaining - £", "GBIS total"): gbis_remaining_revenue, ("GBIS Postcode list", "", "Delta vs original estimate, remaining - %", ""): @@ -3440,7 +3470,7 @@ def forecast_remaining_sales(loader): } # Make sure nothing is forgotten due to duplicate multi-index keys - if len(to_append) != 41: + if len(to_append) != 45: raise ValueError("Something went wrong") results.append(to_append)