Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧传递给用于NLP ML的FastAPI_Python_Pandas_Dataframe_Machine Learning_Pydantic - Fatal编程技术网

Python 将数据帧传递给用于NLP ML的FastAPI

Python 将数据帧传递给用于NLP ML的FastAPI,python,pandas,dataframe,machine-learning,pydantic,Python,Pandas,Dataframe,Machine Learning,Pydantic,我第一次尝试部署NLP ML模型。为此,有人建议我使用FastAPI和uvicorn。我在让FastAPI做出响应方面取得了一些成功;但是,我无法成功地传递数据帧并让它处理它。我尝试使用字典,甚至尝试将传递的json转换为数据帧 使用data\u dict=data.dict()我得到: ValueError:需要对原始文本文档进行Iterable,收到字符串对象。 使用data\u dict=pd.DataFrame(data.dict())我得到: ValueError:如果使用所有标量值,

我第一次尝试部署NLP ML模型。为此,有人建议我使用FastAPI和uvicorn。我在让FastAPI做出响应方面取得了一些成功;但是,我无法成功地传递数据帧并让它处理它。我尝试使用字典,甚至尝试将传递的json转换为数据帧

使用
data\u dict=data.dict()
我得到:
ValueError:需要对原始文本文档进行Iterable,收到字符串对象。

使用
data\u dict=pd.DataFrame(data.dict())
我得到:
ValueError:如果使用所有标量值,则必须传递索引

我相信我理解这个问题,我的数据类需要一个字符串,而这个字符串不是;但是,我无法确定如何设置和/或传递期望的数据,以便fit_transform()能够工作。最终,我将根据提交的消息值返回一个预测。如果我可以传递一个包含1行或更多行的数据帧,并对每一行进行预测并返回,则会得到额外的奖励。响应将包括id、项目和预测,以便我们将来能够利用此响应将预测发布回原始(请求)系统

test_connection.py

main.py


可能不是最优雅的解决方案,但我使用以下方法取得了进展:

def predict(data: Data):
    data_dict = pd.DataFrame(
        {
            'id': [data.id],
            'project': [data.project],
            'messages': [data.messages]
        }
    )

可能不是最优雅的解决方案,但我使用以下方法取得了进展:

def predict(data: Data):
    data_dict = pd.DataFrame(
        {
            'id': [data.id],
            'project': [data.project],
            'messages': [data.messages]
        }
    )

我可以通过简单地将
数据.消息
转换成一个列表来解决这个问题。我还必须做一些不相关的更改,因为我无法pickle我的向量器(字符串标记器)


我可以通过简单地将
数据.消息
转换成一个列表来解决这个问题。我还必须做一些不相关的更改,因为我无法pickle我的向量器(字符串标记器)


取消对剩余代码tfidf_vect的注释以进行预测、预测,并尝试
返回{“预测”:预测}会导致在输入数据`中以
结尾的数据转储,并出现错误
JSONDecodeError:期望值:第1行第1列(char 0)
取消对剩余代码tfidf_vect的注释以进行预测、预测,尝试
返回{“Prediction”:Prediction}会导致在输入数据中转储以
结尾的数据,并导致错误
jsondecoderror:期望值:第1行第1列(char 0)
如果没有
main.py
中的
DataFrame
,您就不能这样做吗<代码>拟合转换(data.messages)?否,这是我收到ValueError字符串时的状态。很抱歉,这在我的帖子中不清楚,但这些错误实际上发生在fit_transform()步骤中。我要补充的是,我没有尝试使用点符号,我只尝试使用括号。不确定是否有区别,但会尝试一下。跳过整个数据_dict=data.dict()并简单地使用data.messages不起作用。问题是在我的数据类中,我将数据特征定义为str,而fit_transofrm需要原始文本文档。我的错误-名称
消息
错误-我以为它给出了消息列表。对于单个消息(单个字符串),我将使用name
message
而不使用
s
如果没有
main.py中的
DataFrame
,您就不能这样做吗<代码>拟合转换(data.messages)
?否,这是我收到ValueError字符串时的状态。很抱歉,这在我的帖子中不清楚,但这些错误实际上发生在fit_transform()步骤中。我要补充的是,我没有尝试使用点符号,我只尝试使用括号。不确定是否有区别,但会尝试一下。跳过整个数据_dict=data.dict()并简单地使用data.messages不起作用。问题是在我的数据类中,我将数据特征定义为str,而fit_transofrm需要原始文本文档。我的错误-名称
消息
错误-我以为它给出了消息列表。对于单个消息(单个字符串),我将使用name
message
而不使用
s
def predict(data: Data):
    data_dict = pd.DataFrame(
        {
            'id': [data.id],
            'project': [data.project],
            'messages': [data.messages]
        }
    )
import pickle
import pandas as pd
import numpy as np
import json
import time
from pydantic import BaseModel
from sklearn.feature_extraction.text import TfidfVectorizer

# Server / endpoint
import uvicorn
from fastapi import FastAPI
# Model
import xgboost as xgb


app = FastAPI(debug=True)

clf = pickle.load(open('data/xgbmodel.pickle', 'rb'))
vect = pickle.load(open('data/tfidfvect.pickle', 'rb'))

class Data(BaseModel):
    id: str = None
    project: str
    messages: str

@app.get("/ping")
async def ping():
    return {"ping": "pong"}

@app.post("/predict/")
def predict(data: Data):
    start = time.time()
    data_l = [data.messages] # make messages iterable.
    to_predict = vect.transform(data_l)
    prediction = clf.predict(to_predict)

    exec_time = round((time.time() - start), 3)
    return {
        "id": data.id,
        "project": data.project,
        "prediction": prediction[0], 
        "execution_time": exec_time
        }

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)