如何使用 POST 方法发送 pandas 数据帧并在 Hug/其他 REST API 框架中接收它? pickle.loads 发送后无法取消pickle

2023-12-29

如何使用发送 pandas DataFramePOST method?

例如,以下拥抱服务器 http://www.hug.rest/听一个POST使用 pickled pandas DataFrame 请求并响应:

import hug
import pickle
import traceback
import pandas as pd

@hug.post()
def call(pickle_dump):
    print(type(pickle_dump))
    try:
        df = pickle.loads(pickle_dump)
        return pickle.dumps(df.iloc[0])
    except:
        print(traceback.format_exc())
        return pickle.dumps(pd.DataFrame())

当出现以下情况时POST提出请求:

import requests
import pandas as pd

df = pd.DataFrame(pd.np.random.randn(10,20))
r = requests.post('http://localhost:8000/call', data = {'pickle_dump':pickle.dumps(df)})
pickle.loads(r.text)

服务器返回此回溯:

<class 'str'>
Traceback (most recent call last):
  File "post.py", line 9, in call
    df = pickle.loads(pickle_dump)
TypeError: a bytes-like object is required, not 'str'

127.0.0.1 - - [23/Jul/2018 17:12:12] "POST /call HTTP/1.1" 200 10

同样,客户端返回:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-292-956952cbfca9> in <module>()
      5 r = requests.post('http://localhost:8000/call', data = {'pickle_dump':pickle.dumps(df)})
      6 
----> 7 pickle.loads(r.text)

TypeError: a bytes-like object is required, not 'str'

这似乎与以下事实有关:当字节对象发送到hugapi,字节通过以下方式转换为 str:

例如pickle.dumps(b'test')回报b'\x80\x03C\x04testq\x00.'在客户端上。 当 Hug 服务器接收到它时,就会变成str('\x80\x03C\x04testq\x00.')(丢失的b)。该对象可以使用以下方式解码回其原始形式pickle.loads('\x80\x03C\x04testq\x00.'.encode()[1:]).

在 DataFrame 上应用上述过程会产生UnpicklingError:

> pickle.dumps(pd.DataFrame())
b'\x80\x03cpandas.core.frame\nDataFrame\nq\x00)\x81q\x01}q\x02(X\t\x00\x00\x00_metadataq\x03]q\x04X\x04\x00\x00\x00_typq\x05X\t\x00\x00\x00dataframeq\x06X\x05\x00\x00\x00_dataq\x07cpandas.core.internals\nBlockManager\nq\x08)\x81q\t(]q\n(cpandas.core.indexes.base\n_new_Index\nq\x0bcpandas.core.indexes.base\nIndex\nq\x0c}q\r(X\x04\x00\x00\x00nameq\x0eNX\x04\x00\x00\x00dataq\x0fcnumpy.core.multiarray\n_reconstruct\nq\x10cnumpy\nndarray\nq\x11K\x00\x85q\x12C\x01bq\x13\x87q\x14Rq\x15(K\x01K\x00\x85q\x16cnumpy\ndtype\nq\x17X\x02\x00\x00\x00O8q\x18K\x00K\x01\x87q\x19Rq\x1a(K\x03X\x01\x00\x00\x00|q\x1bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?tq\x1cb\x89]q\x1dtq\x1ebu\x86q\x1fRq h\x0bh\x0c}q!(h\x0eNh\x0fh\x10h\x11K\x00\x85q"h\x13\x87q#Rq$(K\x01K\x00\x85q%h\x1a\x89]q&tq\'bu\x86q(Rq)e]q*]q+}q,X\x06\x00\x00\x000.14.1q-}q.(X\x06\x00\x00\x00blocksq/]q0X\x04\x00\x00\x00axesq1h\nustq2bub.'

反转泡菜

