簡體   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