Por qué se fusionaron pandas en python más rápido que los datos.mesa se fusiona en R en 2012?


Recientemente me encontré con la biblioteca pandas para python, que de acuerdo con este benchmark realiza fusiones muy rápidas en memoria. Es incluso más rápido que los datos .tabla paquete en R (mi idioma de elección para el análisis).

¿Por qué es pandas mucho más rápido que data.table? ¿Es debido a una ventaja de velocidad inherente que python tiene sobre R, o hay alguna compensación de la que no soy consciente? ¿Hay una manera de realizar juntas internas y externas en data.table sin recurrir a merge(X, Y, all=FALSE) y merge(X, Y, all=TRUE)?

Comparación

Aquí está el código R y el código Python utilizado para comparar los diversos paquetes.

Author: Hugh, 2012-01-24

3 answers

Parece que Wes pudo haber descubierto un problema conocido en data.table cuando el número de cadenas únicas ( niveles) es grande: 10,000.

¿Revela Rprof() la mayor parte del tiempo pasado en la llamada sortedmatch(levels(i[[lc]]), levels(x[[rc]])? Esto no es realmente la unión en sí (el algoritmo), sino un paso preliminar.

Los esfuerzos recientes han ido en permitir columnas de caracteres en las claves, lo que debería resolver ese problema mediante la integración más cercana con la propia tabla hash de cadena global de R. Algunos resultados de referencia son ya reportado por test.data.table() pero ese código no está conectado todavía para reemplazar los niveles a los niveles coinciden.

¿Las fusiones de pandas son más rápidas que data.table para columnas enteras regulares? Esa debería ser una forma de aislar el algoritmo en sí frente a los problemas de factores.

También, data.tabletiene en mente combinar series temporales. Dos aspectos a eso: i) multi columna ordenado claves tales como (id,datetime) ii) rápido prevaleciente join (roll=TRUE) a.k.a. última observación llevada adelante.

Necesitaré algún tiempo para confirmar, ya que es el primero que he visto de la comparación con data.table como se presenta.


ACTUALIZACIÓN de datos.table v1.8.0 released July 2012

  • Función interna sortedmatch () eliminada y reemplazada por chmatch() al hacer coincidir los niveles i con los niveles x para columnas de tipo 'factor'. Este paso preliminar estaba causando una desaceleración significativa (conocida) cuando el número de los niveles de una columna de factores fue grande (por ejemplo, >10.000). Exacerbado en pruebas de unión de cuatro columnas de este tipo, como lo demostró Wes McKinney (autor del paquete Python Pandas). Coincidencia de 1 millón de cadenas de las cuales de los cuales 600,000 son únicos, ahora se reduce de 16 a 0.5 s, por ejemplo.

También en esa liberación estaba:

  • Las columnas de caracteres ahora están permitidas en las claves y son preferidas a factor. datos.table () y setkey () ya no coaccionan carácter a factor. Los factores siguen siendo compatibles. Implementos FR#1493, FR#1224 y (parcialmente) FR # 951.

  • Nuevas funciones chmatch () y %chin%, versiones más rápidas de match() y %en % para vectores de caracteres. La caché de cadena interna de R es utilizado (no se construye una tabla hash). Son aproximadamente 4 veces más rápidos que match () en el ejemplo en ?chmatch.

A partir de los datos de Sep 2013.la tabla es v1. 8.10 en CRAN y estamos trabajando en v1.9.0. NOTICIAS se actualiza en vivo.


Pero, como escribí originalmente, arriba :

data.table tiene la serie temporal merge en mente. Dos aspectos a eso: i) múltiples columnas ordenado claves tales como (id, datetime) ii) prevalecer rápido join (roll=TRUE), también conocida como última observación arrastrada.

Así que la unión de Pandas equi de dos columnas de caracteres es probablemente aún más rápida que data.tabla. Ya que suena como si hash las dos columnas combinadas. datos.la tabla no hace hash con la clave porque tiene en mente las uniones ordenadas prevalecientes. Una "clave" en los datos.tabla literalmente solo el orden de clasificación (similar a un índice agrupado en SQL; es decir, así es como se ordenan los datos en RAM). En la lista está añadir claves secundarias, por ejemplo.

En resumen, la diferencia de velocidad evidente resaltada por esta prueba de columna de dos caracteres en particular con más de 10,000 cadenas únicas no debería ser tan mala ahora, ya que el problema conocido se ha solucionado.

 113
Author: Matt Dowle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-26 09:46:45

La razón por la que pandas es más rápido es porque se me ocurrió un algoritmo mejor, que se implementa con mucho cuidado usando una implementación rápida de tabla hash - klib y en C/ Cython para evitar la sobrecarga del intérprete de Python para las partes no vectorizables. El algoritmo se describe con cierto detalle en mi presentación: Una mirada al diseño y desarrollo de pandas.

La comparación con data.table es en realidad un poco interesante porque todo el punto de R data.table es que contiene índices pre-calculados para varias columnas para acelerar operaciones como la selección de datos y las fusiones. En este caso (database joins) el DataFrame de pandas contiene ninguna información pre-calculada que esté siendo usada para la fusión, por así decirlo es una fusión "fría". Si hubiera almacenado las versiones factorizadas de las claves de unión, la unión sería significativamente más rápida, ya que la factorización es el mayor cuello de botella para este algoritmo.

También debo añadir que el el diseño interno del DataFrame de pandas es mucho más susceptible a este tipo de operaciones que los datos de R.frame (que es solo una lista de matrices internamente).

 189
Author: Wes McKinney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-24 11:30:10

Este tema tiene dos años, pero parece un lugar probable para que la gente aterrice cuando buscan comparaciones de Pandas y datos.tabla

Dado que ambos han evolucionado con el tiempo, quiero publicar una comparación relativamente más reciente (de 2014) aquí para los usuarios interesados: https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping

Sería interesante saber si Wes y/o Matt (que, por cierto, son creadores de Pandas y data.cuadro, respectivamente y ambos han comentado anteriormente) tener alguna noticia para añadir aquí también.

UPDATE ACTUALIZAR {

Un comentario publicado a continuación por jangorecki contiene un enlace que creo que es muy útil: https://github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

Este gráfico muestra los tiempos medios de agregación y operaciones de unión para diferentes tecnologías (menor = más rápido; comparación actualizada por última vez en septiembre de 2016). Fue muy educativo para mí.

Va de vuelta a la pregunta, R DT key y R DT se refieren a los sabores keyed/unkeyed de los datos de R.tabla y pasar a ser más rápido en este benchmark que Pandas de Python (Py pandas).

 35
Author: Merik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 22:55:26