pickle.loads('\x80\x03cpandas.core.frame\nDataFrame\nq\x00)\x81q\x01}q\x02(X\t\x00\x00\x00_metadataq\x03]q\x04X\x04\x00\x00\x00_typq\x05X\t\x00\x00\x00dataframeq\x06X\x05\x00\x00\x00_dataq\x07cpandas.core.internals\nBlockManager\nq\x08)\x81q\t(]q\n(cpandas.core.indexes.base\n_new_Index\nq\x0bcpandas.core.indexes.base\nIndex\nq\x0c}q\r(X\x04\x00\x00\x00nameq\x0eNX\x04\x00\x00\x00dataq\x0fcnumpy.core.multiarray\n_reconstruct\nq\x10cnumpy\nndarray\nq\x11K\x00\x85q\x12C\x01bq\x13\x87q\x14Rq\x15(K\x01K\x00\x85q\x16cnumpy\ndtype\nq\x17X\x02\x00\x00\x00O8q\x18K\x00K\x01\x87q\x19Rq\x1a(K\x03X\x01\x00\x00\x00|q\x1bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?tq\x1cb\x89]q\x1dtq\x1ebu\x86q\x1fRq h\x0bh\x0c}q!(h\x0eNh\x0fh\x10h\x11K\x00\x85q"h\x13\x87q#Rq$(K\x01K\x00\x85q%h\x1a\x89]q&tq\'bu\x86q(Rq)e]q*]q+}q,X\x06\x00\x00\x000.14.1q-}q.(X\x06\x00\x00\x00blocksq/]q0X\x04\x00\x00\x00axesq1h\nustq2bub.'.encode()[1:])

结果是:

---------------------------------------------------------------------------
UnpicklingError                           Traceback (most recent call last)
<ipython-input-314-7082d60a5569> in <module>()
----> 1 pickle.loads('\x80\x03cpandas.core.frame\nDataFrame\nq\x00)\x81q\x01}q\x02(X\t\x00\x00\x00_metadataq\x03]q\x04X\x04\x00\x00\x00_typq\x05X\t\x00\x00\x00dataframeq\x06X\x05\x00\x00\x00_dataq\x07cpandas.core.internals\nBlockManager\nq\x08)\x81q\t(]q\n(cpandas.core.indexes.base\n_new_Index\nq\x0bcpandas.core.indexes.base\nIndex\nq\x0c}q\r(X\x04\x00\x00\x00nameq\x0eNX\x04\x00\x00\x00dataq\x0fcnumpy.core.multiarray\n_reconstruct\nq\x10cnumpy\nndarray\nq\x11K\x00\x85q\x12C\x01bq\x13\x87q\x14Rq\x15(K\x01K\x00\x85q\x16cnumpy\ndtype\nq\x17X\x02\x00\x00\x00O8q\x18K\x00K\x01\x87q\x19Rq\x1a(K\x03X\x01\x00\x00\x00|q\x1bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?tq\x1cb\x89]q\x1dtq\x1ebu\x86q\x1fRq h\x0bh\x0c}q!(h\x0eNh\x0fh\x10h\x11K\x00\x85q"h\x13\x87q#Rq$(K\x01K\x00\x85q%h\x1a\x89]q&tq\'bu\x86q(Rq)e]q*]q+}q,X\x06\x00\x00\x000.14.1q-}q.(X\x06\x00\x00\x00blocksq/]q0X\x04\x00\x00\x00axesq1h\nustq2bub.'.encode()[1:])

UnpicklingError: 

我愿意使用任何允许我使用以下方式发送和接收 pandas DataFrame 的框架HTTP要求。

服务端和客户端运行在同一环境,且包版本相同。

如何使用发送和接收 pandas DataFrameHTTP方法?


看来 b64 编码 pickled 字符串似乎可以缓解这个问题。为了简洁起见,我将用一个例子来演示。

假设我有以下数据框:

>>> import pandas as pd
>>> df = pd.DataFrame({'a': [0, 1, 2, 3]})
>>> df
   a
0  0
1  1
2  2
3  3

