DavidJyes's picture
Update app.py
d659d83 verified
Raw
History Blame
2.16 kB
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])}