R + Python = reticulate

26 Nov

He sido reticente a usar reticulate con R porque no me gusta R markdown y si he trabajado con Python no he necesitado R y viceversa. Ahora tengo en mente algún juego/proyecto de esos que se quedan siempre en el tintero por falta de tiempo o interés pero me están sirviendo para elaborar unos apuntes sobre R markdow y Python que voy a sintetizaros en esta entrada por si a alguien le fuera de utilidad.

Todo comenzará con remotes::install_github("rstudio/reticulate") yo, a pesar de tener varios entornos de Python Anacoda, dejé que se instalara el Miniconda y trabajo con el entorno rstudio. Estoy habituado a que esta labor la realicen los ingenieros (para eso están) y la verdad es que no he tocado nada de la instalación, he dejado a R que lo configure. Si tenéis problemas con Rtools y Windows id a este enlace y lo resolvéis como indica. Al hacer esto partimos de un entorno sin los paquetes habituales y por ello, una vez ejecutemos library(reticulate), tenemos que instalar los paquetes de Python en el entorno de rstudio de Miniconda con py_install('pandas'). De este modo nos podemos ir configurando un entorno con los paquetes que necesitemos.

Disponiendo del entorno requerido ya podemos abrir nuestro notebook en markdown y ejecutar código R o Python, según necesitemos. Un ejemplo a lo ‘mecagüen’ que podéis ejecutar tal cual (si disponéis de los paquetes) en vuestro notebook:

```{r}
library(opencv)
library(tidyverse)
library(reticulate)
library(CASdatasets)

#use_virtualenv("~/rstrudio")
#py_install("matplotlib")
```

```{r}
data("norauto")
norauto <- dplyr::filter(norauto, Expo<=1)
```

```{python}
r.norauto.head()
```

```{python}
import pandas as pd

frecuencia =  pd.DataFrame((r.norauto['NbClaim']).groupby(r.norauto['DistLimit']).mean())
exposicion = pd.DataFrame((r.norauto['NbClaim']).groupby(r.norauto['DistLimit']).count())
```

```{python}
import matplotlib.pyplot as plt

fig = plt.figure()
ax = exposicion['NbClaim'].plot(kind='bar',grid=True)
ax2 = ax.twinx()
ax2.plot(frecuencia['NbClaim'].values, linestyle='-', linewidth=2.0,color='red')
plt.show();
```

Con ```{python} podéis ejecutar código en Python y si necesitáis llamar a un data frame de R para trabajar con pandas hacéis r.df_R y ya disponéis de los datos en python, el paso contrario de Python a R es:

```{r}
summary(py$frecuencia)
summary(py$exposicion)
```

No es complicado y funciona bien, el problema que he encontrado está en los entornos, son un dolor de muelas. Espero que sea de utilidad.