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

时间:2017-04-09 04:12:09

标签: python pandas session flask

我正在处理庞大的数据帧。我想避免在用户查询之间腌制。想知道我是否可以在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)

2 个答案:

答案 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。在决定使用会话之前,请先检查会话的大小。