繁体   English   中英

如何将表单数据发送到 Flask 应用程序 API Pandas Dataframe

[英]How to send form data to Flask App API Pandas Dataframe

我正在学习 API,但一段时间以来我一直在使用 Pandas 进行数据分析。 我可以从 Pandas dataframe 向 API 发送数据吗?

例如,如果我在 Pandas df 中组成一些时间序列数据并尝试使用df.to_json() 最终目标是在这里制作一个 Flask API,它返回 Pandas df 中Value的中值。

import requests
import pandas as pd
import numpy as np 
from numpy.random import randint


np.random.seed(11)

rows,cols = 50000,1
data = np.random.rand(rows,cols) 
tidx = pd.date_range('2019-01-01', periods=rows, freq='T') 
df = pd.DataFrame(data, columns=['Value'], index=tidx)

median_val = df.Value.median()

print('[INFO]')
print(median_val)


print('[INFO]')
print(df.head())

json_data = df.to_json()

print('[Sending to API!]')

url = "http://127.0.0.1:5000/api/v1.0/median_val"
print(requests.post(url, json_data).text)

是否可以(或不好的做法)将价值数年的时间序列数据发送到 API 进行处理? 或者可以在 HTTP POST 请求中以 FORM 形式发送多少数据?

这是 Flask 中的一些简单内容,位于如下所示的本地路由上,错误输出。 这只是我在飞行中试图弄清楚的东西。

import numpy as np
import pandas as pd
import time, datetime
from datetime import datetime
import json
from flask import Flask, request, jsonify


#start flask app
app = Flask(__name__)



#Simple flask route to return Value average
@app.route("/api/v1.0/median_val", methods=['POST'])
def med_val():

    r = request.form.to_dict()
    print(r.keys())
    df = pd.json_normalize(r)
    print(df)

    if r.keys() == {'Date','Value'}:

        try:

            df = pd.json_normalize(r)
            df['Date'] = datetime.fromtimestamp(df['Date'].astype(float))
            df = pd.DataFrame(df,index=[0])
            df = df.set_index('Date')

            df['Value'] = df['Value'].astype(float)

            median_val = df.Value.median()

        except Exception as error:
            print("Internal Sever Error {}".format(error))
            error_str = str(error)
            return error_str, 500
        
        return json.dumps(median_val)


    else:
        print("Error on api route, rejected unable to process keys") 
        print("rejected unable to process keys")
        return 'Bad Request', 400



if __name__ == '__main__':
    print("Starting main loop")
    app.run(debug=True,port=5000,host="127.0.0.1")

我不明白为什么 flask 一侧的prints是空的。 任何提示都非常感谢 web 服务器进程/设计这里没有很多智慧。

r = request.form.to_dict()
print(r.keys())
df = pd.json_normalize(r)
print(df)

Flask 端的完整追溯。

dict_keys([])
Empty DataFrame
Columns: []
Index: [0]
Error on api route, rejected unable to process keys
rejected unable to process keys
127.0.0.1 - - [10/Feb/2021 07:50:44] "←[31m←[1mPOST /api/v1.0/median_val HTTP/1.1←[0m" 400 -

我得到了工作的代码:) 不使用df.to_json()而是填充一个空的 Python 字典baggage_handler = {}与要发送到 Flask 应用程序 Z72664DC0959F3B0C048391FA8 的数据的数据。

也不确定关于可以作为 HTTP POST 正文发送多少数据的最佳实践,但这似乎适用于本地主机:)

Flask APP:

import numpy as np
import pandas as pd
import time, datetime
from datetime import datetime
import json
from flask import Flask, request, jsonify


#start flask app
app = Flask(__name__)



#Simple flask route to return Value average
@app.route("/api/v1.0/median_val", methods=['POST'])
def med_val():

    r = request.form.to_dict()
    df = pd.json_normalize(r)
    print('incoming keys')
    print(r.keys())

    if r.keys() == {'Value'}: 
        print('keys are good')

        try:

            df = pd.json_normalize(r)
            df['Value'] = df['Value'].astype(float)

            median_val = df.Value.median()
            print('median value == ',median_val)

        except Exception as error:
            print("Internal Sever Error {}".format(error))
            error_str = str(error)
            return error_str, 00

        return json.dumps(median_val)

    else:
        print("Error on api route, rejected unable to process keys") 
        print("rejected unable to process keys")
        return 'Bad Request', 400


if __name__ == '__main__':
    print("Starting main loop")
    app.run(debug=True,port=5000,host="127.0.0.1")

HTTP 请求脚本:

import requests
import pandas as pd
import numpy as np 
from numpy.random import randint


np.random.seed(11)

rows,cols = 50000,1
data = np.random.rand(rows,cols) 
tidx = pd.date_range('2019-01-01', periods=rows, freq='T') 
df = pd.DataFrame(data, columns=['Value'], index=tidx)

median_val = df.Value.median()

print('[INFO]')
print(median_val)


print('[INFO]')
print(df.head())

#create an empty dictionary
baggage_handler = {}

print('[packaging some data!!]')
values_to_send = df.Value.tolist()
baggage_handler['Value'] = values_to_send


print('[Sending to API!]')

response = requests.post('http://127.0.0.1:5000/api/v1.0/median_val', data=baggage_handler)
print("RESPONCE TXT", response.json())
data = response.json()
print(data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM