Загрузка файлов.RData в Python

У меня есть куча файлов временных рядов.RData, и я хотел бы загрузить их непосредственно в Python без предварительного преобразования файлов в другое расширение (например,.csv). Есть какие-нибудь идеи о том, как это сделать?

7 ответов

Решение

Люди спрашивают такого рода вещи в списке R-help и R-dev, и обычный ответ таков: код является документацией для .RData формат файла. Таким образом, любая другая реализация на любом другом языке является трудной ++.

Я думаю, что единственный разумный способ - установить RPy2 и использовать R load Функция от этого, преобразовывая в соответствующие объекты Python по мере продвижения. .RData Файл может содержать структурированные объекты, а также простые таблицы, так что будьте внимательны.

Линки: http://rpy.sourceforge.net/rpy2/doc-2.4/html/

Quicky:

>>> import rpy2.robjects as robjects
>>> robjects.r['load'](".RData")

объекты теперь загружаются в рабочую область R.

>>> robjects.r['y']
<FloatVector - Python:0x24c6560 / R:0xf1f0e0>
[0.763684, 0.086314, 0.617097, ..., 0.443631, 0.281865, 0.839317]

Это простой скаляр, d - фрейм данных, я могу подмножество получить столбцы:

>>> robjects.r['d'][0]
<IntVector - Python:0x24c9248 / R:0xbbc6c0>
[       1,        2,        3, ...,        8,        9,       10]
>>> robjects.r['d'][1]
<FloatVector - Python:0x24c93b0 / R:0xf1f230>
[0.975648, 0.597036, 0.254840, ..., 0.891975, 0.824879, 0.870136]

В качестве альтернативы для тех, кто предпочитает не устанавливать R для выполнения этой задачи (r2py требует этого), есть новый пакет "pyreadr", который позволяет считывать файлы RData и Rds непосредственно в python без зависимостей.

Это обертка вокруг библиотеки librdata, поэтому она очень быстрая.

Вы можете легко установить его с помощью pip:

pip install pyreadr

В качестве примера вы могли бы сделать:

import pyreadr

result = pyreadr.read_r('/path/to/file.RData') # also works for Rds

# done! let's see what we got
# result is a dictionary where keys are the name of objects and the values python
# objects
print(result.keys()) # let's check what objects we got
df1 = result["df1"] # extract the pandas data frame for object df1

Репо здесь: https://github.com/ofajardo/pyreadr

Отказ от ответственности: я разработчик этого пакета.

Пользователи ноутбуков Jupyter

Если вы используете ноутбук Jupyter, вам нужно сделать 2 шага:

Шаг 1: перейдите на http://www.lfd.uci.edu/~gohlke/pythonlibs/ и загрузите интерфейс Python на язык R (встроенный R), в моем случае я буду использовать rpy2-2.8.6-cp36-cp36m-win_amd64.whl

Поместите этот файл в тот же рабочий каталог, в котором вы находитесь.

Шаг 2: Зайдите в свой блокнот Jupyter и напишите следующие команды

# This is to install rpy2 library in Anaconda
!pip install rpy2-2.8.6-cp36-cp36m-win_amd64.whl

а потом

# This is important if you will be using rpy2
import os
os.environ['R_USER'] = 'D:\Anaconda3\Lib\site-packages\rpy2'

а потом

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

Это должно позволить вам использовать функции R в Python. Теперь вы должны импортировать readRDS следующим образом

readRDS = robjects.r['readRDS']
df = readRDS('Data1.rds')
df = pandas2ri.ri2py(df)
df.head()

Поздравляем! Теперь у вас есть датафрейм, который вы хотели

Тем не менее, я советую вам сохранить его в файле pickle для последующего использования в Python как

 df.to_pickle('Data1') 

Так что в следующий раз вы можете просто использовать его

df1=pd.read_pickle('Data1')

Пару лет назад у меня была такая же проблема, как и у вас. Я хотел прочитать .RDataфайлы из библиотеки, которую я разрабатывал. Я подумывал об использовании RPy2, но это вынудило бы меня выпустить свою библиотеку с лицензией GPL, чего я не хотел.

"пиреадра" тогда даже не существовало. Кроме того, наборы данных, которые я хотел загрузить, не были в стандартизированном формате, как data.frame.

Я пришел к этому вопросу и прочитал ответ Spacedman. В частности, я увидел строчку

Так что любая другая реализация на любом другом языке сложна ++.

как вызов, и в результате за пару дней реализовал пакет rdata. Это очень маленькая реализация на чистом Python .RDataсинтаксический анализатор и конвертер, способные удовлетворить мои потребности до сих пор. Этапы синтаксического анализа исходных объектов и преобразования в соответствующие объекты Python разделены, чтобы пользователи могли использовать другое преобразование, если они захотят. Более того, пользователи могут добавлять конструкторы для пользовательских классов R.

Это пример использования:

>>> import rdata

>>> parsed = rdata.parser.parse_file(rdata.TESTDATA_PATH / "test_vector.rda")
>>> converted = rdata.conversion.convert(parsed)
>>> converted
{'test_vector': array([1., 2., 3.])}

Как я уже сказал, я разработал этот пакет и с тех пор использовался без проблем, но я не стал делать его наглядным, поскольку я не документировал его должным образом. Это недавно изменилось, и теперь документация в основном в порядке, так что вот она для всех, кто интересуется:

https://github.com/vnmabus/rdata

Существует сторонняя библиотека под названием rpyи вы можете использовать эту библиотеку для загрузки .RData файлы. Вы можете получить это через pip устанавливать pip instally rpy сделает свое дело, если у вас нет rpy, тогда я предлагаю вам взглянуть на то, как его установить. В противном случае вы можете просто сделать:

from rpy import *
r.load("file name here")

РЕДАКТИРОВАТЬ:

Кажется, сейчас я немного староват, теперь вы можете использовать это.

Ответ @rsc05, предназначенный для пользователей ноутбуков, у меня сработал, но, видимо, одна из функций[df = pandas2ri.ri2py(df)] устарел, и теперь он должен бытьdf = pandas2ri.rpy2py(df).

Итак, полное решение должно выглядеть так:

      # import the libraries
>> import rpy2.robjects as robjects
>> from rpy2.robjects import pandas2ri

#activate
>> pandas2ri.activate()

# create readRDS object
>> readRDS = robjects.r['readRDS']

# read .rds using readRDS object
>> df = readRDS('sri_testing_data.rds')

# convert the data into native dataframe object 
>> df = pandas2ri.rpy2py(df)

#print the dataframe
>> df.head()

Попробуй это

      !pip install pyreadr

потом

      result = pyreadr.read_r('/content/nGramsLite.RData') # also works for Rds

# done! let's see what we got
# result is a dictionary where keys are the name of objects and the values python
# objects
print(result.keys()) # let's check what objects we got
      >>>odict_keys(['ngram1', 'ngram2', 'ngram3', 'ngram4'])
      df1 = result["ngram1"]
      df1.head()

Выполнено!!

Другие вопросы по тегам