现在,让我们将对象 pickle 为类似字节的字符串,然后对 pickled 字符串进行 b64 编码:

>>> import pickle
>>> pickled = pickle.dumps(df)
>>> import base64
>>> pickled_b64 = base64.b64encode(pickled)
>>> pickled_b64
b'gANjcGFuZGFzLmNvcmUuZnJhbWUKRGF0YUZyYW1lCnEAKYFxAX1xAihYCQAAAF9tZXRhZGF0YXEDXXEEWAQAAABfdHlwcQVYCQAAAGRhdGFmcmFtZXEGWAUAAABfZGF0YXEHY3BhbmRhcy5jb3JlLmludGVybmFscwpCbG9ja01hbmFnZXIKcQgpgXEJKF1xCihjcGFuZGFzLmNvcmUuaW5kZXhlcy5iYXNlCl9uZXdfSW5kZXgKcQtjcGFuZGFzLmNvcmUuaW5kZXhlcy5iYXNlCkluZGV4CnEMfXENKFgEAAAAbmFtZXEOTlgEAAAAZGF0YXEPY251bXB5LmNvcmUubXVsdGlhcnJheQpfcmVjb25zdHJ1Y3QKcRBjbnVtcHkKbmRhcnJheQpxEUsAhXESQwFicROHcRRScRUoSwFLAYVxFmNudW1weQpkdHlwZQpxF1gCAAAATzhxGEsASwGHcRlScRooSwNYAQAAAHxxG05OTkr/////Sv////9LP3RxHGKJXXEdWAEAAABhcR5hdHEfYnWGcSBScSFoC2NwYW5kYXMuY29yZS5pbmRleGVzLnJhbmdlClJhbmdlSW5kZXgKcSJ9cSMoaA5OWAUAAABzdGFydHEkSwBYBAAAAHN0b3BxJUsEWAQAAABzdGVwcSZLAXWGcSdScShlXXEpaBBoEUsAhXEqaBOHcStScSwoSwFLAUsEhnEtaBdYAgAAAGk4cS5LAEsBh3EvUnEwKEsDWAEAAAA8cTFOTk5K/////0r/////SwB0cTJiiUMgAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAABxM3RxNGJhXXE1aAtoDH1xNihoDk5oD2gQaBFLAIVxN2gTh3E4UnE5KEsBSwGFcTpoGoldcTtoHmF0cTxidYZxPVJxPmF9cT9YBgAAADAuMTQuMXFAfXFBKFgGAAAAYmxvY2tzcUJdcUN9cUQoWAgAAABtZ3JfbG9jc3FFY2J1aWx0aW5zCnNsaWNlCnFGSwBLAUsBh3FHUnFIWAYAAAB2YWx1ZXNxSWgsdWFYBAAAAGF4ZXNxSmgKdXN0cUtidWIu'

因此,64 编码的字符串也是类似字节的字符串,但它不包含十六进制转义序列,因此当它转换为字符串时,在将其编码为字节时,该字符串仍会保留。

现在,让我们模仿一下hug正如您所注意到的,对字符串执行的操作:

