如何在Python和R之间交换Msgpack文件?

13

考虑这个简单的例子

import pandas as pd

mydata = pd.DataFrame({'mytime': [pd.to_datetime('2018-01-01 10:00:00.513'),
                                pd.to_datetime('2018-01-03 10:00:00.513')],
                      'myvariable': [1,2],
                      'mystring': ['hello', 'world']})
mydata
Out[7]: 
  mystring                  mytime  myvariable
0    hello 2018-01-01 10:00:00.513           1
1    world 2018-01-03 10:00:00.513           2

我知道可以使用 Pandas 将该数据帧写入msgpack

mydata.to_msgpack('C://Users/john/Documents/mypack')

问题是:如何在R中读取那个 msgpack文件?

使用RcppMsgPack返回一些令人困惑的输出,它不是一个dataframe/tibble

library(tidyverse)
library(RcppMsgPack)

df <- msgpack_read('C://Users/john/Documents/mypack', simplify = TRUE)
 > df
$axes
$axes[[1]]
$axes[[1]]$typ
[1] "index"

$axes[[1]]$name
NULL

$axes[[1]]$klass
[1] "Index"

$axes[[1]]$compress
NULL

$axes[[1]]$data
[1] "mystring"   "mytime"     "myvariable"

$axes[[1]]$dtype
[1] "object"


$axes[[2]]
$axes[[2]]$typ
[1] "range_index"

$axes[[2]]$name
NULL

$axes[[2]]$klass
[1] "RangeIndex"

$axes[[2]]$start
[1] 0

$axes[[2]]$step
[1] 1

$axes[[2]]$stop
[1] 2



$typ
[1] "block_manager"

$blocks
$blocks[[1]]
$blocks[[1]]$shape
[1] 1 2

$blocks[[1]]$klass
[1] "IntBlock"

$blocks[[1]]$compress
NULL

$blocks[[1]]$values
 [1] 01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0

$blocks[[1]]$locs
$blocks[[1]]$locs$typ
[1] "ndarray"

$blocks[[1]]$locs$dtype
[1] "int64"

$blocks[[1]]$locs$compress
NULL

$blocks[[1]]$locs$ndim
[1] 1

$blocks[[1]]$locs$data
[1] 02 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0

$blocks[[1]]$locs$shape
[1] 1


$blocks[[1]]$dtype
[1] "int64"


$blocks[[2]]
$blocks[[2]]$shape
[1] 1 2

$blocks[[2]]$klass
[1] "DatetimeBlock"

$blocks[[2]]$compress
NULL

$blocks[[2]]$values
 [1] 40 02 0e 64 4d a7 05 15 40 02 ac 86 76 44 06 15
attr(,"EXT")
[1] 0

$blocks[[2]]$locs
$blocks[[2]]$locs$typ
[1] "ndarray"

$blocks[[2]]$locs$dtype
[1] "int64"

$blocks[[2]]$locs$compress
NULL

$blocks[[2]]$locs$ndim
[1] 1

$blocks[[2]]$locs$data
[1] 01 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0

$blocks[[2]]$locs$shape
[1] 1


$blocks[[2]]$dtype
[1] "datetime64[ns]"


$blocks[[3]]
$blocks[[3]]$shape
[1] 1 2

$blocks[[3]]$klass
[1] "ObjectBlock"

$blocks[[3]]$compress
NULL

$blocks[[3]]$values
[1] "hello" "world"

$blocks[[3]]$locs
$blocks[[3]]$locs$typ
[1] "ndarray"

$blocks[[3]]$locs$dtype
[1] "int64"

$blocks[[3]]$locs$compress
NULL

$blocks[[3]]$locs$ndim
[1] 1

$blocks[[3]]$locs$data
[1] 00 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0

$blocks[[3]]$locs$shape
[1] 1


$blocks[[3]]$dtype
[1] "object"



$klass
[1] "DataFrame"

我该怎么办?

当然,从R回到Python也是不错的选择。谢谢!


Sure, take your time. Let me know when you're ready. - ℕʘʘḆḽḘ
@Parfait 完成得好,伙计。 - ℕʘʘḆḽḘ
1
是的,看起来有Pythonic元素:dtypendarray.... 不知道使用msgpack格式的相同R数据会是什么样子?并且它能在Pandas中读取吗? - Parfait
@Parfait 这是一个有趣的观点。我不确定。但也许我们可以先从这个方程式的这一侧开始 :) - ℕʘʘḆḽḘ
2
明显地,pandas 数据帧的 msgpack 表示非常低级,因此不能直接转换为 R 适合的对象。您可以编写一些代码将 RcppMsgPack 输出转换为 R 数据框,或者更改生成 msgpack 文件的过程。后一种解决方案当然更好:只能使用特定语言读取输出是很糟糕的做法。 - nicola
1个回答

1
如何在R中使用library(reticulate)
library(reticulate)
pyData = py_run_string("import pandas as pd
mydata = pd.DataFrame({'mytime': [pd.to_datetime('2018-01-01 10:00:00.513'),
                                pd.to_datetime('2018-01-03 10:00:00.513')],
                      'myvariable': [1,2],
                      'mystring': ['hello', 'world']})")

它将产生所需的输出:
pyData$mydata
    mystring              mytime myvariable
1    hello 2018-01-01 10:00:00          1
2    world 2018-01-03 10:00:00          2

您可以将所有Python代码保存在一个Python文件中,例如mydata.py,并使用函数py_run_file("mydata.py")
关于reticulate的概述可以在此处找到:https://github.com/rstudio/reticulate
对您最有趣的可能是类型转换的描述: enter image description here 来源:https://github.com/rstudio/reticulate#type-conversions附加问题-从R到Python: 类型转换也适用于从R发送数据到Python,详见此处:https://rstudio.github.io/reticulate/articles/calling_python.html#sourcing-scripts
py = py_run_string("def add(x, y):
  return x + y")

py$add(5, 10)
15

有趣,但我需要一个纯R的解决方案。 - ℕʘʘḆḽḘ
这是一个纯R解决方案。它使用一个R包。是的,它与一种语言进行交互,但其他使用Rcpp(C ++)或RJava的R包也是如此! - Parfait
不幸的是,reticulate在我的网络设置中无法使用(我无法正确地使用该软件包)。因此,我正在寻找一些利用R中的msgpack软件包的东西。 - ℕʘʘḆḽḘ
此外,该解决方案根本没有解决msgpack Python/R兼容性问题。 - ℕʘʘḆḽḘ
强硬!这样可以绕过需要从磁盘读/写的I/O需求。 - Parfait
这就是我的问题的关键!计算机A在Python中生成了Msgpack,计算机B在R中读取它。 - ℕʘʘḆḽḘ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接