Estoy usando pycaret como mi flujo de trabajo de ML, traté de crear una API usando FastAPI. Esta es la primera vez que juego en el nivel de producción, por lo que estoy un poco confundido acerca de la API.
Tengo 10 características; age: float, live_province: str, live_city: str, live_area_big: str, live_area_small: str, sex: float, marital: float, bank: str, salario: float, cantidad: float y una etiqueta que contiene el valor binario (0 y 1).
Este es mi script para construir la API
from pydantic import BaseModel import numpy as np from pycaret.classification import * import uvicorn from fastapi import FastAPI app = FastAPI() model = load_model('catboost_cm_creditable') class Data(BaseModel): age: float live_province: str live_city: str live_area_big: str live_area_small: str sex: float marital: float bank: str salary: float amount: float input_dict = Data @app.post("/predict") def predict(model, input_dict): predictions_df = predict_model(estimator=model, data=input_dict) predictions = predictions_df['Score'][0] return predictions Cuando traté de ejecutar uvicorn script:app y fui a la documentación, no puedo encontrar el parámetro para mis funciones, los parámetros solo muestran el modelo y input_dict 
¿Cómo llevar mis características a los parámetros en la API?
Debe escribir sugerencias en su modelo Pydantic para que funcione con su FastAPI
Imagine que realmente está trabajando con Python estándar, cuando necesita documentar esa función,
def some_function(price: int) ->int: return priceCon Pydantic no hay nada diferente al ejemplo anterior.
class Data son en realidad una @dataclass de python con superpoderes (proviene de Pydantic)
from fastapi import Depends class Data(BaseModel): age: float live_province: str live_city: str live_area_big: str live_area_small: str sex: float marital: float bank: str salary: float amount: float @app.post("/predict") def predict(data: Data = Depends()): predictions_df = predict_model(estimator=model, data=data) predictions = predictions_df["Score"][0] return predictionsHay un pequeño truco, con Depends , obtendrá consultas únicas como cuando define cada campo por separado.
Su problema es con la definición de la función de la API. Agregó un argumento para su entrada de datos pero no le dijo a FastAPI su tipo. También asumo que no quiere usar el modelo que ha cargado globalmente en lugar de recibirlo como parámetro. Además, no necesita crear una instancia global para sus datos de entrada, ya que desea obtenerlos del usuario.
Por lo tanto, simplemente cambie la firma de su función a:
def predict(input_dict: Data):y eliminar la línea:
input_dict = Data (Que solo crea un Alias para su clase Data , llamado input_dict )
Terminarás con:
app = FastAPI() model = load_model('catboost_cm_creditable') class Data(BaseModel): age: float live_province: str live_city: str live_area_big: str live_area_small: str sex: float marital: float bank: str salary: float amount: float @app.post("/predict") def predict(input_dict: Data): predictions_df = predict_model(estimator=model, data=input_dict) predictions = predictions_df['Score'][0] return predictions Además, recomendaría cambiar el nombre de la clase Data a algo más claro y fácil de entender, incluso DataUnit sería mejor en mi opinión, ya que Data es demasiado general.