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)