test / app.py
Denizscodes's picture
Update app.py
702bd2c verified
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
import pandas as pd
from fastapi.middleware.cors import CORSMiddleware
# 1. Uygulamayı Başlat
app = FastAPI(title="Credit Risk API", description="Kredi Risk Tahmin Modeli Servisi")
# 2. CORS Ayarları (Frontend'in bu API'ye erişebilmesi için gerekli)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Güvenlik için gerçek projede sadece frontend URL'ini yazın
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 3. Eğitilmiş Modeli Yükle
try:
model = joblib.load('credit_risk_model.pkl')
print("Model başarıyla yüklendi.")
except Exception as e:
print(f"Model yüklenirken hata oluştu: {e}")
# Hata durumunda boş bir model değişkeni (Uygulama çökmesin diye)
model = None
# 4. Veri Modeli (Frontend'den beklenen veri formatı)
# Buradaki isimler CSV'deki kolon isimleriyle birebir aynı olmalı.
class LoanApplication(BaseModel):
person_age: int
person_income: float
person_home_ownership: str # Örn: RENT, OWN, MORTGAGE
person_emp_length: float
loan_intent: str # Örn: EDUCATION, MEDICAL, VENTURE
loan_grade: str # Örn: A, B, C, D
loan_amnt: float
loan_int_rate: float
loan_percent_income: float
cb_person_default_on_file: str # Y veya N
cb_person_cred_hist_length: int
# 5. Ana Sayfa (Health Check)
@app.get("/")
def read_root():
return {"message": "Credit Risk API Çalışıyor! /docs adresine giderek test edebilirsin."}
# 6. Tahmin Endpoint'i
@app.post("/predict")
def predict_risk(data: LoanApplication):
if not model:
raise HTTPException(status_code=500, detail="Model yüklenemedi, sunucu hatası.")
# Gelen veriyi (JSON) Pandas DataFrame'e çevir
# Çünkü modelimiz (Pipeline) DataFrame bekliyor.
input_df = pd.DataFrame([data.dict()])
try:
# Tahmin Yap
prediction = model.predict(input_df)[0] # 0 veya 1 döner
probability = model.predict_proba(input_df)[0][1] # 1 olma (Batık) ihtimali
# Sonucu Hazırla
result = {
"prediction": int(prediction),
"risk_score": round(float(probability), 4),
"risk_status": "Yüksek Risk (Red)" if prediction == 1 else "Düşük Risk (Onay)",
"risk_percentage": f"%{round(probability * 100, 2)}"
}
return result
except Exception as e:
raise HTTPException(status_code=500, detail=f"Tahmin sırasında hata: {str(e)}")
# Bu dosya 'python main.py' ile çalıştırılırsa uvicorn'u tetikle
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)