Descripción general del paquete Datatable Python

"La humanidad creó cinco exabytes de información desde el momento del nacimiento de la civilización hasta 2003, pero ahora se está creando la misma cantidad cada dos días". Eric Schmidt


Datatable es una biblioteca de Python para realizar un procesamiento eficiente de datos multiproceso. Datatable admite conjuntos de datos que no caben en la memoria.

Si escribe en R, entonces probablemente ya esté utilizando el paquete data.table . Data.table es una extensión del paquete data.frame R. Además, aquellos que usan R para agregar rápidamente conjuntos de datos grandes no pueden prescindir de este paquete (estamos hablando, en particular, de unos 100 GB de datos en RAM).

El paquete data.table para R es muy flexible y potente. Usarlo es fácil y conveniente, los programas en los que se usa se escriben con bastante rapidez. Este paquete es ampliamente conocido entre los programadores R. Se descarga más de 400 mil veces al mes, se usa en casi 650 paquetes CRAN y Bioconductor ( fuente ).

¿Para qué sirve la minería de datos para Python? El caso es que hay un paquete de datatable Python que es un análogo de data.table del mundo R. El paquete de datatable claramente enfocado en el procesamiento de grandes conjuntos de datos. Se caracteriza por un alto rendimiento, tanto cuando se trabaja con datos que están completamente ubicados en la RAM, como cuando se trabaja con datos cuyo tamaño excede la cantidad de RAM disponible. Es compatible con el procesamiento de datos multiproceso. En general, el paquete de tabla de datos se puede llamar el hermano menor de data.table .

Tabla de datos



Los sistemas modernos de aprendizaje automático necesitan procesar cantidades monstruosas de datos y generar muchas funciones. Esto es necesario para construir modelos lo más precisos posible. El módulo Python de datatable fue creado para resolver este problema. Este es un conjunto de herramientas para realizar operaciones con grandes volúmenes de datos (hasta 100 GB) en una sola computadora a la mayor velocidad posible. La datatable está patrocinada por datatable y el primer usuario del paquete es Driverless.ai .

Este kit de herramientas es muy similar a los pandas , pero está más enfocado en proporcionar procesamiento de datos de alta velocidad y admitir grandes conjuntos de datos. Los desarrolladores del paquete de datatable , además, se esfuerzan por hacer que sea conveniente para los usuarios trabajar con él. Es, en particular, una API potente y mensajes de error bien pensados. En este artículo, hablaremos sobre cómo usar la datatable y cómo se ve en comparación con los pandas al procesar grandes conjuntos de datos.

Instalación


En macOS, datatable se puede instalar fácilmente usando pip :

 pip install datatable 

En Linux, la instalación se realiza desde distribuciones binarias:

 #  Python 3.5 pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp35-cp35m-linux_x86_64.whl #  Python 3.6 pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl 

Actualmente, la datatable no funciona en Windows, pero se está trabajando en esta dirección, por lo que el soporte de Windows es solo cuestión de tiempo.

Los detalles sobre la instalación de la datatable se pueden encontrar aquí .

El código que se utilizará en este artículo se puede encontrar en este repositorio de GitHub o aquí en mybinder.org.

Lectura de datos


El conjunto de datos con el que experimentaremos aquí está tomado de Kaggle ( Lending Club Loan Data Dataset ). Este conjunto consta de datos completos sobre todos los préstamos emitidos en 2007-2015, incluido el estado actual del préstamo (actual, atrasado, totalmente pagado, etc.) y la información de pago más reciente. El archivo consta de 2,26 millones de filas y 145 columnas. El tamaño de este conjunto de datos es ideal para demostrar las capacidades de la biblioteca de datatable .

 #    import numpy as np import pandas as pd import datatable as dt 

Carguemos los datos en un objeto Frame . La unidad básica de análisis en una datatable es Frame . Esto es lo mismo que un DataFrame de una tabla de pandas o SQL. Es decir, estamos hablando de datos organizados como una matriz bidimensional en la que se pueden distinguir filas y columnas.

