from fastapi import FastAPI from fastapi.responses import RedirectResponse import joblib import pandas as pd import numpy as np from pydantic import BaseModel # 1. Configuration de l'API app = FastAPI(title="Fraud Detection API") # 2. Chargement du modèle (assure-toi que le nom correspond) model = joblib.load('fraud_model_hashing.pkl') # 3. Redirection automatique vers /docs @app.get("/", include_in_schema=False) def root(): return RedirectResponse(url="/docs") # 4. Schéma des données d'entrée class Transaction(BaseModel): amt: float trans_date_trans_time: str dob: str lat: float long: float merch_lat: float merch_long: float city_pop: float category: str gender: str state: str merchant: str job: str cc_num: int # 5. Ta fonction de préparation (adaptée pour une seule ligne) def prepare_input(data: dict): df = pd.DataFrame([data]) # Calculs rapides (similaires à ton make_features) dt = pd.to_datetime(df["trans_date_trans_time"]) df["hour"], df["day_of_week"] = dt.dt.hour, dt.dt.dayofweek df["day"], df["month"] = dt.dt.day, dt.dt.month dob = pd.to_datetime(df["dob"]) df["age"] = ((dt - dob).dt.days / 365.25).astype("float32") # Distance Haversine lat1, lon1 = np.radians(df["lat"]), np.radians(df["long"]) lat2, lon2 = np.radians(df["merch_lat"]), np.radians(df["merch_long"]) d = np.sin((lat2-lat1)/2)**2 + np.cos(lat1)*np.cos(lat2)*np.sin((lon2-lon1)/2)**2 df["distance"] = (6371 * 2 * np.arcsin(np.sqrt(d))).astype("float32") # Valeurs par défaut pour les agrégats (car une API reçoit souvent 1 seule transaction) df["avg_amt"] = df["amt"] df["std_amt"] = 0.0 df["nb_trans"] = 1.0 cols = ['amt', 'hour', 'day_of_week', 'day', 'month', 'age', 'lat', 'long', 'city_pop', 'distance', 'avg_amt', 'std_amt', 'nb_trans', 'category', 'gender', 'state', 'merchant', 'job'] return df[cols] @app.post("/predict") def predict(data: Transaction): X = prepare_input(data.dict()) prediction = model.predict(X) return {"is_fraud": int(prediction[0])}