如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?

Posted

技术标签:

【中文标题】如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?【英文标题】:How to serialize/deserialize Pandas DataFrame to and from ProtoBuf/Gzip in a RESTful Flask App? 【发布时间】:2016-11-18 04:26:53 【问题描述】:

我有一个 pandas dataframeflask 应用程序中作为Flask Response 对象返回。目前我正在将其转换为JSON Object

df = df.to_json()
return Response(df, status=200, mimetype='application/json') 

数据框的大小非常大,可能是 5000000 X 10。 在客户端,当我将其反序列化为时,

df = response.read_json()

随着URL request parameters 数量的增长,dataframe 的数量也在增长。与序列化相比,反序列化时间以linear factor 增长,这是我想避免的。例如:Serialization 需要 15-20 秒,deserialization 需要 60-70 秒。

在这种情况下,protobuf 是否可以帮助将 pandas 数据帧转换为 protobuf 对象。还有一种方法可以通过烧瓶将JSON 作为Gunzipped mimetype 发送吗?我相信protobufgunzip 之间的时间和效率相当。

在这种情况下最好的解决方案是什么?

提前致谢。

【问题讨论】:

【参考方案1】:

我最近遇到了同样的问题。我通过遍历我的 DataFrame 的行并使用来自 DataFrame 的信息在该循环中调用 protobuf_obj.add() 来解决它。然后,您可以 GZIP 序列化的字符串输出。

即类似于:

for _, row in df.iterrows():
    protobuf_obj.add(val1=row[col1], val2=row[col2])
proto_str = protobuf_obj.SerializeToString()
return gzip.compress(proto_str)

鉴于这个问题在 9 个月内没有得到解答,我不确定是否有更好的解决方案,但如果有的话,肯定愿意听取!

【讨论】:

以上是关于如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?的主要内容,如果未能解决你的问题,请参考以下文章

Flask 学习-38.Flask-RESTful 序列化输出中文显示问题

Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置

Flask-RESTful如何add_resource并传递非全局数据

TypeError:使用flask_jwt_extended int RESTful API时类型函数的对象不是JSON可序列化的

你如何序列化一个python烧瓶变量?

如何将集成测试应用于 Flask RESTful API