我正在处理庞大的数据帧。我想避免在用户查询之间腌制。想知道我是否可以在Flask会话中保存DataFrame并从会话中访问它,从而避免酸洗。
我写了下面的代码,但我遇到了错误: [17578行x 319列]不是JSON可序列化的
#=====================================================================================
#=====================================================================================
@app.route('/start', methods=['GET', 'POST'])
def index():
if 'catalogueDF' in session:
if request.method == 'POST':
query = request.get_json('query') # Read user query
df = session['catalogueDF']
result = str(list(set(df['brandname']))[2])
else:
query = request.args.get('query')
result = 'User query: '+str(query)
else:
df = pd.read_excel('errorfree.xlsx', sheetname='Sheet1').fillna('NA')
df = pd.DataFrame([df[col].astype(str, na=False).str.lower() for col in df]).transpose()
session['catalogueDF'] = df
result = 'no query posted yet'
response = app.response_class(
response=json.dumps(result),
status=200,
mimetype='application/json'
)
return response
# Flask start of app
if __name__ == '__main__':
app.secret_key = os.urandom(24) # Sessions need encryption
app.run(debug = True)
答案 0 :(得分:2)
请澄清一下,您似乎想将DataFrame存储到flask会话中。
会话对象需要序列化,即session['my_object_name']
中存储的值必须是序列化的对象。
在将其保存到会话对象中之前,我发现将其转换成字典最简单:
dict_obj = df.to_dict('list')
sessions['data'] = dict_obj
要将另一个函数中的会话对象作为数据框检索,请将字典转换回原始数据框:
dict_obj = sessions['data'] if 'data' in session else ""
df = pd.DataFrame(dict_obj)
答案 1 :(得分:1)
如果我理解您的问题,似乎您需要将DataFrame存储到Flask会话中。不幸的是,Flask会话不了解pandas DataFrame。
但是,如果您确实需要保留它。您可以使用MessagePack将其存储为二进制文件。
data = df.to_msgpack()
session['data'] = data
阅读MessagePack
df1 = pd.read_mesgpack(session['data])
PS。在决定使用会话之前,请先检查会话的大小。