Эта статья предназначена для введения в работу с R в Python.

Когда я был студентом университета, курсы статистики (анализ выживаемости, многомерный анализ и т. Д.) Преподавались в R. Тем не менее, поскольку я хотел изучать Data Science, я выбрал Python, потому что он казался мне «жутким».
Работая только с Python, я сталкиваюсь с необходимостью реализации некоторых статистических методов, таких как тест Грабба для выбросов, Монте-Карло цепи Маркова для моделирования или байесовские сети для синтетических данных. Таким образом, эта статья задумана как вводное руководство по включению R в рабочий процесс Python Data Scientist. Если вы хотите интегрировать Python в свой рабочий процесс в качестве специалиста по данным R, вам пригодится пакет reticulate, см. [1].
rpy2
Мы выбираем фреймворк rpy2, другие варианты - pyRserve или pypeR, потому что он запускает встроенный R. Другими словами, он позволяет взаимодействовать между Python и объектами R через rpy2.robjects, мы увидим позже конкретный пример, когда преобразование pandas DataFrame в R DataFrame. Если вы застряли на каком-либо из следующих шагов, прочтите официальную документацию или ссылки.
Мы рассмотрим три шага, необходимых для начала работы с R в Python. Наконец, мы сделаем практический пример и рассмотрим дополнительные функции, которые позволяет вам обрабатывать пакет rpy2.
- Установите пакеты R.
- Импорт пакетов и функций из R.
- Преобразование pandas DataFrame в кадр данных R и наоборот.
- Практический пример (запуск байесовской сети).
Но сначала мы должны установить пакет rpy2.
# Jupyter Notebook option !pip install rpy2 # Terminal option pip install rpy2
1. Установите пакеты R
В R установка пакетов выполняется путем их загрузки с зеркал CRAN и последующей их локальной установки. Пакеты могут быть установлены, а затем загружены аналогично модулям Python.
# Choosing a CRAN Mirror
import rpy2.robjects.packages as rpackages
utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1)
# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ('bnlearn',...,'other desired packages')
utils.install_packages(StrVector(packages))
Выбирая ind = 1 в chosseCRANmirror ,, мы гарантируем автоматическое перенаправление на ближайший к нам сервер. Теперь мы рассмотрим второй шаг.
2. Импорт пакетов и функций
Здесь мы собираемся импортировать библиотеки и функции, необходимые для реализации байесовской сети в практическом примере.
# Import packages
from rpy2.robjects.packages import importr
base, bnlearn = importr('base'), importr('bnlearn')
# Import Functions
bn_fit, rbn = bnlearn.bn_fit, bnlearn.rbn
hpc, rsmax2, tabu = bnlearn.hpc, bnlearn.rsmax2, bnlearn.tabu
Чтобы импортировать любую функцию, удобно видеть ключ «rpy2» в словаре каждого пакета, например, чтобы увидеть доступные функции для импорта в bnlearn, который мы запускаем:
bnlearn.__dict__['_rpy2r']
Output:
...
...
'bn_boot': 'bn.boot',
'bn_cv': 'bn.cv',
'bn_cv_algorithm': 'bn.cv.algorithm',
'bn_cv_structure': 'bn.cv.structure',
'bn_fit': 'bn.fit',
'bn_fit_backend': 'bn.fit.backend',
'bn_fit_backend_continuous': 'bn.fit.backend.continuous',
...
...
Для получения дополнительной информации о том, как импортировать функции checkout [4] или [5].
3. Преобразование кадра данных pandas в кадр данных R и наоборот.
Лично я считаю, что эта функциональность позволяет сочетать масштабируемость (Python) со статистическими инструментами (R). В качестве личного примера, пока я использовал многопроцессорную библиотеку python для реализации параллельных вычислений, я также хотел попробовать функцию auto.arima() из библиотеки R прогноза, помимо функций пакета statsmodels Python, для прогнозирования. Итак, robjects.conversion - это то, что позволяет объединить лучшее из двух языков программирования.
# Allow conversion import rpy2.robjects as ro from rpy2.objects import pandas2ri pandas2ri.activate() # Convert to R dataframe r_dt = ro.conversion.py2rpy(dt) # dt is a pd.DataFrame object # Convert back to pandas DataFrame pd_dt = ro.conversion.rpy2py(r_dt)
При активации преобразования панд (pandas2ri.activate()) многие преобразования R в панды будут выполняться автоматически. Тем не менее, для явного преобразования мы вызываем функции py2rpy или rpy2py.
4. Практический пример с байесовской сетью.
Помимо методов Монте-Карло, байесовские сети - это вариант для моделирования данных. Однако на сегодняшний день в Python нет библиотеки для этой задачи. Итак, я выбираю пакет bnlearn, который позволяет изучать графическую структуру байесовских сетей и выполнять из них логический вывод.
В приведенном ниже примере мы используем гибридный алгоритм (rsmax2) для изучения структуры сети, поскольку он позволяет нам использовать любую комбинацию алгоритмов на основе ограничений и алгоритмов на основе оценок. Однако, в зависимости от характера проблемы, вам следует выбрать правильную эвристику, полный список доступных алгоритмов см. В [7]. После того, как сеть изучена, мы моделируем n случайных выборок из байесовской сети с помощью функции rbn. Наконец, мы выполняем структуру try-except для обработки определенного типа ошибки.
r_imputados = robjects.conversion.py2rpy(imputados)
try:
# Learn structure of Network
structure = rsmax2(data, restrict = 'hpc', maximize = 'tabu')
fitted = bn_fit(structure, data = data, method = "mle")
# Generate n number of observations
r_sim = rbn(fitted, n = 10)
except rpy2.rinterface_lib.embedded.RRuntimeError:
print("Error while running R methods")
RunTimeError возникает, когда мы не хотим, чтобы функция отказала или сделала что-то неожиданное. В данном случае мы перехватываем эту ошибку, потому что это способ сообщить пользователю, когда что-то пошло не так, что это не ошибка другого типа (полные исключения см. В [9]). В качестве иллюстрации я получил ошибку, заключающуюся в том, что не нашел hybrid.pc.filter hybrid.pc.filter при выполнении функции rsmax2 .
Дополнительные функции
Вы можете сделать гораздо больше с низкоуровневым интерфейсом rpy2 и высокоуровневым интерфейсом. Например, вы можете вызывать функции Python с помощью R, давайте посмотрим, как найти минимум четырехмерной функции Колвилля с помощью метода сопряженных градиентов.
from rpy2.robjects.vectors import FloatVector
from rpy2.robjects.packages import importr
import rpy2.rinterface as ri
stats = importr('stats')
# Colville f: R^4 ---> R
def Colville(x):
x1, x2, x3, x4 = x[0], x[1], x[2], x[3]
return 100*(x1**2-x2)**2 + (x1-1)**2+(x3-1)**2 + 90*(x3**2-x4)**2 + 10.1*((x2-1)**2 + (x4-1)**2) + 19.8*(x2-1)*(x4-1)
# Expose function to R
Colville = ri.rternalize(Colville)
# Initial point
init_point = FloatVector((3, 3, 3, 3))
# Optimization Function
res = stats.optim(init_point, Colville, method = c("CG"))
Ссылки:
[1] Мэтт Браун. Запустите код Python из R с помощью пакета reticulate. R-пабы. URL: https://rstudio-pubs-static.s3.amazonaws.com/407460_396f867ce3494d479fd700960879e22c.html
[2] Аджай Охри. Совместное использование Python и R: 3 основных подхода. KDnuggets. URL: https://www.kdnuggets.com/2015/12/using-python-r-to общежитие.html
[3] Официальная документация Rpy2. URL: https://rpy2.github.io/doc/latest/html/index.html
[7] Официальная документация Bnlearn. Http://www.bnlearn.com/documentation/man/structure.learning.html
[8] Дэниел Оэм. Пример байесовской сети с пакетом bnlearn. URL: http://gradientdescending.com/bayesian-network-example-with-the-bnlearn-package/
[9] Python 3.8 Встроенные исключения. URL: https://docs.python.org/3.8/library/exceptions.html#RuntimeError
[10] Роберт, Кристиан; Казелла, Джордж. Знакомство с методами Монте-Карло с Р. Спрингером. 2010 г.
[11] Нагараджан, Радхакришнан; Скутари, Марко; Лебр, Софи. Байесовские сети в Р. Спрингере. 2013