6 Importando y Exportando Datos

Mientras trabajamos en Julia, todo el espacio de trabajo se encuentra guardado en la memoria RAM del computador. Al cerrar el programa toda la memoria es liberada y la información eliminada. Julia puede cargar datos en su espacio de trabajo a partir de datos externos así como y guardar objetos de su espacio en diversos formatos.

6.1 Archivos de Texto Delimitados

En muchos contextos los datos se encuentran disponibles en archivos con formato texto (txt, csv, etc) y la columnas están delimitadas por algún delimitador particular (coma, punto y coma, TAB, etc). El paquete DelimitedFiles permite cargar la información contenida en estos archivos así como guardar información en los mismos. La sintaxis es:

  • variable = readdlm("nombre_archivo.txt", '\t') por ejemplo carga el objeto y lo guarda en el espacio de trabajo como variable (el delimitador es TAB \t).

Tomemos como ejemplo los datos del PIB de Chile contenidos en el archivos PIBChile.csv. La primera columna contiene los años (1960-2015) y la segunda el PIB. Ambas columnas están separadas por una coma.

using DelimitedFiles
datos2 = readdlm("PIBChile.csv", ',')
57×2 Array{Any,2}:
     "Periodo"           "PIB Real"
 1960            13326609          
 1961            14015469          
 1962            14612686          
 1963            15495153          
 1964            15868596          
 1965            16032079          
 1966            17792727          
 1967            18438409          
 1968            19108994          
 1969            19900155          
 1970            20287272          
 1971            22189810          
    ⋮                              
 2004            76987661          
 2005            81742969          
 2006            86397688          
 2007            90856522          
 2008            93847932          
 2009            92875262          
 2010            98219034          
 2011           103954673          
 2012           109627615          
 2013           113987063          
 2014           116125911          
 2015           118525235          

Existen situaciones en que es útil guardar la información en archivos de texto (txt). La sintaxis es:

  • writedlm("nombre_archivo.txt",variable) guarda el objeto variable.

A modelo de ejemplo vamos a crear una matriz de tamaño \(100 \times 5\) con números aleatorios extraídos de una distribución normal con media 100 y varianza 25) y los guardaremos en formato txt. Por defecto writedlm()utiliza TAB como separador:

datos = 10*ones(100,5) + 5*randn(100,5);
writedlm("miarchivo.txt", datos)

Leyendo el archivo recientemente guardado y almacenando la información en la matriz datos2 tenemos:

datos2 = readdlm("miarchivo.txt", '\t')
100×5 Array{Float64,2}:
 13.8287   10.8976     8.26049    8.75127   4.23368
 17.7328    8.30192   18.8235    22.2483    9.90805
 11.6098    6.09058    9.63777   -3.26512   6.39597
  7.65093   7.81686    9.8367     2.67658   2.55452
  2.72766  17.5753     9.65465   15.2421    7.19189
 12.8451    4.51063   14.1945    14.2131    4.78679
 13.8229    7.02321    6.76504   17.4013    6.84775
 14.2264   15.1383     9.14977    7.17395   9.86526
 19.4375   12.6468     8.98879   12.2429    8.47713
  9.17952   9.13437    2.21919   17.8467    4.42199
 15.1595   11.1771     9.5009     5.77331  11.6807 
  7.93347   9.08409    9.88841    5.19173  17.7154 
 19.23     10.7895    13.2947     3.71131  10.9398 
  ⋮                                                
  7.61887  21.3005     3.60374   12.3168   11.4841 
  5.48209   5.73024    8.82055   13.3749    7.65985
 12.838    14.3745    16.9292     3.65063   5.63709
 15.3026    5.45358   18.2453     8.53317   7.63567
  5.79795   9.66012   15.2071     7.55389  13.1914 
  3.03716  13.4261    -0.326686  10.6121   12.8595 
 -1.30147  -0.873672   8.10321   11.1906    8.09467
 15.0655   13.0568     5.35518   10.338     2.10848
  8.80985  14.3378     5.7239     4.16434  12.6481 
 25.0655    7.83801    9.63486    6.95342   3.00243
 18.1199   12.19      16.0499    13.3899   10.1646 
  5.29912   8.73701    7.9266    15.7756    9.56798

