import pandas as pd import numpy as np from datetime import datetime # DAFTAR KOLOM SESUAI ERROR TERAKHIR (WAJIB LENGKAP) FEATURE_COLUMNS = [ "location", "amount", "customer_lat", "customer_long", "merchant_lat", "merchant_long", "distance_customer_merchant", "customer_city_population", "customer_no_transactions", "customer_no_orders", "customer_no_payments", "payments_per_order_ratio", "transactions_per_customer_ratio", "age", "customer_gender", "customer_job", "customer_place_name", "customer_zip_code", "merchant_id", "merchant_name", "transaction_type", "transaction_category", "hour_of_day", "day_of_week", "fraud_rate_by_location", "mean_amount_by_location", "avg_amount_per_transaction", "amount_per_city_pop", "amount_deviation_from_location_mean" ] def build_features(input_data: dict) -> pd.DataFrame: """ Build 1-row DataFrame with all features required by the model. Missing features are filled with safe defaults. """ now = datetime.now() feature_dict = { "location": input_data.get("location", 0), "amount": input_data.get("amount", 0), # customer "customer_lat": 0.0, "customer_long": 0.0, "customer_city_population": 0, "customer_no_transactions": 0, "customer_no_orders": 0, "customer_no_payments": 0, "payments_per_order_ratio": 0.0, "transactions_per_customer_ratio": 0.0, "age": 0, "customer_gender": np.nan, "customer_job": np.nan, "customer_place_name": np.nan, "customer_zip_code": np.nan, # merchant "merchant_id": np.nan, "merchant_name": np.nan, "merchant_lat": 0.0, "merchant_long": 0.0, # transaction "transaction_type": np.nan, "transaction_category": np.nan, # time "hour_of_day": now.hour, "day_of_week": now.weekday(), # engineered / aggregate "distance_customer_merchant": 0.0, "fraud_rate_by_location": 0.0, "mean_amount_by_location": 0.0, "avg_amount_per_transaction": 0.0, "amount_per_city_pop": 0.0, "amount_deviation_from_location_mean": 0.0, } df = pd.DataFrame([feature_dict]) # PASTIKAN URUTAN KOLOM SESUAI TRAINING df = df[FEATURE_COLUMNS] return df