"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 SchmidtDatatable 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:
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
.
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)
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 datosLos 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 corchetesEn 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_amntAquí 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?