>>> hug_pickled_str = pickled_b64.decode('utf-8')
>>> hug_pickled_str
'gANjcGFuZGFzLmNvcmUuZnJhbWUKRGF0YUZyYW1lCnEAKYFxAX1xAihYCQAAAF9tZXRhZGF0YXEDXXEEWAQAAABfdHlwcQVYCQAAAGRhdGFmcmFtZXEGWAUAAABfZGF0YXEHY3BhbmRhcy5jb3JlLmludGVybmFscwpCbG9ja01hbmFnZXIKcQgpgXEJKF1xCihjcGFuZGFzLmNvcmUuaW5kZXhlcy5iYXNlCl9uZXdfSW5kZXgKcQtjcGFuZGFzLmNvcmUuaW5kZXhlcy5iYXNlCkluZGV4CnEMfXENKFgEAAAAbmFtZXEOTlgEAAAAZGF0YXEPY251bXB5LmNvcmUubXVsdGlhcnJheQpfcmVjb25zdHJ1Y3QKcRBjbnVtcHkKbmRhcnJheQpxEUsAhXESQwFicROHcRRScRUoSwFLAYVxFmNudW1weQpkdHlwZQpxF1gCAAAATzhxGEsASwGHcRlScRooSwNYAQAAAHxxG05OTkr/////Sv////9LP3RxHGKJXXEdWAEAAABhcR5hdHEfYnWGcSBScSFoC2NwYW5kYXMuY29yZS5pbmRleGVzLnJhbmdlClJhbmdlSW5kZXgKcSJ9cSMoaA5OWAUAAABzdGFydHEkSwBYBAAAAHN0b3BxJUsEWAQAAABzdGVwcSZLAXWGcSdScShlXXEpaBBoEUsAhXEqaBOHcStScSwoSwFLAUsEhnEtaBdYAgAAAGk4cS5LAEsBh3EvUnEwKEsDWAEAAAA8cTFOTk5K/////0r/////SwB0cTJiiUMgAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAABxM3RxNGJhXXE1aAtoDH1xNihoDk5oD2gQaBFLAIVxN2gTh3E4UnE5KEsBSwGFcTpoGoldcTtoHmF0cTxidYZxPVJxPmF9cT9YBgAAADAuMTQuMXFAfXFBKFgGAAAAYmxvY2tzcUJdcUN9cUQoWAgAAABtZ3JfbG9jc3FFY2J1aWx0aW5zCnNsaWNlCnFGSwBLAUsBh3FHUnFIWAYAAAB2YWx1ZXNxSWgsdWFYBAAAAGF4ZXNxSmgKdXN0cUtidWIu'

现在让字符串在服务器端可用:

>>> ss_df = pickle.loads(base64.b64decode(hug_pickled_str.encode()))
>>> ss_df
   a
0  0
1  1
2  2
3  3

因此,您需要对 pickled 字符串进行 base64 编码,并将该字符串作为数据传递给您的 API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 POST 方法发送 pandas 数据帧并在 Hug/其他 REST API 框架中接收它? pickle.loads 发送后无法取消pickle 的相关文章

