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 77c18e80..4f33bf34 100644 --- a/etl/eligibility/ha_15_32/ha_analysis_batch_3.py +++ b/etl/eligibility/ha_15_32/ha_analysis_batch_3.py @@ -2548,34 +2548,52 @@ def patch_cleaned(cleaned): return cleaned -def calculate_eco4_post_ciga(eligiblity_counts, input_data, ha_ciga_conversion_rate, eco4_rate): +def calculate_eco4_post_ciga( + eligiblity_counts, input_data, ha_ciga_conversion_rate, ha_ciga_pass_to_sale_rate, ha_eco4_to_sale_rate, + eco4_rate +): remaining_needing_ciga_check = eligiblity_counts[ eligiblity_counts["ECO Eligibility"] == "eco4 (subject to ciga)" ]["count"].sum() has_ciga_check = not input_data["ciga_list"].empty if has_ciga_check: - eco4_confirmed = eligiblity_counts[ - eligiblity_counts["ECO Eligibility"].isin( - ["eco4", "eco4 - passed ciga"] - ) - ]["count"].sum() + + eco4_no_ciga_needed = eligiblity_counts[ + eligiblity_counts["ECO Eligibility"] == "eco4" + ]["count"].sum() + + eco4_ciga_passed = eligiblity_counts[ + eligiblity_counts["ECO Eligibility"] == "eco4 - passed ciga" + ]["count"].sum() + + eco4_confirmed = (eco4_no_ciga_needed * ha_eco4_to_sale_rate) + (eco4_ciga_passed * ha_ciga_pass_to_sale_rate) + eco4_confirmed = np.round(eco4_confirmed) if remaining_needing_ciga_check > 0: # We update the eco4 post ciga with the converted remaining - eco4_remaining_forecast = np.round(remaining_needing_ciga_check * ha_ciga_conversion_rate) + eco4_remaining_forecast = np.round( + remaining_needing_ciga_check * ha_ciga_conversion_rate * ha_ciga_pass_to_sale_rate + ) eco4_post_ciga = eco4_confirmed + eco4_remaining_forecast else: eco4_remaining_forecast = 0 eco4_post_ciga = eco4_confirmed else: - eco4_confirmed = 0 - eco4_remaining_forecast = np.round(remaining_needing_ciga_check * ha_ciga_conversion_rate) + eco4_no_ciga_needed = eligiblity_counts[ + eligiblity_counts["ECO Eligibility"] == "eco4" + ]["count"].sum() + eco4_confirmed = np.round(eco4_no_ciga_needed * ha_eco4_to_sale_rate) + eco4_remaining_forecast = np.round( + remaining_needing_ciga_check * ha_ciga_conversion_rate * ha_ciga_pass_to_sale_rate + ) eco4_post_ciga = ( eligiblity_counts[eligiblity_counts["ECO Eligibility"] == "eco4"]["count"].sum() + eco4_remaining_forecast ) + eco4_post_ciga = int(eco4_post_ciga) eco4_remaining_forecast = int(eco4_remaining_forecast) + eco4_confirmed = int(eco4_confirmed) results = { # Counts @@ -2853,8 +2871,32 @@ def forecast_remaining_sales(loader): median_ciga_success_rate ) + # We also need the ha ciga passed to install success rate + ha_ciga_pass_to_sale = converted_ciga_jobs[converted_ciga_jobs["HA Name"] == ha_name] + if not ha_ciga_pass_to_sale.empty: + ha_ciga_pass_to_sale_rate = ( + ha_ciga_pass_to_sale["# Ciga dependent successfully installed"].values[0] / + ha_ciga_pass_to_sale["# Ciga dependent at installation"].values[0] + ) + else: + ha_ciga_pass_to_sale_rate = median_ciga_pass_to_install + + ha_eco4_to_sale = eco4_ciga_independent_passrates[eco4_ciga_independent_passrates["Ha Name"] == ha_name] + if not ha_eco4_to_sale.empty: + ha_eco4_to_sale_rate = ( + ha_eco4_to_sale['# ECO4 successfully installed'].values[0] / + ha_eco4_to_sale['# ECO4 at install stage'].values[0] + ) + else: + ha_eco4_to_sale_rate = median_eco4_to_install + eco4_post_ciga_total_results = calculate_eco4_post_ciga( - eligiblity_counts, input_data, ha_ciga_conversion_rate, eco4_rate + eligiblity_counts=eligiblity_counts, + input_data=input_data, + ha_ciga_conversion_rate=ha_ciga_conversion_rate, + ha_ciga_pass_to_sale_rate=ha_ciga_pass_to_sale_rate, + ha_eco4_to_sale_rate=ha_eco4_to_sale_rate, + eco4_rate=eco4_rate ) # Calculate the delta compared to Warmfront's original estimate @@ -2863,7 +2905,12 @@ def forecast_remaining_sales(loader): ) / original_warmfront_eco4 eco4_post_ciga_remaining_results = calculate_eco4_post_ciga( - eligiblity_counts_remaining, input_data, ha_ciga_conversion_rate, eco4_rate + eligiblity_counts=eligiblity_counts_remaining, + input_data=input_data, + ha_ciga_conversion_rate=ha_ciga_conversion_rate, + ha_ciga_pass_to_sale_rate=ha_ciga_pass_to_sale_rate, + ha_eco4_to_sale_rate=ha_eco4_to_sale_rate, + eco4_rate=eco4_rate ) to_append = { @@ -2906,7 +2953,7 @@ def forecast_remaining_sales(loader): } # Make sure nothing is forgotten due to duplicate multi-index keys - if len(to_append) != 18: + if len(to_append) != 22: raise ValueError("Something went wrong") results.append(to_append)