from fastapi import FastAPI, File, UploadFile, Response
from fastapi.responses import HTMLResponse
import pandas as pd
import numpy as np
import pickle
from io import BytesIO
app = FastAPI()
# Cargar modelo y datos estáticos al iniciar la aplicación
model1 = None
df1 = None
@app.on_event("startup")
def load_assets():
global model1, df1
with open('mejor_modelo_score_febrero_25.pkl', 'rb') as f:
model1 = pickle.load(f)
df1 = pd.read_excel('df1.xlsx')
@app.get("/", response_class=HTMLResponse)
def read_root():
return """
API de Predicción
API Funcional 🚀
Bienvenido al sistema de predicción de riesgo.
Usa el endpoint /model_predict via POST con un archivo XLSX para obtener predicciones.
Estado del servicio: Operativo
"""
@app.post("/model_predict")
async def model_predict(file: UploadFile = File(...)):
content = await file.read()
data = pd.read_excel(BytesIO(content))
predacierta = model1.predict_proba(data)
predacierta = [p[1] for p in predacierta]
prediccion_acierta = pd.Series(predacierta, name='prob_90')
prediccionrf = pd.concat([df1, prediccion_acierta], axis=1)
risk_class = []
for row in prediccionrf['prob_90']:
if row > 0.1000039:
risk_class.append('Extremo')
elif row > 0.0500117:
risk_class.append('Muy Alto')
elif row > 0.0200018:
risk_class.append('Alto')
elif row > 0.0060008:
risk_class.append('Moderado')
elif row > 0.0020001:
risk_class.append('Bajo')
else:
risk_class.append('Muy Bajo')
prediccionrf['risk_class'] = risk_class
prediccionrf['Score'] = 99.9 - prediccionrf['prob_90'] * 100
csv_data = prediccionrf.to_csv(index=False)
return Response(
content=csv_data,
media_type="text/csv",
headers={"Content-Disposition": "attachment; filename=predicciones.csv"}
)