随机推荐

  • 将手机升级到 Android 9 Pie API 28 修订版 6 后,Cordova 应用程序中出现 Ajax 错误

    我有一个使用 Cordova 8 1 2 开发的应用程序 并在 Android 8 1 Oreo API Level 27 Revision 3 下编译 在 Play 商店和注册用户中成功运行 上周 一些用户将手机升级到 Android 9
  • 浏览器后退按钮不会破坏 PassportJS + ExpressJS 中的会话。如何完全终止/终止会话?

    我的注销机制的代码是 app get logout isLoggedIn function req res req logout res redirect 我使用的是带有密钥的 Express session 包 没有在任何地方设置 Coo
  • 阻塞时如何判断关联对象Id代表什么对象?

    我收到了另一个团队关于 SQL Server 中阻塞的报告 查看结果 Exec sp who2 以及来自 Glenn Berry 博客的查询 SELECT blocking session id AS blocking session id
  • 创建多维度交互图的工具推荐

    我了解 QLik Sense Big Query Google Data Studio 及相关 我需要创建一个包含多个点的地图 每个点将显示数据库中的数据 点相关 例如 该表将如下所示 Store Name Store Location L
  • MVC 读取控制器和操作的 url

    我为 php 编写了自己的 mvc 它似乎对我来说工作得很好 但我在获取控制器和操作时遇到问题 http www example com controller action http www example com controller a
  • 运行时禁用 datagridviewcombobox

    我如何更改以下内容DataGridViewComboBoxColumn在运行时 如何将组合框的第一个值设置为默认值 禁用组合框 使其只读 同时显示第一个值作为默认值 意思是说 如果组合框中有 3 个项目 它应该只显示第一个项目 禁用组合框下
  • 使用 jQuery 的日期掩码[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从命令行调用静态 jar 类方法

    我有一个 jar 文件 CallMeMaybe jar 主类 callmemaybe CallMeMaybe 中有一个静态方法 callMe 就像可以通过运行以下命令从命令行调用 main 方法 java cp CallMeMaybe ja
  • WPF ListViewItem 失去焦点事件 - 如何获取该事件?

    我有一个列表视图 您可以在其中选择行 项目 它链接到在行上显示图像的数据触发器 仅当选择该行时才应显示图像 这部分工作正常 但是当您将焦点移至其他内容 例如文本框 或显示消息框时 列表视图项目将失去焦点 即不再显示行上的突出显示 问题是我的
  • TabLayout 指示器定制

    i have been searching how to change the indicator in Tablayout to be circular like this 但我不知道该怎么做 请帮忙 来自源代码 https androi
  • 让 Textmate 识别 Ruby 版本升级

    我使用了以下说明http bparanj blogspot com 2010 06 installing ruby 191 on snow leopard html http bparanj blogspot com 2010 06 ins
  • 无法访问类“android.arch.core.util.Function”

    您好 我无法创建代码实现 错误如标题所示 Transformations switchMap mLiveData listOfDamages gt doSth or Transformations map liveData doSth 我无
  • 页面上的猫头鹰轮播和引导选项卡

    我正在尝试使用引导程序和猫头鹰轮播构建一个页面 猫头鹰轮播适合网站的目的 而不是引导版本 所以我有一个选项卡结构 我想在每个页面上放置一个轮播 但是我所有的尝试都失败了 这是我的代码 div ul class nav nav tabs li
  • 使用 ByteBuddy 定义泛型类型的字段

    我刚刚开始使用 ByteBuddy 并且正在研究几个示例以掌握它的窍门 我试图通过此练习完成的任务是用 ByteBuddy 替换一些使用 ASM 的代码 到目前为止 我在非泛型类型方面取得了成功 例如 我可以轻松定义一个字段 如下所示 bu
  • SQL Server AND 和 OR 优先级[重复]

    这个问题在这里已经有答案了 我正在调试一些代码并遇到了这个 有人可以帮助我根据 SQL Server 顺序将此语句放在括号中吗 是我一个人这样 还是编码不好 WHERE T1 C1 VAR1 AND T1 C2 VAR2 AND T1 C3
  • 相对质数

    如何在c 中创建一个函数来确定两个输入的数字是否互质 没有公因数 例如 1 3 有效 但 2 4 无效 吉姆 克莱 Jim Clay 的不谨慎评论促使其付诸行动 以下是六行代码的欧几里得算法 bool RelativelyPrime int
  • 如何随机化列表并迭代随机列表(bash)

    我编写了一个小 bash 脚本 用于读取文本文件中的命令 每行一个 目前 脚本 如下所示 正在按顺序执行命令 即按照文件中输入的顺序 我希望帮助修改下面的脚本 以便它将命令读入数组 然后在迭代随机列表之前随机化该数组 即列表 这是我到目前为
  • java.io.IOException 已建立的连接被主机中的软件中止[重复]

    这个问题在这里已经有答案了 当我对远程服务器执行一个 servlet 调用时 我经常收到此错误 运行 java application1 用很少的数据调用 application2 的 servlet 调用 应用程序 2 必须返回一些数据
  • 在代码隐藏中创建样式

    有谁知道如何在代码隐藏中创建 wpf 样式 我在网络或 MSDN 文档上找不到任何内容 我已经尝试过这个但它不起作用 Style s new Style typeof TextBlock s RegisterName Foreground
  • 如何使用 POST 方法发送 pandas 数据帧并在 Hug/其他 REST API 框架中接收它? pickle.loads 发送后无法取消pickle

    如何使用发送 pandas DataFramePOST method 例如 以下拥抱服务器 http www hug rest 听一个POST使用 pickled pandas DataFrame 请求并响应 import hug impo