domingo, 2 de abril de 2017

Apuntes sobre Data Table

La libreria "data.table" ofrece una "versión mejorada" de los Data Frame. Una de las mayores ventajas es que los Data Table ocupan 10 veces menos espacio que los Data Frame.  Otra ventaja es la mejora en los tiempos de ejecución para leer y escribir un csv, hacer group by, ordenar una tabla, entre otras funciones.

Los Data Table pueden ser utilizados como Data Frame.  Si se hace un class(miTabla) de un data.table se imprime una lista con dos valores: "data.table" "data.frame", identificando que los objetos Data Table también pueden ser considerados como Data Frame  y las librerías que solo usan Data Frame no tendrían problemas al usar Data Table.

En el blog de Jan Gorecki (ver referencia Nro.4) se hace una comparación de eficiencia de los data.table. Se pueden destacar estas funciones, en linea roja las pertenecientes a la libreria data.table:



Para mas detalles sobre data.table, ver referencias.




script con funciones de data.table:
# version utilizada
# data.table 1.10.4

# DATA TABLE
# ----------------------------------------------------------------------
library(data.table)

# Que es un data.table
class(as.data.table(mtcars))
# resultado: "data.table" "data.frame"

# convertir un data.frame en data.table
dt <- as.data.table(mtcars)
# crear un data.table inline
dt <- data.table(a = 1:6, b = 7:12, c = 13:18)

# READ.CSV vs FREAD(data.table function)
# ----------------------------------------------------------------------
# Tiempos de READ.CSV para leer un csv de 38MB
system.time(df<-read.csv("c:/data/dataset_mt.csv"))
# resultados:
#   user  system elapsed 
#  15.44    0.32   15.78 

# Tiempos de FREAD para leer un csv de 38MB
system.time(dt<-fread("c:/data/dataset_mt.csv",showProgress=F))
# resultados:
#   user  system elapsed 
#  11.71    0.01   11.78


# WRITE.CSV vs FWRITE(data.table function)
# ----------------------------------------------------------------------
# Tiempos de WRITE.CSV para escribir un csv de 160MB en disco
df = mtcars[sample(32,1000000,T),]
system.time(write.csv(df,file="c:/data/dataset_mt.csv",row.names=F))
# resultados:
#   user  system elapsed 
#  62.41    0.49   63.86 

# Tiempos de FWRITE para escribir un csv de 160MB en disco
dt = as.data.table(mtcars[sample(32,1000000,T),])
system.time(fwrite(dt,file="c:/data/dataset_mt.csv",showProgress = F))
# resultados:
#   user  system elapsed 
#   4.36    0.06    1.48 


# GROUP BY en Data.Table
# ----------------------------------------------------------------------
# GROUP BY 
iris_dt = as.data.table(iris)
# promedio de Sepal.Length agrupado por Species
iris_dt[, mean(Sepal.Length), by = Species]
# promedio de Sepal.Length agrupado por Species solo casos donde sepal.length >=6 
iris_dt[Sepal.Length >= 6, mean(Sepal.Length), by = Species]


# BORRAR COLUMNAS Y NAs en Data.Table
# ----------------------------------------------------------------------
# DROP. Borrar una columna 'vs' y 'am' del data.table mtcars_dt
mtcars_dt <- as.data.table(mtcars)
mtcars_dt[, c('vs','am') := NULL]

# NAs. Eliminar las filas que contienen valores NA en un data.table
mtcars_dt = na.omit(mtcars_dt)


# JOINS en Data.Table
# ----------------------------------------------------------------------
# crea data.tables
dt1 = data.table(id_user=c(1,2,3,4), edad=c(42,52,62,66))
dt2 = data.table(id_user=c(1,2,3), cantidad=c(4,5,6))
# right outer join unkeyed data.tables - use `on` argument
dt1[dt2, on = "id_user"]
# join para "not in"
dt1[!dt2, on = "id_user"]
# inner join
merge(dt1, dt2, by = "id_user")
# full outer join
merge(dt1, dt2, by = "id_user", all = TRUE)


# FILTROS en Data.Table
# ----------------------------------------------------------------------
dt <- as.data.table(iris)
setosas <- dt[Species == 'setosa']

Referencia:
1. Introduccion a los data.table:
https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-intro.html
2. Resumen de funciones de librería data.table
https://s3.amazonaws.com/assets.datacamp.com/img/blog/data+table+cheat+sheet.pdf
3. Curso de Data.Table impartido por su creador, Matt Dowle:
https://www.datacamp.com/courses/data-table-data-manipulation-r-tutorial
4. Benchmark o comparación de rendimiento entre data.table y otras librerías
https://jangorecki.github.io/blog/2015-12-11/Solve-common-R-problems-efficiently-with-data.table.html



2 comentarios:

  1. Muy interesante el blog. Quiero aprovechar para hacer una pregunta sobre R y analítica.
    Estoy analizando las ventas de un retailer. Estas ventas están relacionadas con una serie de variables: var1, var2, var3, var4. La mayoría de ellas son continuas.

    Para analizar la dependencia de las ventas respecto las variables creo una regresión lineal:

    rg<-lm(sales ~ var1 + var2 + var3 + var4, data=sales_2017)
    summary(rg)


    Posteriormente quiero analizar el peso de cada variable y para ello uso (paquete caret):

    varImp(rg, scale = FALSE)
    rsimp <- varImp(rg, scale = FALSE)
    plot(rsimp)

    Es este un buen método para analizar el peso e importancia de las variables?, alguna recomendación?

    Juan

    ResponderEliminar
    Respuestas
    1. Hola Juan

      Te comento que hay mucha literatura y teoria sobre importancia de variables.
      Sobre la funcion varImp de la libreria caret, esta te calcula diferentes medidas, segun el modelo que uses. Para la regresion lineal (lm) te calcula el t-value de cada variable. Para saber como se calcula el t-value, fijate en este link:
      https://stats.stackexchange.com/questions/5135/interpretation-of-rs-lm-output

      Para otros metodos sobre importancia de variables, este link te puede servir
      https://www.linkedin.com/pulse/r-finding-most-important-predictor-variables-saranya-anandh?trk=hp-feed-article-title-like

      Si necesitas ayuda especifica, escribeme a mi correo y veo si puedo colaborar

      Espero te sirva

      Suerte!!

      Eliminar