Загрузка файлов.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.])}
Как я уже сказал, я разработал этот пакет и с тех пор использовался без проблем, но я не стал делать его наглядным, поскольку я не документировал его должным образом. Это недавно изменилось, и теперь документация в основном в порядке, так что вот она для всех, кто интересуется:
Существует сторонняя библиотека под названием 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()
Выполнено!!