Попытка загрузить model.pickle в API, но поднять ``AttributeError: объект 'Data' не имеет атрибута 'columns' '' '

Я построил модель классификации с использованием pycaret и уже создал файл pickle. Затем я попытался создать API и загрузить файл рассола с помощью fastapi.

       import logging
import pickle
from pydantic import BaseModel
import numpy as np
from pycaret.classification import *

import uvicorn
from fastapi import FastAPI
from fastapi import Depends


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(data: Data = Depends()):
    predictions_df = predict_model(estimator=model, data=data)
    predictions = predictions_df["Score"][0]
    return predictions

Api работает безупречно, но дело в том, что я пытался протестировать api и дать ему входные данные на основе функций, которые он возвращает:

       INFO:     127.0.0.1:60235 - "POST /predict?age=24&live_province=DKI%20Jakarta&live_city=Jakarta%20Selatan&live_area_big=Pesanggrahan&live_area_small=Bintaro&sex=1&marital=2&bank=BCA&salary=7000000&amount=1000000 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 390, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/applications.py", line 179, in __call__
    await super().__call__(scope, receive, send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/applications.py", line 111, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc from None
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 566, in __call__
    await route.handle(scope, receive, send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 227, in handle
    await self.app(scope, receive, send)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 41, in app
    response = await func(request)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/routing.py", line 183, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/routing.py", line 135, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/concurrency.py", line 34, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "/Users/bhaskoromuthohar/anaconda3/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "./main.py", line 31, in predict
    predictions_df = predict_model(estimator=model, data=data)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/pycaret/classification.py", line 10700, in predict_model
    Xtest = prep_pipe_transformer.transform(data)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/sklearn/pipeline.py", line 549, in _transform
    Xt = transform.transform(Xt)
  File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/pycaret/preprocess.py", line 300, in transform
    data.columns = [str(i) for i in data.columns]
AttributeError: 'Data' object has no attribute 'columns'

! Вывод из документации fastapi

Думаю, проблема в том, как я загружаю рассол в API. Вы можете посоветовать, как правильно загружать рассол?

1 ответ

Я предполагаю, что ваша ошибка связана с этой строкой

def predict(data: Data = Depends()):

Чтобы объявить модель pydantic как обязательную, вам не нужно запускать Depends(). Просто используйте data: Data.

Depends используется только для внедрения зависимостей, но это не так.

См. Документацию для получения дополнительной информации о теле запроса https://fastapi.tiangolo.com/tutorial/body/

Другие вопросы по тегам