Paquete DataFrames¶
DataFrames.jl¶
Es un paquete que nos permite explorar información tabulándola. Este paquete es alternativo y equivalente al famoso paquete “Pandas” de Python.
Como el nombre del paquete lo indica, la información se maneja en una estructuta de datos llamada “dataframe”, el cual es similar a una tabla u hoja de cálculo (como la de Excel). Por lo tanto, el paquete nos permite explorar un dataset, transformarlo y almacenar la información.
Junto a DataFrames
se puede utilizar el paquete Queryverse
, el cual permite tener a mano diferentes herramientas útiles para: trabajar con archivos, manipular datos y explorarlos; por tanto, permite tener mayor eficiencia.
using Pkg; Pkg.activate("."); Pkg.instantiate() ##Activando enviroment local
Activating environment at `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
Los paquetes DataFrames
y Queryverse
pueden ser añadidos a Julia y luego ser cargados de la forma usual. Se utilizará el paquete Plots, para realizar algunas gráficas y de esta forma visualizar datos.
using Plots, Queryverse, DataFrames ##Importando librerías
Cargando archivos¶
En Julia existen diversos paquetes que permiten cargar archivos, como el paquete CSV
. Sin embargo, el paquete Queryverse
permite usar la función load
, que permite leer no solo archivos \(^*\).csv sino también archivos: \(^*\).xls, \(^*\).xlsx, \(^*\).dta, \(^*\).sav, entre otros.
Ahora cargaremos el dataset que se estará utilizando para mostrar las bondades del paquete DataFrames
.
datatrain = load("./titanic/train.csv");
A continuación se muestra cómo se carga los datos de una archivo \(^*\).xlsx, en el cual se especifica el nombre de la hoja de cálculo (en el caso particular del ejemplo “train”).
datatest = load("./titanic/test.xlsx", "test");
Ahora podemos comprobar que los datos efectivamente ha sido cargado en las variables de ambos archivos.
typeof(datatrain)
CSVFiles.CSVFile
datatest;
A menudo se requerirá que los datos deban ser contenidos en un dataframe, para ello se utiliza el constructor DataFrame
del paquete DataFrames
. Podrá notar la mejora en la presentación de la tablas cuando se utiliza el paquete mencionado.
Existen varias maneras de crear el dataframe, la primera es:
dftest = DataFrame(datatest)
PassengerId | Pclass | Name | Sex | |
---|---|---|---|---|
Float64 | Float64 | String | String | |
1 | 892.0 | 3.0 | Kelly, Mr. James | male |
2 | 893.0 | 3.0 | Wilkes, Mrs. James (Ellen Needs) | female |
3 | 894.0 | 2.0 | Myles, Mr. Thomas Francis | male |
4 | 895.0 | 3.0 | Wirz, Mr. Albert | male |
5 | 896.0 | 3.0 | Hirvonen, Mrs. Alexander (Helga E Lindqvist) | female |
6 | 897.0 | 3.0 | Svensson, Mr. Johan Cervin | male |
7 | 898.0 | 3.0 | Connolly, Miss. Kate | female |
8 | 899.0 | 2.0 | Caldwell, Mr. Albert Francis | male |
9 | 900.0 | 3.0 | Abrahim, Mrs. Joseph (Sophie Halaut Easu) | female |
10 | 901.0 | 3.0 | Davies, Mr. John Samuel | male |
11 | 902.0 | 3.0 | Ilieff, Mr. Ylio | male |
12 | 903.0 | 1.0 | Jones, Mr. Charles Cresson | male |
13 | 904.0 | 1.0 | Snyder, Mrs. John Pillsbury (Nelle Stevenson) | female |
14 | 905.0 | 2.0 | Howard, Mr. Benjamin | male |
15 | 906.0 | 1.0 | Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood) | female |
16 | 907.0 | 2.0 | del Carlo, Mrs. Sebastiano (Argenia Genovesi) | female |
17 | 908.0 | 2.0 | Keane, Mr. Daniel | male |
18 | 909.0 | 3.0 | Assaf, Mr. Gerios | male |
19 | 910.0 | 3.0 | Ilmakangas, Miss. Ida Livija | female |
20 | 911.0 | 3.0 | Assaf Khalil, Mrs. Mariana (Miriam")" | female |
21 | 912.0 | 1.0 | Rothschild, Mr. Martin | male |
22 | 913.0 | 3.0 | Olsen, Master. Artur Karl | male |
23 | 914.0 | 1.0 | Flegenheim, Mrs. Alfred (Antoinette) | female |
24 | 915.0 | 1.0 | Williams, Mr. Richard Norris II | male |
25 | 916.0 | 1.0 | Ryerson, Mrs. Arthur Larned (Emily Maria Borie) | female |
26 | 917.0 | 3.0 | Robins, Mr. Alexander A | male |
27 | 918.0 | 1.0 | Ostby, Miss. Helene Ragnhild | female |
28 | 919.0 | 3.0 | Daher, Mr. Shedid | male |
29 | 920.0 | 1.0 | Brady, Mr. John Bertram | male |
30 | 921.0 | 3.0 | Samaan, Mr. Elias | male |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
La segunda es más elegante y se utiliza pipe sintax:
dftrain = datatrain |> DataFrame;
typeof(datatrain), typeof(dftrain)
(CSVFiles.CSVFile, DataFrame)
Como nota adicional, el método load
también admite pasar como parámetro un String
con la una url de donde el conjunto de datos pueda ser descargado, el archivo se guarda en el directorio que contiene el archivo que es ejecutado..
Trabajando con los datos¶
A continuación, se discutirán sobre alguna de las funciones implementadas en DataFrames para trabajar con los datos tabulados.
Obteniendo información del dataset¶
Existe un conjunto de funciones que nos permite tener un overview del dataset que se ha cargado. Lo anterior será importante para dar un manejo adecuado a los datos.
Para obtener las columnas del dataframe se utiliza el método names
.
names(dftrain)
12-element Array{String,1}:
"PassengerId"
"Survived"
"Pclass"
"Name"
"Sex"
"Age"
"SibSp"
"Parch"
"Ticket"
"Fare"
"Cabin"
"Embarked"
names(dftest)
11-element Array{String,1}:
"PassengerId"
"Pclass"
"Name"
"Sex"
"Age"
"SibSp"
"Parch"
"Ticket"
"Fare"
"Cabin"
"Embarked"
Las dimensiones de dataframe se puede obtener con el método size
.
size(dftrain)
(891, 12)
size(dftest)
(418, 11)
Una descripción del contenido de las columnas puede realizarse con el método describe
. El método entrega información estadística de las columnas y varias propiedades.
describe(dftrain);
describe(dftest)
variable | mean | min | median | max | |
---|---|---|---|---|---|
Symbol | Union… | Any | Union… | Any | |
1 | PassengerId | 1100.5 | 892.0 | 1100.5 | 1309.0 |
2 | Pclass | 2.26555 | 1.0 | 3.0 | 3.0 |
3 | Name | Abbott, Master. Eugene Joseph | van Billiard, Master. Walter John | ||
4 | Sex | female | male | ||
5 | Age | 30.2726 | 0.17 | 27.0 | 76.0 |
6 | SibSp | 0.447368 | 0.0 | 0.0 | 8.0 |
7 | Parch | 0.392344 | 0.0 | 0.0 | 9.0 |
8 | Ticket | ||||
9 | Fare | 35.6272 | 0.0 | 14.4542 | 512.329 |
10 | Cabin | A11 | G6 | ||
11 | Embarked | C | S |
Renombrando las columnas¶
Renombrar una columna es útil cuando los nombres no son descriptivos y legibles.
rename!(dftrain, :PassengerId=>"Id", :Pclass=>"Class", :Sex=>"Gender")
Id | Survived | Class | Name | |
---|---|---|---|---|
Int64 | Int64 | Int64 | String | |
1 | 1 | 0 | 3 | Braund, Mr. Owen Harris |
2 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) |
3 | 3 | 1 | 3 | Heikkinen, Miss. Laina |
4 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) |
5 | 5 | 0 | 3 | Allen, Mr. William Henry |
6 | 6 | 0 | 3 | Moran, Mr. James |
7 | 7 | 0 | 1 | McCarthy, Mr. Timothy J |
8 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard |
9 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) |
10 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) |
11 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut |
12 | 12 | 1 | 1 | Bonnell, Miss. Elizabeth |
13 | 13 | 0 | 3 | Saundercock, Mr. William Henry |
14 | 14 | 0 | 3 | Andersson, Mr. Anders Johan |
15 | 15 | 0 | 3 | Vestrom, Miss. Hulda Amanda Adolfina |
16 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) |
17 | 17 | 0 | 3 | Rice, Master. Eugene |
18 | 18 | 1 | 2 | Williams, Mr. Charles Eugene |
19 | 19 | 0 | 3 | Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele) |
20 | 20 | 1 | 3 | Masselmani, Mrs. Fatima |
21 | 21 | 0 | 2 | Fynney, Mr. Joseph J |
22 | 22 | 1 | 2 | Beesley, Mr. Lawrence |
23 | 23 | 1 | 3 | McGowan, Miss. Anna "Annie" |
24 | 24 | 1 | 1 | Sloper, Mr. William Thompson |
25 | 25 | 0 | 3 | Palsson, Miss. Torborg Danira |
26 | 26 | 1 | 3 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) |
27 | 27 | 0 | 3 | Emir, Mr. Farred Chehab |
28 | 28 | 0 | 1 | Fortune, Mr. Charles Alexander |
29 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" |
30 | 30 | 0 | 3 | Todoroff, Mr. Lalio |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
rename!(dftest, :PassengerId=>"Id", :Pclass=>"Class", :Sex=>"Gender")
Id | Class | Name | Gender | |
---|---|---|---|---|
Float64 | Float64 | String | String | |
1 | 892.0 | 3.0 | Kelly, Mr. James | male |
2 | 893.0 | 3.0 | Wilkes, Mrs. James (Ellen Needs) | female |
3 | 894.0 | 2.0 | Myles, Mr. Thomas Francis | male |
4 | 895.0 | 3.0 | Wirz, Mr. Albert | male |
5 | 896.0 | 3.0 | Hirvonen, Mrs. Alexander (Helga E Lindqvist) | female |
6 | 897.0 | 3.0 | Svensson, Mr. Johan Cervin | male |
7 | 898.0 | 3.0 | Connolly, Miss. Kate | female |
8 | 899.0 | 2.0 | Caldwell, Mr. Albert Francis | male |
9 | 900.0 | 3.0 | Abrahim, Mrs. Joseph (Sophie Halaut Easu) | female |
10 | 901.0 | 3.0 | Davies, Mr. John Samuel | male |
11 | 902.0 | 3.0 | Ilieff, Mr. Ylio | male |
12 | 903.0 | 1.0 | Jones, Mr. Charles Cresson | male |
13 | 904.0 | 1.0 | Snyder, Mrs. John Pillsbury (Nelle Stevenson) | female |
14 | 905.0 | 2.0 | Howard, Mr. Benjamin | male |
15 | 906.0 | 1.0 | Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood) | female |
16 | 907.0 | 2.0 | del Carlo, Mrs. Sebastiano (Argenia Genovesi) | female |
17 | 908.0 | 2.0 | Keane, Mr. Daniel | male |
18 | 909.0 | 3.0 | Assaf, Mr. Gerios | male |
19 | 910.0 | 3.0 | Ilmakangas, Miss. Ida Livija | female |
20 | 911.0 | 3.0 | Assaf Khalil, Mrs. Mariana (Miriam")" | female |
21 | 912.0 | 1.0 | Rothschild, Mr. Martin | male |
22 | 913.0 | 3.0 | Olsen, Master. Artur Karl | male |
23 | 914.0 | 1.0 | Flegenheim, Mrs. Alfred (Antoinette) | female |
24 | 915.0 | 1.0 | Williams, Mr. Richard Norris II | male |
25 | 916.0 | 1.0 | Ryerson, Mrs. Arthur Larned (Emily Maria Borie) | female |
26 | 917.0 | 3.0 | Robins, Mr. Alexander A | male |
27 | 918.0 | 1.0 | Ostby, Miss. Helene Ragnhild | female |
28 | 919.0 | 3.0 | Daher, Mr. Shedid | male |
29 | 920.0 | 1.0 | Brady, Mr. John Bertram | male |
30 | 921.0 | 3.0 | Samaan, Mr. Elias | male |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
Accediendo a los elementos de un dataframe¶
Diferentes formas puede ser aplicado para acceder a los elementos de un dataframe. A continuación se muestran algunas.
Mediante el punto (.col)
dftrain.Name ###Retorna un array
891-element Array{String,1}:
"Braund, Mr. Owen Harris"
"Cumings, Mrs. John Bradley (Florence Briggs Thayer)"
"Heikkinen, Miss. Laina"
"Futrelle, Mrs. Jacques Heath (Lily May Peel)"
"Allen, Mr. William Henry"
"Moran, Mr. James"
"McCarthy, Mr. Timothy J"
"Palsson, Master. Gosta Leonard"
"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)"
"Nasser, Mrs. Nicholas (Adele Achem)"
"Sandstrom, Miss. Marguerite Rut"
"Bonnell, Miss. Elizabeth"
"Saundercock, Mr. William Henry"
⋮
"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)"
"Shelley, Mrs. William (Imanita Parrish Hall)"
"Markun, Mr. Johann"
"Dahlberg, Miss. Gerda Ulrika"
"Banfield, Mr. Frederick James"
"Sutehall, Mr. Henry Jr"
"Rice, Mrs. William (Margaret Norton)"
"Montvila, Rev. Juozas"
"Graham, Miss. Margaret Edith"
"Johnston, Miss. Catherine Helen \"Carrie\""
"Behr, Mr. Karl Howell"
"Dooley, Mr. Patrick"
Mediante el símbolo ([:col])
dftrain[:Age] ###Retorna un Array
891-element Array{Union{Missing, Float64},1}:
22.0
38.0
26.0
35.0
35.0
missing
54.0
2.0
27.0
14.0
4.0
58.0
20.0
⋮
56.0
25.0
33.0
22.0
28.0
25.0
39.0
27.0
19.0
missing
26.0
32.0
Mediante índice
dftrain[1,5] ###Un elemento específico
"male"
En el ejemplo anterior se accedió a solo un dato de la columna, para acceder a toda la columna ser realiza con (:)
dftrain[:,5] ###Retorna un Array
891-element Array{String,1}:
"male"
"female"
"female"
"female"
"male"
"male"
"male"
"male"
"female"
"female"
"female"
"female"
"male"
⋮
"female"
"female"
"male"
"female"
"male"
"male"
"female"
"male"
"female"
"female"
"male"
"male"
dftrain[:,[5]] ###Retorna un DataFrame
Gender | |
---|---|
String | |
1 | male |
2 | female |
3 | female |
4 | female |
5 | male |
6 | male |
7 | male |
8 | male |
9 | female |
10 | female |
11 | female |
12 | female |
13 | male |
14 | male |
15 | female |
16 | female |
17 | male |
18 | male |
19 | female |
20 | female |
21 | male |
22 | male |
23 | female |
24 | male |
25 | female |
26 | female |
27 | male |
28 | male |
29 | female |
30 | male |
⋮ | ⋮ |
Se puede acceder a un conjunto de columnas a la vez
dftrain[:,[1,4,5,3]] ###Retorna un DataFrame
Id | Name | Gender | Class | |
---|---|---|---|---|
Int64 | String | String | Int64 | |
1 | 1 | Braund, Mr. Owen Harris | male | 3 |
2 | 2 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 1 |
3 | 3 | Heikkinen, Miss. Laina | female | 3 |
4 | 4 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 1 |
5 | 5 | Allen, Mr. William Henry | male | 3 |
6 | 6 | Moran, Mr. James | male | 3 |
7 | 7 | McCarthy, Mr. Timothy J | male | 1 |
8 | 8 | Palsson, Master. Gosta Leonard | male | 3 |
9 | 9 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 3 |
10 | 10 | Nasser, Mrs. Nicholas (Adele Achem) | female | 2 |
11 | 11 | Sandstrom, Miss. Marguerite Rut | female | 3 |
12 | 12 | Bonnell, Miss. Elizabeth | female | 1 |
13 | 13 | Saundercock, Mr. William Henry | male | 3 |
14 | 14 | Andersson, Mr. Anders Johan | male | 3 |
15 | 15 | Vestrom, Miss. Hulda Amanda Adolfina | female | 3 |
16 | 16 | Hewlett, Mrs. (Mary D Kingcome) | female | 2 |
17 | 17 | Rice, Master. Eugene | male | 3 |
18 | 18 | Williams, Mr. Charles Eugene | male | 2 |
19 | 19 | Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele) | female | 3 |
20 | 20 | Masselmani, Mrs. Fatima | female | 3 |
21 | 21 | Fynney, Mr. Joseph J | male | 2 |
22 | 22 | Beesley, Mr. Lawrence | male | 2 |
23 | 23 | McGowan, Miss. Anna "Annie" | female | 3 |
24 | 24 | Sloper, Mr. William Thompson | male | 1 |
25 | 25 | Palsson, Miss. Torborg Danira | female | 3 |
26 | 26 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) | female | 3 |
27 | 27 | Emir, Mr. Farred Chehab | male | 3 |
28 | 28 | Fortune, Mr. Charles Alexander | male | 1 |
29 | 29 | O'Dwyer, Miss. Ellen "Nellie" | female | 3 |
30 | 30 | Todoroff, Mr. Lalio | male | 3 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
dftrain[:,[:Id,:Name,:Gender,:Class]] ###Retorna un DataFrame
Id | Name | Gender | Class | |
---|---|---|---|---|
Int64 | String | String | Int64 | |
1 | 1 | Braund, Mr. Owen Harris | male | 3 |
2 | 2 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 1 |
3 | 3 | Heikkinen, Miss. Laina | female | 3 |
4 | 4 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 1 |
5 | 5 | Allen, Mr. William Henry | male | 3 |
6 | 6 | Moran, Mr. James | male | 3 |
7 | 7 | McCarthy, Mr. Timothy J | male | 1 |
8 | 8 | Palsson, Master. Gosta Leonard | male | 3 |
9 | 9 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 3 |
10 | 10 | Nasser, Mrs. Nicholas (Adele Achem) | female | 2 |
11 | 11 | Sandstrom, Miss. Marguerite Rut | female | 3 |
12 | 12 | Bonnell, Miss. Elizabeth | female | 1 |
13 | 13 | Saundercock, Mr. William Henry | male | 3 |
14 | 14 | Andersson, Mr. Anders Johan | male | 3 |
15 | 15 | Vestrom, Miss. Hulda Amanda Adolfina | female | 3 |
16 | 16 | Hewlett, Mrs. (Mary D Kingcome) | female | 2 |
17 | 17 | Rice, Master. Eugene | male | 3 |
18 | 18 | Williams, Mr. Charles Eugene | male | 2 |
19 | 19 | Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele) | female | 3 |
20 | 20 | Masselmani, Mrs. Fatima | female | 3 |
21 | 21 | Fynney, Mr. Joseph J | male | 2 |
22 | 22 | Beesley, Mr. Lawrence | male | 2 |
23 | 23 | McGowan, Miss. Anna "Annie" | female | 3 |
24 | 24 | Sloper, Mr. William Thompson | male | 1 |
25 | 25 | Palsson, Miss. Torborg Danira | female | 3 |
26 | 26 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) | female | 3 |
27 | 27 | Emir, Mr. Farred Chehab | male | 3 |
28 | 28 | Fortune, Mr. Charles Alexander | male | 1 |
29 | 29 | O'Dwyer, Miss. Ellen "Nellie" | female | 3 |
30 | 30 | Todoroff, Mr. Lalio | male | 3 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
Es posible que, en lugar de indicar cada columna y dependiendo del nombre que posean las columnas, estas puedan ser indicadas por medio de una expresión regular indicado con r\"--\"
. Lo anterior trata de hacer match con los nombres de las columnas y cuando se encuentre alguna coincidencia del nombre de la columna con la regla descrita por la expresión regular esta es devuelta.
En los ejemplos anteriores se accedió a todas las filas de las columnas, sin embargo, puede accederse a un grupo limitado como se muestra a continuación
dftrain[50:100,[:Id,:Name,:Gender,:Class]];
dftrain[[50,75,100],[:Id,:Name,:Gender,:Class]];
Mediante una condición
dftrain[dftrain.Class.==2,:];
Note como en el ejemplo anterior se utiliza broadcasting. La manera en que funciona lo anterior es de la siguiente forma:
Primero se genera un vector con valores booleanos.
arraybool = dftrain.Class.==2;
Luego el arreglo se pasa en el lugar del primer índice cuado se desea acceder a los elementos del dataframe, el arreglo filtra los datos que serán mostrados (todas las filas que coincidan con el valor booleano true).
dftrain[arraybool,:];
Para mayor legibilidad en el código, lo mejor será usar un conjunto de funciones que nos permiten hacer filtrado de la información, por ejemplo usar el método filter
. Usar dichos métodos nos permitirá crear condiciones más robustas, complejas y claras.
En el ejemplo que sigue se utiliza el paquete Pipe
, el cual mejora la utilidad del uso de pipe
, teniendo la posibilidad de usar funciones y pasar argumentos.
Pkg.add("Pipe"); using Pipe;
Updating registry at `~/.julia/registries/General`
Resolving package versions...
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Manifest.toml`
@pipe dftrain |> filter(x->x.Class==2,_)
Id | Survived | Class | Name | |
---|---|---|---|---|
Int64 | Int64 | Int64 | String | |
1 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) |
2 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) |
3 | 18 | 1 | 2 | Williams, Mr. Charles Eugene |
4 | 21 | 0 | 2 | Fynney, Mr. Joseph J |
5 | 22 | 1 | 2 | Beesley, Mr. Lawrence |
6 | 34 | 0 | 2 | Wheadon, Mr. Edward H |
7 | 42 | 0 | 2 | Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott) |
8 | 44 | 1 | 2 | Laroche, Miss. Simonne Marie Anne Andree |
9 | 54 | 1 | 2 | Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson) |
10 | 57 | 1 | 2 | Rugg, Miss. Emily |
11 | 59 | 1 | 2 | West, Miss. Constance Mirium |
12 | 67 | 1 | 2 | Nye, Mrs. (Elizabeth Ramell) |
13 | 71 | 0 | 2 | Jenkin, Mr. Stephen Curnow |
14 | 73 | 0 | 2 | Hood, Mr. Ambrose Jr |
15 | 79 | 1 | 2 | Caldwell, Master. Alden Gates |
16 | 85 | 1 | 2 | Ilett, Miss. Bertha |
17 | 99 | 1 | 2 | Doling, Mrs. John T (Ada Julia Bone) |
18 | 100 | 0 | 2 | Kantor, Mr. Sinai |
19 | 118 | 0 | 2 | Turpin, Mr. William John Robert |
20 | 121 | 0 | 2 | Hickman, Mr. Stanley George |
21 | 123 | 0 | 2 | Nasser, Mr. Nicholas |
22 | 124 | 1 | 2 | Webber, Miss. Susan |
23 | 134 | 1 | 2 | Weisz, Mrs. Leopold (Mathilde Francoise Pede) |
24 | 135 | 0 | 2 | Sobey, Mr. Samuel James Hayden |
25 | 136 | 0 | 2 | Richard, Mr. Emile |
26 | 145 | 0 | 2 | Andrew, Mr. Edgardo Samuel |
27 | 146 | 0 | 2 | Nicholls, Mr. Joseph Charles |
28 | 149 | 0 | 2 | Navratil, Mr. Michel ("Louis M Hoffman") |
29 | 150 | 0 | 2 | Byles, Rev. Thomas Roussel Davids |
30 | 151 | 0 | 2 | Bateman, Rev. Robert James |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
De igual manera, el paquete Queryverse
proporciona la macro @filter
para realizar el filtrado, como se muestra a continuación.
dftrain |> @filter _.Class==2
Id | Survived | Class | Name | Gender | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|---|
10 | 1 | 2 | "Nasser, Mrs. Nicholas (Adele Achem)" | "female" | 14.0 | 1 | 0 | "237736" | 30.0708 | "" | "C" |
16 | 1 | 2 | "Hewlett, Mrs. (Mary D Kingcome) " | "female" | 55.0 | 0 | 0 | "248706" | 16.0 | "" | "S" |
18 | 1 | 2 | "Williams, Mr. Charles Eugene" | "male" | #NA | 0 | 0 | "244373" | 13.0 | "" | "S" |
21 | 0 | 2 | "Fynney, Mr. Joseph J" | "male" | 35.0 | 0 | 0 | "239865" | 26.0 | "" | "S" |
22 | 1 | 2 | "Beesley, Mr. Lawrence" | "male" | 34.0 | 0 | 0 | "248698" | 13.0 | "D56" | "S" |
34 | 0 | 2 | "Wheadon, Mr. Edward H" | "male" | 66.0 | 0 | 0 | "C.A. 24579" | 10.5 | "" | "S" |
42 | 0 | 2 | "Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)" | "female" | 27.0 | 1 | 0 | "11668" | 21.0 | "" | "S" |
44 | 1 | 2 | "Laroche, Miss. Simonne Marie Anne Andree" | "female" | 3.0 | 1 | 2 | "SC/Paris 2123" | 41.5792 | "" | "C" |
54 | 1 | 2 | "Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)" | "female" | 29.0 | 1 | 0 | "2926" | 26.0 | "" | "S" |
57 | 1 | 2 | "Rugg, Miss. Emily" | "female" | 21.0 | 0 | 0 | "C.A. 31026" | 10.5 | "" | "S" |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
... with more rows.
Para la primera coincidencia se puede usar la función findfirst
@pipe dftrain |> findfirst(x->x==2,_.Class) |> dftrain[_,:]
DataFrameRow (12 columns)
Id | Survived | Class | Name | Gender | Age | SibSp | |
---|---|---|---|---|---|---|---|
Int64 | Int64 | Int64 | String | String | Float64? | Int64 | |
10 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 |
Funciones del paquete
first(dftrain,6);
last(dftrain,6);
Funciones útiles¶
El paquete DataFrames
dispone de varias funciones que pueden ser de utilidad cuando se manipula y se transforman datos. A continuación se mencionan algunos de ellos.
@pipe dftrain |> colwise(sum,_[[:Survived,:Class]])
2-element Array{Int64,1}:
342
2057
La función colwise
realiza operaciones por columnas cuando es necesario, en este caso el ejemplo no traduce a algo útil, pero ilustra el uso de la función.
Para columnas que no son numéricas puede usarse la función countmap
, que cuenta el número de veces que aparece un determinado elemento en la serie (columna) de datos. Para el uso se instala y se importa el paquete StatsBase
.
Pkg.add("StatsBase"); using StatsBase
Resolving package versions...
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Manifest.toml`
@pipe dftrain |> countmap(_[:Gender])
Dict{String,Int64} with 2 entries:
"male" => 577
"female" => 314
@pipe dftrain |> countmap(_[:Embarked ])
Dict{String,Int64} with 4 entries:
"Q" => 77
"S" => 644
"C" => 168
"" => 2
Otra función interesante es unique
, que devuelve un array con los valores no duplicados.
genders = dftrain[:Gender] |> unique
2-element Array{String,1}:
"male"
"female"
dftrain[:TotalFamily] = dftrain.SibSp + dftrain.Parch
891-element Array{Int64,1}:
1
1
0
1
0
0
0
4
2
1
2
0
0
⋮
1
1
0
0
0
0
5
0
0
3
0
0
dftest[:TotalFamily] = dftest.SibSp + dftest.Parch
418-element Array{Float64,1}:
0.0
1.0
0.0
0.0
2.0
0.0
0.0
2.0
0.0
2.0
0.0
0.0
1.0
⋮
1.0
2.0
0.0
2.0
0.0
1.0
0.0
0.0
0.0
0.0
0.0
2.0
dftrain[:new] = dftrain.SibSp + dftrain.Parch;
dftrain
Id | Survived | Class | Name | |
---|---|---|---|---|
Int64 | Int64 | Int64 | String | |
1 | 1 | 0 | 3 | Braund, Mr. Owen Harris |
2 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) |
3 | 3 | 1 | 3 | Heikkinen, Miss. Laina |
4 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) |
5 | 5 | 0 | 3 | Allen, Mr. William Henry |
6 | 6 | 0 | 3 | Moran, Mr. James |
7 | 7 | 0 | 1 | McCarthy, Mr. Timothy J |
8 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard |
9 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) |
10 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) |
11 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut |
12 | 12 | 1 | 1 | Bonnell, Miss. Elizabeth |
13 | 13 | 0 | 3 | Saundercock, Mr. William Henry |
14 | 14 | 0 | 3 | Andersson, Mr. Anders Johan |
15 | 15 | 0 | 3 | Vestrom, Miss. Hulda Amanda Adolfina |
16 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) |
17 | 17 | 0 | 3 | Rice, Master. Eugene |
18 | 18 | 1 | 2 | Williams, Mr. Charles Eugene |
19 | 19 | 0 | 3 | Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele) |
20 | 20 | 1 | 3 | Masselmani, Mrs. Fatima |
21 | 21 | 0 | 2 | Fynney, Mr. Joseph J |
22 | 22 | 1 | 2 | Beesley, Mr. Lawrence |
23 | 23 | 1 | 3 | McGowan, Miss. Anna "Annie" |
24 | 24 | 1 | 1 | Sloper, Mr. William Thompson |
25 | 25 | 0 | 3 | Palsson, Miss. Torborg Danira |
26 | 26 | 1 | 3 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) |
27 | 27 | 0 | 3 | Emir, Mr. Farred Chehab |
28 | 28 | 0 | 1 | Fortune, Mr. Charles Alexander |
29 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" |
30 | 30 | 0 | 3 | Todoroff, Mr. Lalio |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
En el ejemplo anterior una columna, con el nombre TotalFamily
, fue añadida al dataframe. Una columna adicional es agregado, new
, para ilustrar cómo se elimina.
select!(dftrain,Not([:new]))
Id | Survived | Class | Name | |
---|---|---|---|---|
Int64 | Int64 | Int64 | String | |
1 | 1 | 0 | 3 | Braund, Mr. Owen Harris |
2 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) |
3 | 3 | 1 | 3 | Heikkinen, Miss. Laina |
4 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) |
5 | 5 | 0 | 3 | Allen, Mr. William Henry |
6 | 6 | 0 | 3 | Moran, Mr. James |
7 | 7 | 0 | 1 | McCarthy, Mr. Timothy J |
8 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard |
9 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) |
10 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) |
11 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut |
12 | 12 | 1 | 1 | Bonnell, Miss. Elizabeth |
13 | 13 | 0 | 3 | Saundercock, Mr. William Henry |
14 | 14 | 0 | 3 | Andersson, Mr. Anders Johan |
15 | 15 | 0 | 3 | Vestrom, Miss. Hulda Amanda Adolfina |
16 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) |
17 | 17 | 0 | 3 | Rice, Master. Eugene |
18 | 18 | 1 | 2 | Williams, Mr. Charles Eugene |
19 | 19 | 0 | 3 | Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele) |
20 | 20 | 1 | 3 | Masselmani, Mrs. Fatima |
21 | 21 | 0 | 2 | Fynney, Mr. Joseph J |
22 | 22 | 1 | 2 | Beesley, Mr. Lawrence |
23 | 23 | 1 | 3 | McGowan, Miss. Anna "Annie" |
24 | 24 | 1 | 1 | Sloper, Mr. William Thompson |
25 | 25 | 0 | 3 | Palsson, Miss. Torborg Danira |
26 | 26 | 1 | 3 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) |
27 | 27 | 0 | 3 | Emir, Mr. Farred Chehab |
28 | 28 | 0 | 1 | Fortune, Mr. Charles Alexander |
29 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" |
30 | 30 | 0 | 3 | Todoroff, Mr. Lalio |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
Para eliminar una fila del dataframe se puede usar la función delete!
y para añadir una fila se puede usar la función push!
. En delete!
se indica el dataframe y el índice de la fila que debe ser eliminada.
Existen otro conjunto de funciones que son de utilizada cuando se requiere realizar una consulta compleja en la data, el paquete Queryverse
por contener el módulo Query
ofrece opciones interesantes que pueden ser consultados en los siguientes enlaces: link₁, lin₂, lin₃.
Más funciones puede ser encontrado en la siguiente introducción al paquete DataFrames
.
Manejo de fechas¶
Es usual que al indagar en los datos y transformarlos se manejen fechas. En Julia ello se realiza con el paquete Dates
, el cual nos permite dar formato a las fechas y realizar operaciones con ellas.
Para construir un objeto tipo fecha se pueden usar los constructores Date
y DateTime
, los cuales diferen en la precisión (día y milisegundos respectivamente).
Pkg.add("Dates"); using Dates
Resolving package versions...
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Manifest.toml`
Date(2021), Date(2021,5), Date(2021,6,4)
(Date("2021-01-01"), Date("2021-05-01"), Date("2021-06-04"))
DateTime(2021), DateTime(2021,5), DateTime(2021,6,4)
(DateTime("2021-01-01T00:00:00"), DateTime("2021-05-01T00:00:00"), DateTime("2021-06-04T00:00:00"))
En algunas ocasiones se encontrará necesario dar formato a una cadena de caracteres que representan una fecha, para ello en los constructores se especifica el formato de la cadena de texto, en el cual existen diferentes opciones.
Date("2021-3","yyyy-m"), Date("2021/08/9","yy/mm/d"), Date("20210809","yyyymmdd"), Date("21-3","yyyy-m")
(Date("2021-03-01"), Date("2021-08-09"), Date("2021-08-09"), Date("0021-03-01"))
Si existen muchos datos de fecha a formatear y tienen un formato similar, es más eficiente crear el formato primero y luego usarlo en el constructor, por ejemplo: dateformat=DateFormat(\"dd/mm/yyyy\")
.
En los ejemplos se puede notar que exite un error para la última fecha, cuando ocurre esas situaciones se debe parsear la cadena de texto para ser convertido a una cadena tipo fecha.
parse(Dates.Date,"2021-3",Dates.DateFormat("yyyy-m"))
2021-03-01
Para conocer más sobre el manejo de fechas revisar esta documentación. md
Respondiendo interrogantes y visualización de datos¶
Para ilustrar cómo se utilizan algunas de las funciones más avanzadas, mencionadas hacia el final de la sección “Funciones útiles”, podemos dar respuesta a las siguientes preguntas:
¿Cuántas personas iban en el titanic?
¿Cuántos hombres y mujeres sobrevivieron?
¿Cuál fué el top 10 de edad que más sobrevivieron?
¿Cuál fue el top 10 de edad que no lograron sobrevivir?
El paquete StatPlots
ofrece una macro @df
, el cual se usa junto con Plots
para graficar datos de dataframe.
Pkg.add("StatsPlots"); using StatsPlots
Resolving package versions...
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Manifest.toml`
A continuación una rutina para responder la primera interrogante.
begin ###Preparamos los datos para unir los dataframes
survivedtest = @pipe load("./titanic/gender_submission.csv") |>
DataFrame |>
rename!(_,:PassengerId=>"Id") |>
Float64.(_)
dftest₁ = @from i in dftest begin
@join j in survivedtest on i.Id equals j.Id
@select {i.Id, j.Survived, i.Class,i.Name, i.Gender, i.Age, i.SibSp, i.Parch, i.Ticket, i.Fare, i.Cabin, i.Embarked, i.TotalFamily}
@collect DataFrame
end
end;
df = vcat(dftrain[:,:], dftest₁[:,:]); ###Se deben unir los dataframes
describe(df);
¿Cuántas personas iban en el titanic?¶
length(df[:Id])
1309
¿Cuántos hombres y mujeres sobrevivieron?¶
genders
2-element Array{String,1}:
"male"
"female"
👨 = df |> @filter(_.Gender=="male" && _.Survived==1) |> collect |> length
109
👩 = df |> @filter(_.Gender=="female" && _.Survived==1) |> collect |> length
385
¿Cuál fué el top 10 de edad que más sobrevivieron?¶
agesurviver = df[df.Survived.==1, [:Age]] |>
dropmissing |>
@groupby(_[:Age]) |>
@map({Edadesₛ=key(_), Countₛ=length(_)}) |>
DataFrame;
agesurviver
Edadesₛ | Countₛ | |
---|---|---|
Float64 | Int64 | |
1 | 38.0 | 7 |
2 | 26.0 | 10 |
3 | 35.0 | 14 |
4 | 27.0 | 15 |
5 | 14.0 | 3 |
6 | 4.0 | 7 |
7 | 58.0 | 4 |
8 | 55.0 | 4 |
9 | 34.0 | 6 |
10 | 15.0 | 5 |
11 | 28.0 | 9 |
12 | 3.0 | 6 |
13 | 19.0 | 12 |
14 | 49.0 | 4 |
15 | 29.0 | 13 |
16 | 21.0 | 8 |
17 | 5.0 | 4 |
18 | 17.0 | 8 |
19 | 32.0 | 9 |
20 | 0.83 | 2 |
21 | 30.0 | 16 |
22 | 33.0 | 9 |
23 | 23.0 | 10 |
24 | 32.5 | 1 |
25 | 12.0 | 3 |
26 | 24.0 | 20 |
27 | 22.0 | 21 |
28 | 16.0 | 8 |
29 | 40.0 | 6 |
30 | 9.0 | 3 |
⋮ | ⋮ | ⋮ |
@pipe sort!(agesurviver,[:Countₛ],rev=true) |> first(_,10)
Edadesₛ | Countₛ | |
---|---|---|
Float64 | Int64 | |
1 | 22.0 | 21 |
2 | 24.0 | 20 |
3 | 30.0 | 16 |
4 | 18.0 | 16 |
5 | 36.0 | 16 |
6 | 27.0 | 15 |
7 | 35.0 | 14 |
8 | 29.0 | 13 |
9 | 19.0 | 12 |
10 | 45.0 | 12 |
@pipe df[df.Survived.==1, [:Age]] |>
dropmissing |>
groupby(_,:Age) |>
combine(_,:Age=>length=>:Countₛ) |>
sort(_,[:Countₛ],rev=true) |>
first(_,10)
Age | Countₛ | |
---|---|---|
Float64 | Int64 | |
1 | 22.0 | 21 |
2 | 24.0 | 20 |
3 | 30.0 | 16 |
4 | 18.0 | 16 |
5 | 36.0 | 16 |
6 | 27.0 | 15 |
7 | 35.0 | 14 |
8 | 29.0 | 13 |
9 | 19.0 | 12 |
10 | 45.0 | 12 |
¿Cuál fue el top 10 de edad que no lograron sobrevivir?¶
notagesurviver = df[df.Survived.==0, [:Age]] |>
dropmissing |>
@groupby(_[:Age]) |>
@map({Edadesₙₛ=key(_), Countₙₛ=length(_)}) |>
DataFrame;
@pipe sort!(notagesurviver,[:Countₙₛ],rev=true) |> first(_,10)
Edadesₙₛ | Countₙₛ | |
---|---|---|
Float64 | Int64 | |
1 | 21.0 | 33 |
2 | 25.0 | 27 |
3 | 24.0 | 27 |
4 | 30.0 | 24 |
5 | 28.0 | 23 |
6 | 18.0 | 23 |
7 | 22.0 | 22 |
8 | 26.0 | 20 |
9 | 19.0 | 17 |
10 | 29.0 | 17 |
@pipe df[df.Survived.==0, [:Age]] |>
dropmissing |>
groupby(_,:Age) |>
combine(_,:Age=>length=>:Countₛ) |>
sort(_,[:Countₛ],rev=true) |>
first(_,10)
Age | Countₛ | |
---|---|---|
Float64 | Int64 | |
1 | 21.0 | 33 |
2 | 25.0 | 27 |
3 | 24.0 | 27 |
4 | 30.0 | 24 |
5 | 28.0 | 23 |
6 | 18.0 | 23 |
7 | 22.0 | 22 |
8 | 26.0 | 20 |
9 | 19.0 | 17 |
10 | 29.0 | 17 |
Gráfica con Plots¶
dfplotₛ = DataFrame();
dfplotₛ[:Gender] = @pipe df[df.Survived.==1, [:Gender]] |>
map(x->x=="male" ? 0 : 1, _[:Gender])
494-element Array{Int64,1}:
1
1
1
1
1
1
1
1
0
1
0
1
0
⋮
1
1
1
1
1
1
1
1
1
1
1
1
dfplotₙₛ = DataFrame();
dfplotₙₛ[:Gender] = @pipe df[df.Survived.==0, [:Gender]] |>
map(x->x=="male" ? 0 : 1, _[:Gender])
815-element Array{Int64,1}:
0
0
0
0
0
0
0
1
0
1
0
1
0
⋮
0
0
0
0
0
0
0
0
0
0
0
0
@df dfplotₛ plot(:Gender, seriestype=:histogram, legend=:none, bar_width=0.9, xticks=([0.15,1.15],["Varón", "Mujer"]), title="Sobrevivientes")
@df dfplotₙₛ plot(:Gender, seriestype=:histogram, legend=:none, bar_width=0.9, xticks=([0.15,1.15],["Varón", "Mujer"]), title="No Sobrevivientes")
f = DataFrame(a = 1:10, b = 10 * rand(10), c = 10 * rand(10));
@df f plot(:a, [:b :c])
Paquete PlutoUI¶
Este paquete es que agrega syntactic sugar para alguna de las funcionalidades de Pluto. PlutoUI
puede ser implementado para colocar widgets en el cuaderno y hacer más interactivo el programa que se escriba.
Pkg.add("PlutoUI"); using PlutoUI;
Resolving package versions...
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Project.toml`
No Changes to `~/work/Intro-Julia-2021/Intro-Julia-2021/Manifest.toml`
@bind gender Select(genders)
LoadError: UndefVarError: @bind not defined
in expression starting at In[75]:1
Stacktrace:
[1] top-level scope
[2] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
@bind number Slider(1:9)
LoadError: UndefVarError: @bind not defined
in expression starting at In[76]:1
Stacktrace:
[1] top-level scope
[2] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
gender, number
UndefVarError: gender not defined
Stacktrace:
[1] top-level scope at In[77]:1
[2] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
Utilidades de Queryverse
¶
datatrain |> @vlplot(:point,x=:Survived,y=:Pclass,color="Sex:n")
Unable to revert mtime: /usr/share/fonts
Unable to revert mtime: /usr/share/fonts/cMap
Unable to revert mtime: /usr/share/fonts/cmap
Unable to revert mtime: /usr/share/fonts/truetype
Unable to revert mtime: /usr/share/fonts/type1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-cns1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-gb1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-japan1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-japan2
Unable to revert mtime: /usr/share/fonts/cmap/adobe-korea1
Unable to revert mtime: /usr/share/fonts/truetype/dejavu
Unable to revert mtime: /usr/share/fonts/truetype/droid
Unable to revert mtime: /usr/share/fonts/truetype/lato
Unable to revert mtime: /usr/share/fonts/truetype/liberation
Unable to revert mtime: /usr/share/fonts/truetype/noto
Unable to revert mtime: /usr/share/fonts/type1/gsfonts
Unable to revert mtime: /usr/share/fonts/cMap
Unable to revert mtime: /usr/share/fonts/cmap/adobe-cns1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-gb1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-japan1
Unable to revert mtime: /usr/share/fonts/cmap/adobe-japan2
Unable to revert mtime: /usr/share/fonts/cmap/adobe-korea1
Es posible realizar una gráfica como se muestra en el ejemplo, donde no se usa Plots.jl
.
datatrain |> Voyager
(electron:7624): Gtk-WARNING **: 18:57:11.426: cannot open display:
Voyager
es una utilidad que permite explorar de forma rápida los gráficos, ofreciendo la posibilidad de visualizarlos con gráficos.