Эта статья предназначена для введения в работу с 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.

  1. Установите пакеты R.
  2. Импорт пакетов и функций из R.
  3. Преобразование pandas DataFrame в кадр данных R и наоборот.
  4. Практический пример (запуск байесовской сети).

Но сначала мы должны установить пакет 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

[4] https://stackoverflow.com/questions/59462337/importing-any-function-from-an-r-package-into-python/59462338#59462338

[5] https://stackoverflow.com/questions/49776568/calling-functions-from-within-r-packages-in-python-using-importr

[6] https://stackoverflow.com/questions/47306899/how-do-i-catch-an-rpy2-rinterface-rruntimeerror-in-python

[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