Чтение наборов данных R из Python.
Пакет rdata предлагает простой способ импорта наборов данных/объектов R, хранящихся в форматах «.rda» и «.rds», в Python. Его основные преимущества:
Это чистая реализация Python, не зависящая от языка R или связанных библиотек. Таким образом, его можно использовать везде, где поддерживается Python, включая Интернет с использованием Pyodide.
Он пытается поддерживать все объекты R, которые можно осмысленно перевести. В отличие от других решений, вы не ограничены в импорте фреймов данных или данных с определенной структурой.
Он позволяет пользователям легко настраивать преобразование классов R в классы Python. Используют ли ваши данные специальные классы R? Больше не беспокойтесь, поскольку можно определить собственные преобразования в классы Python по вашему выбору.
Имеет разрешительную лицензию (MIT). В отличие от других пакетов, которые зависят от библиотек R и, следовательно, должны соответствовать лицензии GPL, вы можете использовать rdata в качестве зависимости от MIT, BSD или даже проектов с закрытым исходным кодом.
rdata находится на PyPi и может быть установлен с помощью pip
:
pip установить rdata
Он также доступен для conda
используя канал conda-forge
:
установка conda -c conda-forge rdata
Текущую версию из ветки разработки можно установить как
pip install git+https://github.com/vnmabus/rdata.git@develop
Документация по rdata находится в ReadTheDocs.
Примеры использования доступны в ReadTheDocs.
Обычный способ чтения набора данных R следующий:
import rdataconverted = rdata.read_rda(rdata.TESTDATA_PATH / "test_vector.rda")converted
что приводит к
{'test_vector': массив([1., 2., 3.])}
Под капотом это эквивалентно следующему коду:
import rdataparsed = rdata.parser.parse_file(rdata.TESTDATA_PATH / "test_vector.rda")converted = rdata.conversion.convert(parsed)converted
Это состоит из двух шагов:
Сначала файл анализируется с помощью функции rdata.parser.parse_file. Это обеспечивает буквальное описание содержимого файла в виде иерархии объектов Python, представляющих базовые объекты R. Этот шаг однозначен и всегда один и тот же.
Затем каждый объект необходимо преобразовать в соответствующий объект Python. На этом этапе есть несколько вариантов выбора того, какой тип Python наиболее подходит для преобразования данного объекта R. Таким образом, мы предоставляем процедуру rdata.conversion.convert по умолчанию, которая пытается выбрать объекты Python, сохраняющие большую часть информации исходного объекта R. Для пользовательских классов R также можно указать процедуры преобразования в объекты Python.
Базовая процедура преобразования только создает объект SimpleConverter и вызывает его метод преобразования. Все аргументы Convert передаются непосредственно в метод инициализации SimpleConverter.
Можно, хотя и нетривиально, создать собственный объект Converter, чтобы изменить способ преобразования базовых объектов R в объекты Python. Однако более распространенной ситуацией является то, что не требуется изменять способ преобразования базовых объектов R, а вместо этого требуется обеспечить преобразования для конкретных классов R. Это можно сделать, передав словарь в метод инициализации SimpleConverter, содержащий в качестве ключей имена классов R, а в качестве значений — вызываемые объекты, которые преобразуют объект R этого класса в объект Python. По умолчанию используется словарь DEFAULT_CLASS_MAP, который может преобразовывать часто используемые классы R, такие как data.frame и Factor.
В качестве примера, вот как мы могли бы реализовать процедуру преобразования класса фактора в байтовые объекты вместо преобразования по умолчанию в категориальные объекты Pandas:
import rdatadef Factor_constructor(obj, attrs): значения = [bytes(attrs['levels'][i - 1], 'utf8'), если я >= 0, иначе нет для я в obj] returnvaluesnew_dict = { **rdata. конверсия.DEFAULT_CLASS_MAP, "фактор": Factor_constructor}converted = rdata.read_rda( rdata.TESTDATA_PATH / "test_dataframe.rda",structor_dict=new_dict, ) конвертированный
который имеет следующий результат:
{'test_dataframe': значение класса 1 б'а' 1 2 б'б' 2 3 б'б' 3}
Дополнительные примеры, иллюстрирующие функциональные возможности этого пакета, можно найти в документации ReadTheDocs.