#python #r #pandas #tibble #msgpack
#python #r #pandas #tibble #msgpack
Вопрос:
Рассмотрим этот простой пример
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
Я знаю, что могу записать этот фрейм данных в msgpack
используя Pandas
:
mydata.to_msgpack('C://Users/john/Documents/mypack')
Проблема в том, как я могу прочитать этот msgpack
файл в R
?
Использование 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. Спасибо!
Комментарии:
1. это очень долго. позвольте мне посмотреть, смогу ли я это сделать
2. @Parfait сделано, мой человек
3. Да, похоже, это элементы Pythonic: dtype , ndarray …. Любопытно, как выглядят те же R-данные с msgpack ? И можно ли это прочитать в Pandas?
4. @Parfait это интересный момент. Я не знаю. Но, может быть, мы можем сначала начать с этой части уравнения 🙂
5. По-видимому,
msgpack
представлениеpandas
фрейма данных имеет очень низкий уровень, поэтому оно не может быть преобразовано как есть в объект, подходящий для R. Либо вы пишете некоторый код, который преобразуетRcppMsgPack
выходные данные в R data.frame, либо вы изменяете процесс, который создаетmsgpack
файл. Это последнее решение, конечно, намного лучше: это очень плохая практика — выдавать выходные данные, которые могут быть прочитаны только на определенном языке.
Ответ №1:
Как насчет использования library(reticulate)
в R:
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.
Для вас, вероятно, наиболее интересным является описание преобразований типов:
Источник: 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
Комментарии:
1. интересно, но мне нужно чисто R-решение
2. Это чисто R-решение. Он использует один пакет R. Да, он взаимодействует с языком, но то же самое делают и другие пакеты R, которые используют RCpp (C ) или rJava!
3. нет, к сожалению
reticulate
, не работает с моей настройкой сети (я не могу заставить этот пакет работать правильно). Итак, я ищу что-то, что используетmsgpack
пакеты в R.4. кроме того, это решение вообще не решает
msgpack
проблему совместимости Python / R.5. Сложно! Это позволяет обойти потребности ввода-вывода в чтении / записи на диск и с диска.