splitting out post ciga figures

This commit is contained in:
Khalim Conn-Kowlessar 2024-03-01 18:37:47 +00:00
parent c47af474b9
commit 752f0b0f83

View file

@ -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)