6.2 Importando Datos en Formato Excel

Julia también es capaz de leer datos desde Excel usando el paquete ExcelReaders. La sintaxis es:

  • variable = readxl("nombre_archivo.xls", "nombre_hoja!rango") carga el la información contenida en el archivo nombre_archivo.xls (en la hoja nombre_hoja y en el rango rango) y la guarda en el espacio de trabajo como variable.

Por ejemplo, importemos nuevamente la información del PIB de Chile pero ahora de una hoja Excel: PIBChile.xlsx.

using ExcelReaders
using Statistics
using Plots
# Nos aseguramos de estar en el directorio de trabajo correcto.
cd("/Users/mauriciotejada/Dropbox/Teaching/MAE - Matlab/Nootebooks Julia/") 
datos = readxl("PIBChile.xlsx", "Datos!A2:B57")
56×2 Array{Any,2}:
 1960.0  1.33266e7
 1961.0  1.40155e7
 1962.0  1.46127e7
 1963.0  1.54952e7
 1964.0  1.58686e7
 1965.0  1.60321e7
 1966.0  1.77927e7
 1967.0  1.84384e7
 1968.0  1.9109e7 
 1969.0  1.99002e7
 1970.0  2.02873e7
 1971.0  2.21898e7
 1972.0  2.19179e7
    ⋮             
 2004.0  7.69877e7
 2005.0  8.1743e7 
 2006.0  8.63977e7
 2007.0  9.08565e7
 2008.0  9.38479e7
 2009.0  9.28753e7
 2010.0  9.8219e7 
 2011.0  1.03955e8
 2012.0  1.09628e8
 2013.0  1.13987e8
 2014.0  1.16126e8
 2015.0  1.18525e8

Ahora podemos trabajar con los datos. Por ejemplo grafiquemos el PIB en niveles y en crecimientos:

tiempo = datos[:,1]
pib    = datos[:,2];
plt_pib = plot(tiempo,pib, xlabel="Año", ylabel="Miles de Millones de Pesos Encadenados", title = "PIB Real de Chile", 
               color="blue", legend=false, linewidth = 2, grid = true)
display(plt_pib)

svg

Ahora computemos la tasa de crecimiento:

T = length(pib)
g = ((pib[2:T,1] - pib[1:T-1,1])./pib[1:T-1,1])*100;
plt_gpib = plot(tiempo[2:T],g, xlabel="Año", ylabel="Porcentaje", 
                title = "Crecimiento del PIB Real de Chile", color="blue", legend=false, 
                linewidth = 2, grid = true)
display(plt_gpib)

svg

Crecimiento promedio entre 1960 y 2015:

crecprom = mean(g)
4.161620220853264

6.3 Formato Julia Data JLD

En algunos contextos es útil guardar varias piezas de información (objetos) del espacio de trabajo. Guardar cada uno en un archivo de texto puede ser problemático cuando tenemos muchos objetos a guardar (1 objeto, 1 archivo de texto). El paquete JLD permite guardar múltiples objetos en un solo archivo (.jld o Julia Data) y lo hace siguiendo la misma lógica de un Diccionario (guardando el par: clave - objeto). La sintaxis es:

  • save("nombre_archivo.jld", "clave1", objeto1, "clave2", objeto2, ...)

Un archivo jdlpuede ser cargado a memoria usando la sintaxis:

  • variable = load("nombre_archivo.jld")

En este caso variable es un Diccionario.

using JLD

Como ejemplo, creamos dos objeto: un entero t y un vector z y lo guardamos en miarchivo.jld:

t = 15
z = [1,3]
save("miarchivo.jld", "t", t, "z", z)
d = load("miarchivo.jld")
Dict{String,Any} with 2 entries:
  "t" => 15
  "z" => [1, 3]
# Recuperamos el objeto original
z = d["z"]
2-element Array{Int64,1}:
 1
 3