简体   繁体   English

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

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

I am learning API's but I have been using Pandas for data analysis for some time.我正在学习 API,但一段时间以来我一直在使用 Pandas 进行数据分析。 Can I send data to an API from a Pandas dataframe?我可以从 Pandas dataframe 向 API 发送数据吗?

For example, if I make up some time series data in a Pandas df and attempt to use df.to_json() .例如,如果我在 Pandas df 中组成一些时间序列数据并尝试使用df.to_json() Ultimate goal is here to make a Flask API that returns the median value of Value in the Pandas df.最终目标是在这里制作一个 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)

Is it possible (or bad practice) to send a years worth of time series data to an API to get processed?是否可以(或不好的做法)将价值数年的时间序列数据发送到 API 进行处理? Or how much data can be sent as FORM on an HTTP POST request?或者可以在 HTTP POST 请求中以 FORM 形式发送多少数据?

Here is something simple in Flask on a local route shown below which errors out.这是 Flask 中的一些简单内容,位于如下所示的本地路由上,错误输出。 This is just something I made up on the fly trying to figure it out.这只是我在飞行中试图弄清楚的东西。

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")

I dont get why the print on the flask side the prints are empty.我不明白为什么 flask 一侧的prints是空的。 Any tips greatly appreciated there isnt a lot of wisdom here to web server processes/design.任何提示都非常感谢 web 服务器进程/设计这里没有很多智慧。

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

Full trace back on the Flask side. 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 -

I got the code to work:) not using df.to_json() but populating an empty Python dictionary baggage_handler = {} with the data to send to the Flask App Api route to process the data.我得到了工作的代码:) 不使用df.to_json()而是填充一个空的 Python 字典baggage_handler = {}与要发送到 Flask 应用程序 Z72664DC0959F3B0C048391FA8 的数据的数据。

Also not super sure on best practices for how much data can be sent as an HTTP POST body but this appears to work on local host:)也不确定关于可以作为 HTTP POST 正文发送多少数据的最佳实践,但这似乎适用于本地主机:)

Flask APP: 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 Request script: 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