Trabajando con Python y R

Trabajando de forma conjunta con Python y con R.

Hoy vamos a ver como podemos juntar lo bueno de R, algunas de sus librerías, con Python usando rpy2.

Pero, lo primero de todo, ¿qué es rpy2? rpy2 es una interfaz que permite que podamos comunicar información entre R y Python y que podamos acceder a funcionalidad de R desde Python. Por tanto, podemos estar usando Python para todo nuestro análisis y en el caso de que necesitemos alguna librería estadística especializada de R podremos acceder a la misma usando rpy2.

Para poder usar rpy2 necesitarás tener instalado tanto Python (CPython versión >= 2.7.x) como R (versión >=3), además de las librerías R a las que quieras acceder. Conda permite realizar todo el proceso de instalación de los intérpretes de Python y R, además de librerías, pero no he trabajado con Conda y R por lo que no puedo aportar mucho más en este aspecto. Supongo que será parecido a lo que hacemos con Conda y Python.

Para este microtutorial voy a hacer uso de la librería extRemes de R que permite hacer análisis de valores extremos usando varias de las metodologías más comúnmente aceptadas.

Como siempre, primero de todo, importaremos la funcionalidad que necesitamos para la ocasión.

En el anterior código podemos ver una serie de cosas nuevas que voy a explicar brevemente:

  • import rpy2.robjects as ro, esto lo explicaremos un poquito más abajo.
  • import rpy2.robjects.numpy2ri, importamos el módulo numpy2ri. Este módulo permite que hagamos conversión automática de objetos numpy a objetos rpy2.
  • rpy2.robjects.numpy2ri.activate(), hacemos uso de la función activate que activa la conversión automática de objetos que hemos comentado en la línea anterior.

Brevísima introducción a algunas de las cosas más importantes de rpy2.

Para evaluar directamente código R podemos hacerlo usando rpy2.robjects.r con el código R expresado como una cadena (rpy2.robjects lo he importado como ro en este caso, como podéis ver más arriba):

En la anterior celda hemos creado una función R llamada saluda y que ahora está disponible en el espacio de nombres global de R. Podemos acceder a la misma desde Python de la siguiente forma:

Y podemos usarla de la siguiente forma:

En la anterior celda véis que para acceder al resultado he tenido que usar res[0]. En realidad, lo que nos devuelve rpy2 es:

En este caso un numpy array con diversa información del objeto rpy2. Como el objeto solo devuelve un string pues el numpy array solo tiene un elemento.

Podemos acceder al código R de la función de la siguiente forma:

Hemos visto como acceder desde Python a nombres disponibles en el entorno global de R. ¿Cómo podemos hacer para que algo que creemos en Python este accesible en R?

Veamos como es esta variable_r_creada_desde_python dentro de Python

¿Y lo que se tendría que ver en R?

Pero ahora mismo esa variable no está disponible desde R y no la podríamos usar dentro de código R que permanece en el espacio R (vaya lío, ¿no?)

Vale, tendremos que hacer que sea accesible desde R de la siguiente forma:

Ahora que ya la tenemos accesible la podemos usar desde R. Por ejemplo, vamos a usar la función sum en R que suma los elementos pero directamente desde R:

Perfecto, ya sabemos, de forma muy sencilla y básica, como podemos usar R desde Python, como podemos pasar información desde R hacia Python y desde Python hacia R. ¡¡¡Esto es muy poderoso!!!, estamos juntando lo mejor de dos mundos, la solidez de las herramientas científicas de Python con la funcionalidad especializada que nos pueden aportar algunas librerías de R no disponibles en otros ámbitos.

Trabajando de forma híbrida entre Python y R

Vamos a empezar importando la librería extRemes de R:

En la anterior celda hemos hecho lo siguiente:

  • from rpy2.robjects.packages import importr, La función importr nos servirá para importar las librerías R
  • extremes = importr('extRemes'), de esta forma importamos la librería extRemes de R, sería equivalente a hacer en R library(extRemes).

Leemos datos con pandas. En el mismo repo donde está este notebook está también un fichero de texto con datos que creé a priori. Supuestamente son datos horarios de velocidad del viento por lo que vamos a hacer análisis de valores extremos de velocidad del viento horaria.

 wspd
date_time 
1983-01-01 00:00:007.9
1983-01-01 01:00:008.2
1983-01-01 02:00:008.5

Extraemos los máximos anuales los cuales usaremos posteriormente dentro de R para hacer cálculo de valores extremos usando la distribución generalizada de valores extremos (GEV):

Dibujamos los valores máximos anuales usando Pandas:

Referenciamos la funcionalidad fevd (fit extreme value distribution) dentro del paquete extremes de R para poder usarla directamente con los valores máximos que hemos obtenido usando Pandas y desde Python.

Como hemos comentado anteriormente, vamos a calcular los parámetros de la GEV usando el método de ajuste GMLE (Generalised Maximum Lihelihood Estimation) y los vamos a guardar directamente en una variable Python.

Veamos la ayuda antes:

Y ahora vamos a hacer un cálculo sin meternos mucho en todas las opciones posibles.

¿Qué estructura tiene la variable res que acabamos de crear y que tiene los resultados del ajuste?

Según nos indica lo anterior, ahora res es un vector que está compuesto de diferentes elementos. Los vectores pueden tener un nombre para todos o algunos de los elementos. Para acceder a estor nombres podemos hacer:

