尝试将 Pandas 数据帧加载到 Flask 会话中并在整个会话中使用它

Sun*_*nte 5 python session flask pandas

我正在处理一个巨大的数据框。我想避免在用户查询之间进行酸洗。想知道我是否可以在 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)
Run Code Online (Sandbox Code Playgroud)

6LY*_*TH3 1

此方法仅支持 pandas 版本 0.24.2 或更低版本的 pandas 新版本 MessagePack 已过时

如果我理解你的问题,你似乎需要将 DataFrame 存储到 Flask 会话中。不幸的是 Flask 会话不理解 pandas DataFrame。

但是,如果您确实需要保留它。您可以使用MessagePack存储为二进制文件。

data = df.to_msgpack()
session['data'] = data
Run Code Online (Sandbox Code Playgroud)

阅读消息包

df1 = pd.read_mesgpack(session['data'])
Run Code Online (Sandbox Code Playgroud)

另一个想法。您可以将 DataFrame 传递给 StringIO 并再次将其保存到会话中。

附言。在决定使用会话之前,请先检查会话的大小。