Empiezo a trabajar con el lenguaje Julia ante la insistencia de JL Cañadas. Lo primero es comentar que este trabajo está hecho en Julia 1.6.2 con una máquina Ubuntu 18. Para instalar Julia en Ubuntu:
- Descarga de Julia
tar -xvzf julia-1.6.2-linux-x86_64.tar.gzsudo cp -r julia-1.6.2 /opt/sudo ln -s /opt/julia-1.6.2/bin/julia /usr/local/bin/julia
Una vez instalado, he valorado los posibles IDE; parece ser que VS Code es lo más apropiado, pero en mi caso particular tengo un problema con él. He optado por usarlo en Jupyter y, para ello, es necesario abrir julia en el terminal y poner:
using Pkgserá el elemento que emplearemos para añadir más paquetes.Pkg.add("IJulia")
En este punto, con vuestro Jupyter ya podéis abrir un notebook con Julia. Como os podéis imaginar, cada vez que deseemos añadir un nuevo elemento usaremos Pkg.add("paquete") desde la línea de comandos de Julia o directamente desde nuestro notebook. Así pues, nuestro trabajo comienza con:
using Pkg
Pkg.add("CSV")
Pkg.add("DataFrames")
using CSV
using DataFrames
Importando un CSV a un data frame con Julia
Una vuelta de tuerca: vamos a leer un CSV que está en una web y, para ello, usamos HTTP:
# Pkg.add("HTTP")
using HTTP
url = "https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv"
res = HTTP.get(url)
iris = DataFrame(CSV.File(res.body))
HTTP parece lo más adecuado para leer un CSV desde una URL; hay otras alternativas a explorar. Obtenemos el CSV y, al obtenerlo, lo guardamos en un data.frame leyendo con CSV.File y transformando a data.frame con DataFrame. Ya disponemos de un conjunto de datos de trabajo. Para hacer el típico head al data.frame, podemos hacer first(iris, 3) y veremos las 3 primeras filas. Si deseamos hacer lo más sencillo, una media de una columna del data.frame:
using Statistics
mean(iris.sepal_length)
Data management básico con Julia
Como en otras entradas del blog, veremos:
- Seleccionar columnas en data frames Julia.
- Seleccionar registros en data frames Julia.
- Crear nuevas variables en data frames Julia.
- Sumarizar datos en data frames Julia.
- Ordenar datos en data frames Julia.
- Renombrar variables en data frames Julia.
Seleccionar columnas en data frames con Julia
# names(iris)
columnas = ["sepal_length", "sepal_width"]
iris2 = iris[:, columnas]
Si deseamos eliminar:
columnas = ["sepal_length", "sepal_width"]
iris3 = iris[:, Not(columnas)]
size(iris3)
Seleccionar registros en data frames con Julia
# Pkg.add("DataFramesMeta")
using DataFramesMeta
iris4 = @where(iris, :sepal_length .> 5)
first(iris4, 3)
Estas líneas son importantes porque son la introducción a DataFramesMeta y la aparición del pipe (|>) para construirnos nuestros procesos. En este caso se crea otro data.frame y sobre él realizamos la consulta. Y si combinamos DataFramesMeta con Query tenemos un código interesante:
# Pkg.add("Query")
using Query
iris5 = @from i in iris begin
@where i.sepal_length > 5
@select {long_sepalo = i.sepal_length, i.species}
@collect DataFrame
end
first(iris5, 4)
Ojo a este código. Como se aprecia, tenemos cláusula @where y @select, donde hemos aprovechado para renombrar una variable de la tabla iris a la que hemos asignado el alias i. Al final con @collect indicamos el tipo de dataset de salida.
Crear nuevas variables en data frames con Julia
Podemos hacerlo de forma similar a la que se ha visto con anterioridad:
media = mean(iris.sepal_length)
iris6 = @from i in iris begin
@select {dist_media = i.sepal_length / media, i.sepal_length}
@collect DataFrame
end
first(iris6, 4)
Emplear pipes para realizar un proceso:
iris7 = iris |> @mutate(dist_media = :sepal_length / media) |> DataFrame
first(iris7, 3)
O de forma “atómica”:
iris.nueva = iris.sepal_length ./ iris.sepal_width
Se aprecian distintas formas de manipular data.frames con Julia.
Sumarizar datos en data frames con Julia
A partir de un objeto agregado:
resumen = combine(groupby(iris, :species), :sepal_length => mean)
Otro medio de realizar este trabajo es el uso de combine con múltiples funciones:
resumen2 = combine(groupby(iris, :species),
:sepal_length => mean => :media_largo,
:sepal_length => length => :cuenta)
Ordenar registros en data frames con Julia
iris_ordenado = sort(iris, :sepal_length, rev = true)
Renombrar variables en data frames con Julia
rename!(iris, :sepal_length => :largo_sepalo)
Como siempre, se trata de recoger en pocas líneas el $60%$ de las tareas que haremos con Julia. Espero que sirva de referencia.