▍ Carga de datos usando tabla de datos


 %%time datatable_df = dt.fread("data.csv") ____________________________________________________________________ CPU times: user 30 s, sys: 3.39 s, total: 33.4 s           Wall time: 23.6 s 

La función fread() es un mecanismo potente y muy rápido. Puede detectar y procesar automáticamente parámetros para la gran mayoría de los archivos de texto, descargar datos de archivos .ZIP y archivos de Excel, recuperar datos por URL y mucho más.

Además, el analizador de datatable tiene las siguientes características:

  • Puede detectar automáticamente delimitadores, encabezados, tipos de columna, reglas de escape de caracteres, etc.
  • Puede leer datos de varias fuentes. Entre ellos se encuentran el sistema de archivos, URL, shell de comandos, texto sin formato, archivos.
  • Es capaz de realizar lecturas de datos multiproceso para obtener el máximo rendimiento.
  • Muestra un indicador de progreso al leer archivos grandes.
  • Puede leer archivos que cumplen y no cumplen con RFC4180 .

▍ Descargar datos usando pandas


Ahora veamos cuánto tiempo necesitan los pandas leer el mismo archivo.

 %%time pandas_df= pd.read_csv("data.csv") ___________________________________________________________ CPU times: user 47.5 s, sys: 12.1 s, total: 59.6 s Wall time: 1min 4s 

Puede ver que la datatable claramente más rápida que los pandas al leer grandes conjuntos de datos. Pandas en nuestro experimento tardan más de un minuto, y el tiempo requerido por la datatable de datatable se mide en segundos.

Conversión de objeto de marco


Un objeto de Frame paquete de datatable existente puede convertirse en un objeto DataFrame numpy o pandas . Se hace así:

 numpy_df = datatable_df.to_numpy() pandas_df = datatable_df.to_pandas() 

Intentemos convertir una datatable de datatable Frame existente a pandas DataFrame y veamos cuánto tarda.

 %%time datatable_pandas = datatable_df.to_pandas() ___________________________________________________________________ CPU times: user 17.1 s, sys: 4 s, total: 21.1 s Wall time: 21.4 s 

Parece que leer el archivo en una datatable Frame y luego convertirlo en un objeto DataFrame pandas lleva menos tiempo que cargar datos en un DataFrame usando pandas . Por lo tanto, tal vez, si planea procesar grandes cantidades de datos usando pandas , sería mejor cargarlos usando datatable y luego convertirlos en un DataFrame .

 type(datatable_pandas) ___________________________________________________________________ pandas.core.frame.DataFrame 

Propiedades básicas del objeto Frame.


Considere las propiedades básicas de un objeto Frame de una datatable . Son muy similares a las propiedades similares del objeto DataFrame de pandas :

 print(datatable_df.shape)       # ( ,  ) print(datatable_df.names[:5])   #   5  print(datatable_df.stypes[:5])  #   5  ______________________________________________________________ (2260668, 145) ('id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv') (stype.bool8, stype.bool8, stype.int32, stype.int32, stype.float64) 

Aquí podemos usar el método head() , que muestra las n primeras líneas:

 datatable_df.head(10) 


Las primeras 10 filas de un objeto Frame de una tabla de datos

Los colores del encabezado indican el tipo de datos. El rojo indica líneas, el verde indica números enteros, el azul indica números de punto flotante.

Estadísticas resumidas


Calcular estadísticas resumidas en pandas es una operación que requiere mucha memoria para completarse. En el caso de datatable esto no es así. Estos son los comandos que puede usar para calcular varias métricas en una datatable :

 datatable_df.sum()      datatable_df.nunique() datatable_df.sd()       datatable_df.max() datatable_df.mode()     datatable_df.min() datatable_df.nmodal()   datatable_df.mean() 

Calculamos el valor promedio sobre las columnas usando datatable y pandas y analizamos el tiempo requerido para completar esta operación.

▍ Encontrar el promedio usando la tabla de datos


 %%time datatable_df.mean() _______________________________________________________________ CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 s Wall time: 1.43 s 