Según el output anterior, parece que hay un nombre results, ahí es donde se guardan los valores del ajuste, los estimadores. Para acceder al mismo podemos hacerlo de diferentes formas. Con Python tendriamos que saber el índice y acceder de forma normal (__getitem__()). Existe una forma alternativa usando el método rx que nos permite acceder directamente con el nombre:

Parece que tenemos un único elemento:

Vemos ahora que results tiene un elemento con nombre par donde se guardan los valores de los estimadores del ajuste a la GEV que hemos obtenido usando GMLE. Vamos a obtener finalmente los valores de los estimadores:

Funcion mágica para R (antigua rmagic)

Usamos la antigua función mágica rmagic que ahora se activará en el notebook de la siguiente forma:

Veamos como funciona la functión mágica de R:

A veces, será más simple usar la función mágica para interactuar con R. Veamos un ejemplo donde le pasamos a R el valor obtenido de la función fevd del paquete extRemes de R que he usado anteriormente y corremos cierto código directamente desde R sin tener que usar ro.r.

En la anterior celda de código le he pasado como parámetro de entrada (- i res) la variable res que había obtenido anteriormente para que esté disponible desde R. y he ejecutado código R puro (plot.fevd(res)).

Si lo anterior lo quiero hacer con rpy2 puedo hacer lo siquiente:

CUIDADO, la siguiente celda de código puede provocar que se reinicialice el notebook y se rompa la sesión. Si has hecho cambios en el notebook guárdalos antes de ejecutar la celda, por lo que pueda pasar…

Lo anterior me bloquea el notebook y me ‘rompe’ la sesión (en windows, al menos) ya que la ventana de gráficos se abre de forma externa… Por tanto, una buena opción para trabajar de forma interactiva con Python y R de forma conjunta y que no se ‘rompa’ nada es usar tanto rpy2 como su extensión para el notebook de Jupyter (dejaremos de llamarlo IPython poco a poco).

Usando Python y R combinando rpy2 y la función mágica

Vamos a combinar las dos formas de trabajar con rpy2 en el siguiente ejemplo:

Lo que vamos a hacer es calcular los parámetros del ajuste usando la distribución GEV y Gumbel, que es un caso especial de la GEV. El ajuste lo calculamos usando tanto MLE como GMLE. Además de mostrar los valores resultantes del ajuste para los estimadores vamos a mostrar el dibujo de cada uno de los ajustes y algunos test de bondad. Usamos Python para toda la maquinaria de los bucles, usamos rpy2 para obtener los estimadores y usamos la función mágica de rpy2 para mostrar los gráficos del resultado.

Comentarios finales

Espero que este microtutorial os valga, al menos, para conocer rpy2 y la potencia que os puede llegar a aportar a vuestros análisis ‘pythónicos’. Como resumen:

  • Tenemos en nuestras manos una herramienta muy poderosa.
  • Rpy2 puede estar poco madura en algún aspecto aunque ha mejorado bastante con respecto a alguna versión de rpy2 que usé anteriormente.
  • También podéis usar directamente R como kernel, aunque perdéis la interacción con Python. También puede ocurrir que la instalación os haga perder mucho el tiempo para poder hacerlo funcionar si os veis obligados a usarlo desde windows.
  • En la elaboración de este microtutorial la consola de R donde iba haciendo algunas pruebas simples se me ha ‘roto’ muchísimas más veces de las que consideraría aceptables. No se puede quedar colgada, cerrar,…, seis o siete veces en media hora una consola haciendo cosas simples. Eso hace que si quieres usar R de forma interactiva debas usar alternativas como Jupyter, RStudio u otros que desconozco ya que la consola oficial no está ‘ni pa pipas’ (por lo menos en Windows, el sistema operativo con más usuarios potenciales, mal que me pese).
  • Sigo manteniendo muchas reservas respecto a R como Lenguaje de Programación (en mayúsculas) por lo que si puedo limitar su uso a alguna librería especializada que necesito y a la que pueda acceder con rpy2 es lo que seguiré haciendo (If you are using R and you think you’re in hell, this is a map for you.)

Y el notebook…

En el caso de que queráis trastear con el notebook lo podéis descargar desde aquí.
También podéis descargar todos los notebooks desde nuestro repo oficial de notebooks.

3 pensamientos sobre “Trabajando con Python y R”

  1. Mi comentario de hoy no será para decir “interesante artículo” (que lo es siempre) sino simplemente para animar a que no los dejéis de hacer,sea con la frecuencia que sea.¡Saludos!

    1. Muchas gracias por las palabras.
      Como la mayoría de vosotros sabréis, detrás de pybonacci no hay ningún beneficio económico, de hecho, además de nuestro tiempo también nos cuesta nuestro dinero.
      Por tanto, siempre que veamos interés y encontremos el tiempo seguiremos intentando mantener esto vivo. Y cualquiera de vosotros puede contribuir siempre que quiera, usad el formulario de contacto ;para ello -)

  2. En mi experiencia, la instalación de rpy2 puede ser un poco difícil. En el sitio de web de rpy2, recomienda que uno usa “pip install rpy2”. Sin embargo, muchas veces usando ese método, el programa no encuentra el “path” de R.
    Para los que tienen el mismo problema, si usan “conda”, hay una solución muy fácil:
    conda install –channel https://conda.binstar.org/joshadel rpy2
    Si quieren leer los detalles, que vean el sigiente enlace:
    http://stackoverflow.com/questions/4924917/trouble-installing-rpy2-on-win7-r-2-12-python-2-5

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

5 + three =