from api.model import ModelService from api.schema.input_data import InputData def preprocess_input_data(input_data: InputData, model_service: ModelService) -> dict: personal = input_data.personal_info financial = input_data.financial_info contact = input_data.contact_info campaign = input_data.campaign_info macro = input_data.macro_info # <-- macro info model_input = { "default": financial.default, "housing": financial.housing, "loan": financial.loan, "campaign": campaign.campaign, "previous": campaign.previous, "macro_trend": macro.emp_var_rate * macro.euribor3m, "econ_health": macro.cons_conf_idx * macro.nr_employed, } # One-hot encoding kategori model_input["marital_married"] = 1 if personal.marital == "married" else 0 model_input["marital_single"] = 1 if personal.marital == "single" else 0 model_input["contact_cellular"] = 1 if contact.contact == "cellular" else 0 model_input["contact_telephone"] = 1 if contact.contact == "telephone" else 0 model_input["poutcome_failure"] = 1 if campaign.poutcome == "failure" else 0 model_input["poutcome_nonexistent"] = 1 if campaign.poutcome == "nonexistent" else 0 model_input["poutcome_success"] = 1 if campaign.poutcome == "success" else 0 for m in ["apr", "aug", "jul", "jun", "mar", "may", "nov", "oct", "sep"]: model_input[f"month_{m}"] = 1 if contact.month == m else 0 edu_types = [ "basic.4y", "basic.6y", "basic.9y", "high.school", "illiterate", "professional.course", "university.degree", ] for edu in edu_types: model_input[f"education_{edu}"] = 1 if personal.education_str == edu else 0 for j in ["cat1", "cat2", "cat3", "cat4", "other"]: model_input[f"job_categories_{j}"] = 1 if personal.job_category == j else 0 for a in ["struggling", "stable", "about to retire", "old age", "counting a last breathe"]: model_input[f"age_categories_{a}"] = 1 if personal.age_category == a else 0 for d in ["mon", "thu", "tue", "wed", "fri"]: model_input[f"day_of_week_{d}"] = 1 if contact.day_of_week == d else 0 # Tambahkan kolom yang model harapkan tapi tidak ada if model_service.expected_features is not None: for c in model_service.expected_features: model_input.setdefault(c, 0) return model_input