Spaces:
Sleeping
Sleeping
| 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 | |
| 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] | |
| def predict(data: Transaction): | |
| X = prepare_input(data.dict()) | |
| prediction = model.predict(X) | |
| return {"is_fraud": int(prediction[0])} | |