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 0ca28927..67139e40 100644 --- a/etl/eligibility/ha_15_32/ha_analysis_batch_3.py +++ b/etl/eligibility/ha_15_32/ha_analysis_batch_3.py @@ -517,6 +517,11 @@ class DataLoader: asset_list["Address3"].astype(str).str.lower().str.strip() + ", " + \ asset_list["Postcode"].astype(str).str.lower().str.strip() asset_list["matching_postcode"] = asset_list["Postcode"].astype(str).str.lower().str.strip() + elif ha_name == "HA8": + asset_list["matching_address"] = asset_list["AddressLine1"].astype(str).str.lower().str.strip() + ", " + \ + asset_list["AddressLine2"].astype(str).str.lower().str.strip() + ", " + \ + asset_list["Postcode"].astype(str).str.lower().str.strip() + asset_list["matching_postcode"] = asset_list["Postcode"].astype(str).str.lower().str.strip() elif ha_name == "HA9": asset_list["matching_address"] = asset_list["House Number"].astype(str).str.lower().str.strip() + ", " + \ asset_list["Address Line 1"].astype(str).str.lower().str.strip() + ", " + \ @@ -2293,6 +2298,30 @@ class DataLoader: def correct_ha49_survey_list(survey_list): return survey_list + @staticmethod + def correct_ha8_survey_list(survey_list): + # Split on / and take the first half + survey_list["Street / Block Name"] = survey_list["Street / Block Name"].str.split("/").str[0] + + survey_list["Street / Block Name"] = survey_list["Street / Block Name"].str.replace( + "WESTONIA COURT HOUSE", "Westonia Court" + ) + + survey_list["Street / Block Name"] = survey_list["Street / Block Name"].str.replace( + "Hillesdon Avenue", "Hillesden Avenue" + ) + + survey_list["Street / Block Name"] = survey_list["Street / Block Name"].str.replace( + "Weston Street", "Western Street" + ) + + # Remove placeholder rows where postcode is missing + survey_list = survey_list[ + ~pd.isnull(survey_list["Post Code"]) + ] + + return survey_list + @staticmethod def levenstein_match(matching_string, df): match_to = df["matching_address"].tolist() @@ -5464,7 +5493,7 @@ def forecast_remaining_sales(loader): def fml_data_pull(loader): has_bruh = [ - # "HA7", "HA14", "HA25", "HA39", "HA16", "HA28", "HA13", + "HA7", "HA14", "HA25", "HA39", "HA16", "HA28", "HA13", # Updated get_property_type_and_built_form, still needs running "HA50", "HA24", "HA15", "HA32", "HA28", "HA6", "HA1", "HA107", "HA41", "HA48", "HA2", "HA63", "HA12", "HA117", "HA35", "HA34", "HA56", "HA19", "HA18", "HA9", "HA27", "HA30", "HA31", "HA54", "HA49", @@ -5561,7 +5590,13 @@ def classify_loft(x): def fml_analysis(loader): assumed_ciga_pass_rate = 0.731 - has_bruh = ["HA7", "HA14", "HA25", "HA39", "HA16", "HA1"] + has_bruh = [ + "HA7", "HA14", "HA25", "HA39", "HA16", "HA28", "HA13", + # Updated get_property_type_and_built_form, still needs running + "HA50", "HA24", "HA15", "HA32", "HA28", "HA6", "HA1", "HA107", "HA41", "HA48", "HA2", "HA63", "HA12", + "HA117", "HA35", "HA34", "HA56", "HA19", "HA18", "HA9", "HA27", "HA30", "HA31", "HA54", "HA49", + # todo + ] no_ciga_cavity_descriptions = [ "Cavity wall, as built, insulated (assumed)", @@ -5597,12 +5632,13 @@ def fml_analysis(loader): results = [] wall_descriptions = [] - for ha_name in has_bruh: + for ha_name in tqdm(has_bruh): original_figures = loader.december_figures[ loader.december_figures["HA Name"] == ha_name ].copy() original_remaining = original_figures["ECO4 remaining"].values[0] + original_gbis_remaining = original_figures["GBIS remaining"].values[0] postcode_list_remaining = remaining_eligible_mapping[ha_name] # Read in the epc data @@ -5669,7 +5705,54 @@ def fml_analysis(loader): raise Exception("SOMETHING WENT WRONG") if any(fuck_this["ECO Eligibility"].str.contains("subject to archetype")): - raise Exception("DO THE DAMN ARCHETYPE CHECK BRO") + # We perform the archetype test. If the property is a house, we it needs to be detached, semi-detached + # or end terrace. If it's a bungalow, it must be attached + fuck_this["passes_archetype"] = None + fuck_this["passes_archetype"] = np.where( + (fuck_this["property-type"] == "House") & + (fuck_this["built-form"].isin(["Semi-Detached", "End-Terrace", "Detached"])), + True, + fuck_this["passes_archetype"] + ) + + fuck_this["passes_archetype"] = np.where( + (fuck_this["property-type"] == "Bungalow") & + (fuck_this["built-form"].isin(["Detached"])), + True, + fuck_this["passes_archetype"] + ) + + fuck_this["ECO Eligibility"] = np.where( + (fuck_this["ECO Eligibility"] == "eco4 (subject to ciga) (subject to archetype)") & + (fuck_this["passes_archetype"] == True), + "eco4 (subject to ciga)", + fuck_this["ECO Eligibility"] + ) + + # If failed the archetype check and needs a CIGA, it's not eligibile + fuck_this["ECO Eligibility"] = np.where( + (fuck_this["ECO Eligibility"] == "eco4 (subject to ciga) (subject to archetype)") & + (fuck_this["passes_archetype"] != True), + "not eligible", + fuck_this["ECO Eligibility"] + ) + + fuck_this["ECO Eligibility"] = np.where( + (fuck_this["ECO Eligibility"] == "eco4 (subject to archetype)") & + (fuck_this["passes_archetype"] == True), + "eco4", + fuck_this["ECO Eligibility"] + ) + + fuck_this["ECO Eligibility"] = np.where( + (fuck_this["ECO Eligibility"] == "eco4 (subject to archetype)") & + (fuck_this["passes_archetype"] != True), + "gbis", + fuck_this["ECO Eligibility"] + ) + + if any(fuck_this["ECO Eligibility"].str.contains("subject to archetype")): + raise Exception("DO THE DAMN ARCHETYPE CHECK BRO") # clean roof insulation fuck_this["roof_insulation_thickness"] = fuck_this["roof_insulation_thickness"].fillna("0") @@ -5685,6 +5768,9 @@ def fml_analysis(loader): fuck_this["roof_insulation_thickness"] = fuck_this[ "roof_insulation_thickness" ].str.replace("average", "150") + fuck_this["roof_insulation_thickness"] = fuck_this[ + "roof_insulation_thickness" + ].str.replace("above 150", "150") fuck_this["roof_classiciation"] = fuck_this.apply(lambda x: classify_loft(x), axis=1) @@ -5884,6 +5970,7 @@ def fml_analysis(loader): { "HA Name": ha_name, "Original ECO4 Estimate - Remaining": original_remaining, + "Original GGBIS Estimate - Remaining": original_gbis_remaining, "Postcode List - Remaining": postcode_list_remaining, # "Of which sold": sales_since_nov, "Of which ECO4 Eligible - Remaining": int(total_eco4_expectation), @@ -5927,7 +6014,8 @@ def app(): "HA1", "HA2", "HA6", "HA7", "HA9", "HA12", "HA13", "HA14", "HA15", "HA16", "HA18", "HA19", "HA24", "HA25", "HA27", "HA28", "HA30", "HA31", "HA32", "HA34", "HA35", "HA39", "HA41", "HA48", "HA49", "HA50", "HA54", "HA56", "HA63", "HA107", "HA117", - + # Added as of March 17th + "HA8", # New HAS "HAXX", "HAXXX", ]