▍ Encontrar el promedio usando pandas


 pandas_df.mean() __________________________________________________________________ Throws memory error. 

Como puede ver, en pandas no pudimos obtener el resultado: se emitió un error relacionado con la memoria.

Manipulación de datos


Frame y DataFrame son estructuras de datos que son tablas. En la datatable , los corchetes se utilizan para manipular datos. Esto es similar a cómo funcionan con matrices convencionales, pero aquí, al usar corchetes, puede usar características adicionales.


Trabajar con datos de tabla de datos usando corchetes

En matemáticas, cuando se trabaja con matrices, también se utilizan construcciones de la forma DT[i, j] . Se pueden encontrar estructuras similares en C, C ++ y R, en pandas y paquetes numpy , así como en muchas otras tecnologías. Considere realizar manipulaciones de datos comunes en una datatable .

▍ Formando muestras de fila o columna


El siguiente código selecciona todas las filas de la columna funded_amnt :

 datatable_df[:,'funded_amnt'] 


Seleccione todas las filas de la columna funding_amnt

Aquí se explica cómo seleccionar las primeras 5 filas y 3 columnas:

 datatable_df[:5,:3] 


Selección de las primeras 5 filas y 3 columnas.

▍ Clasificación de datos mediante datatable


Ordene el conjunto de datos por la columna seleccionada:

 %%time datatable_df.sort('funded_amnt_inv') _________________________________________________________________ CPU times: user 534 ms, sys: 67.9 ms, total: 602 ms Wall time: 179 ms 

▍ Clasificación de datos mediante pandas


 %%time pandas_df.sort_values(by = 'funded_amnt_inv') ___________________________________________________________________ CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 s Wall time: 12.4 s 

Tenga en cuenta la diferencia significativa en el tiempo requerido para ordenar datatable y pandas .

▍Eliminar filas y columnas


Aquí se explica cómo eliminar una columna llamada member_id :

 del datatable_df[:, 'member_id'] 

Agrupación


Datatable, como los pandas , admite capacidades de agrupación de datos. Echemos un vistazo a cómo obtener el promedio de la columna funded_amound , funded_amound datos se agrupan por la columna de grade .

▍ Agrupar datos usando datatable


 %%time for i in range(100):   datatable_df[:, dt.sum(dt.f.funded_amnt), dt.by(dt.f.grade)] ____________________________________________________________________ CPU times: user 6.41 s, sys: 1.34 s, total: 7.76 s Wall time: 2.42 s 

Aquí puede ver el uso de la construcción .f . Este es el llamado proxy de marco, un mecanismo simple que le permite hacer referencia al objeto Frame con el que se están realizando algunas acciones actualmente. En nuestro caso, dt.f es lo mismo que datatable_df .

▍ Agrupar datos usando pandas


 %%time for i in range(100):   pandas_df.groupby("grade")["funded_amnt"].sum() ____________________________________________________________________ CPU times: user 12.9 s, sys: 859 ms, total: 13.7 s Wall time: 13.9 s 

Filtrado de líneas


La sintaxis de filtrado es similar a la sintaxis de agrupación. loan_amnt líneas loan_amnt para las cuales el valor del loan_amnt mayor que el funded_amnt .

 datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"] 

Guardar un objeto de marco


El contenido del objeto Frame se puede escribir en un archivo CSV, lo que permite el uso de datos en el futuro. Se hace así:

 datatable_df.to_csv('output.csv') 

Puede leer sobre otros métodos de datatable de datos para trabajar con datos aquí .

Resumen


El módulo Python de datatable es definitivamente más rápido que los pandas habituales. También es una bendición para aquellos que necesitan procesar conjuntos de datos muy grandes. Hasta ahora, la única datatable de datos datatable en comparación con los pandas es la cantidad de funcionalidad. Sin embargo, se está trabajando datatable en la datatable de datatable , por lo que es muy posible que en el futuro, la datatable supere a los pandas en todas las direcciones.

Estimados lectores! ¿Planea utilizar el paquete de datatable en sus proyectos?



Source: https://habr.com/ru/post/455507/


All Articles