-
Notifications
You must be signed in to change notification settings - Fork 120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: Add spanish translation, Literate.jl backend #30
Open
miguelraz
wants to merge
25
commits into
bkamins:master
Choose a base branch
from
miguelraz:spanish-tutorials
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
25 commits
Select commit
Hold shift + click to select a range
a200be1
add literate jl files
miguelraz 53433ec
traslation to spanish README
miguelraz 88f18ed
translation to spanish 02
miguelraz cf1fcf7
translation to spanish 02_basicinfo.jl
miguelraz 9b82f62
translation to spanish 03_missingvalues.jl
miguelraz 51662a6
translation to spanish 04_loadsave.jl
miguelraz 80375c0
translation to spanish 05_columns.jl
miguelraz 9769314
spanish translation of 06_rows.jl
miguelraz 3bb8157
spanish translation of 07_factors.jl
miguelraz b4a9c49
spanish translation of 08_joins.jl
miguelraz f461dd0
spanish translation of 09_reshaping.jl
miguelraz 73a8f67
spanish translation of 10_transforms.jl
miguelraz 49ea34a
update topics in README.md
miguelraz 670e441
spanish translation of 11_performance.jl
miguelraz 2f0ff63
spanish translation of 12_pitfalls.jl
miguelraz 669663c
spanish translation of 13_extras.jl
miguelraz fb6a33c
Update literate_notebooks/src-ES/01_constructors.jl
miguelraz e2a8f25
Update literate_notebooks/src-ES/01_constructors.jl
miguelraz c862b3b
Update literate_notebooks/src-ES/01_constructors.jl
miguelraz 8a31c93
Update literate_notebooks/src-ES/01_constructors.jl
miguelraz b88e172
spanish translation - add cheatsheets and language comparisons docs
miguelraz ed6c52c
Merge branch 'spanish-tutorials' of https://github.com/miguelraz/Juli…
miguelraz c0dd3c4
spanish translation - missed intro in 03_missingvalues.jl
miguelraz 96a326b
spanish translation - add .toml files, fixup typos and word choices
miguelraz 9edb30d
update stale 01_constructors.jl
miguelraz File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
# # Introducción a DataFrames | ||
# **[Bogumił Kamiński](http://bogumilkaminski.pl/about/), May 23, 2018** | ||
# (Traducción por Miguel Raz, Abril 16 2021) | ||
# | ||
# Empecemos cargando el paquete de `DataFrames`. | ||
|
||
using DataFrames | ||
|
||
# ## Constructores y conversiones | ||
|
||
#- | ||
|
||
# ### Constructores | ||
# | ||
# En esta sección, verás distintas maneras de crear un `DataFrame` usando el constructor `DataFrame()`. | ||
# | ||
# Primero, creemos un DataFrame vacío. | ||
|
||
DataFrame() # DataFrame vacío | ||
|
||
# O podemos llamar al constructor usando keyword arguments para agregar columnas al `DataFrame`. | ||
|
||
DataFrame(A=1:3, B=rand(3), C=randstring.([3,3,3])) | ||
|
||
# Podemos crear el `DataFrame` de un diccionario, en cuyo caso las llaves del diccionario estarán ordenadas para crear las columnas del `DataFrame`. | ||
|
||
x = Dict("A" => [1,2], "B" => [true, false], "C" => ['a', 'b']) | ||
DataFrame(x) | ||
|
||
# En vez de explícitamente crear el diccionario primero, como hicimos arriba, podríamos pasar argumentos de `DataFrame` con la sintaxis de pares llave-valor de un diccionario. | ||
# | ||
# Notar que en este caso, usamos símbolos para denotar los nombres de las columnas y los argumentos no están ordenados. Por ejemplo, `:A`, el símbolo, produce `A`, el nombre de la primera columna: | ||
|
||
DataFrame(:A => [1,2], :B => [true, false], :C => ['a', 'b']) | ||
|
||
# Aquí creamos un `DataFrame` de un vector de vectores, donde cada vector se convierte en una columna. | ||
|
||
DataFrame([rand(3) for i in 1:3]) | ||
|
||
# Por ahora podemos construir un `DataFrame` de un `Vector` de átomos, creando un `DataFrame` con una sola hilera. En versiones futuras de DataFrames.jl, esto arrojará un error. | ||
|
||
DataFrame(rand(3)) | ||
|
||
# Si tienes un vector de átomos, es mejor usar un vector transpuesto (pues efectivamente uno pasa un arreglo bidimensional, lo cual sí tiene soporte.) | ||
|
||
DataFrame(transpose([1, 2, 3])) | ||
|
||
# Pasa un segundo argumento para darle nombre a las columnas. | ||
|
||
DataFrame([1:3, 4:6, 7:9], [:A, :B, :C]) | ||
|
||
# Aquí creamos un `DataFrame` de una matriz, | ||
|
||
DataFrame(rand(3,4)) | ||
|
||
# y aquí hacemos lo mismo pero también pasamos los nombres de las columnas. | ||
|
||
DataFrame(rand(3,4), Symbol.('a':'d')) | ||
|
||
# También podemos pasar un DataFrame no inicializado. | ||
# | ||
# Aquí pasamos los tipos de las columnas, nombres y número de hileras; obtemenos un `missing` en la columna :C porque `Any >: Missing`: | ||
|
||
DataFrame([Int, Float64, Any], [:A, :B, :C], 1) | ||
|
||
# Aquí nosotros creamos un `DataFrame`, pero la columna `:C` es `#undef` y Jupyter tiene problemas para mostrarlo (Esto funciona en el REPL sin problemas.) | ||
# | ||
|
||
DataFrame([Int, Float64, String], [:A, :B, :C], 1) | ||
|
||
# Para inicializar un `DataFrame` con nombres de columnas, pero sin filas, usamos | ||
|
||
DataFrame([Int, Float64, String], [:A, :B, :C], 0) | ||
|
||
# Esta sintaxis nos da una manera rápida de crear un `DataFrame` homogéneo. | ||
|
||
DataFrame(Int, 3, 5) | ||
|
||
# El ejemplo es similar, pero tiene columnas no-homogéneas. | ||
|
||
DataFrame([Int, Float64], 4) | ||
|
||
# Finalmente, podemos creat un `DataFrame` copiando uno anterior. | ||
# | ||
# Notar que `copy` crea un copia superficial. | ||
|
||
y = DataFrame(x) | ||
z = copy(x) | ||
(x === y), (x === z), isequal(x, z) | ||
|
||
# ### Conversión a matrices | ||
# | ||
# Empecemos creando un `DataFrame` con dos filas y dos columnas. | ||
|
||
x = DataFrame(x=1:2, y=["A", "B"]) | ||
|
||
# Podemos crear una matriz pasando este `DataFrame` a `Matrix`. | ||
|
||
Matrix(x) | ||
|
||
# Este funciona aún si el `DataFrame` tiene `missing`s: | ||
|
||
x = DataFrame(x=1:2, y=[missing,"B"]) | ||
|
||
#- | ||
|
||
Matrix(x) | ||
|
||
# En los dos ejemplos de matrices pasados, Julia creó matrices con elementos de tipo `Any`. Podemos ver más claramente qué tipo de matriz es inferido cuando pasamos, por ejemplo, un `DataFrame` de enteros a `Matrix`, creando un arreglo 2D de `Int64`s: | ||
|
||
x = DataFrame(x=1:2, y=3:4) | ||
|
||
#- | ||
|
||
Matrix(x) | ||
|
||
# En el próximo ejemplo, Julia correctamente identifica que el tipo `Union` se necesita para expresar el tipo resultante de `Matrix` (el cual contiene `missing`s). | ||
|
||
|
||
x = DataFrame(x=1:2, y=[missing,4]) | ||
|
||
#- | ||
|
||
Matrix(x) | ||
|
||
# ¡Notemos que no podemos covertir forzosamente valores `missings` a `Int`s! | ||
|
||
Matrix{Int}(x) | ||
|
||
# ### Lipiando con nombres de columnas repetidos | ||
# | ||
# Podemos pasar el keyword argument `makeunique` para permitir usar nombres duplicados (se desduplican) | ||
|
||
df = DataFrame(:a=>1, :a=>2, :a_1=>3; makeunique=true) | ||
|
||
# Si no es así, los duplicados no se permitirán después. | ||
|
||
df = DataFrame(:a=>1, :a=>2, :a_1=>3) | ||
|
||
# Una excepción es un constructor al que se le pasan los nombres de columnas como keyword arguments. | ||
# No puedes pasar `makeunique` para permitir duplicados en este caso. | ||
|
||
df = DataFrame(a=1, a=2, makeunique=true) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# # Introducción a DataFrames | ||
# **[Bogumił Kamiński](http://bogumilkaminski.pl/about/), May 23, 2018** | ||
# Traducción por Miguel Raz, Abril 17, 2021 | ||
|
||
using DataFrames # cargar el paquete | ||
|
||
# ## Obteniendo información básica de un DataFrame | ||
# | ||
# | ||
# Empecemos creando un objeto `DataFrame`, llamado `x`, para que podamos aprender como sacarle información. | ||
|
||
x = DataFrame(A = [1, 2], B = [1.0, missing], C = ["a", "b"]) | ||
|
||
# La función estándar `size` nos dice las dimensiones del `DataFrame`, | ||
|
||
size(x), size(x, 1), size(x, 2) | ||
|
||
# y al igual que `nrow y `ncol` de R; `length`; nos da el número de columnas. | ||
|
||
nrow(x), ncol(x), length(x) | ||
|
||
# `describe` nos da estadísticas descriptivas básicas de nuestro `DataFrame`. | ||
|
||
describe(x) | ||
|
||
# Usa `showcols` para obetner información sobre columnas guardadas en un DataFrame. | ||
|
||
showcols(x) | ||
|
||
# `names` devuelve el nombre de todas las columnas, | ||
|
||
names(x) | ||
|
||
# y `eltypes` el de sus tipos. | ||
|
||
eltypes(x) | ||
|
||
# Aquí creamos un DataFrame más grande | ||
|
||
y = DataFrame(rand(1:10, 1000, 10)); | ||
|
||
# y usamos `head` para asomarnos a sus primeras filas | ||
|
||
head(y) | ||
|
||
# y `tail` para sus últimas filas. | ||
|
||
tail(y, 3) | ||
|
||
# ### Operaciones elementales para asignar y sacar | ||
# | ||
# Dado un objeto DataFrame llamado `x`, aquí hay 3 maneras de tomar una de sus columnas como un `Vector`: | ||
|
||
x[1], x[:A], x[:, 1] | ||
|
||
# Para tomar una fila de un DataFrame, lo indexamos como sigue | ||
|
||
x[1, :] | ||
|
||
# Podemos agarrar una sola celda o elemento con la misma sintaxis que usamos para elementos de arreglos. | ||
|
||
x[1, 1] | ||
|
||
# Asignar también se puede hacer con rangos a un escalar, | ||
|
||
x[1:2, 1:2] = 1 | ||
x | ||
|
||
# a un vector de longitud igual al número de filas asignadas, | ||
|
||
x[1:2, 1:2] = [1,2] | ||
x | ||
|
||
# o a otro DataFrame de tamaño igual. | ||
|
||
x[1:2, 1:2] = DataFrame([5 6; 7 8]) | ||
x | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
# # Introducción a DataFrames | ||
# **[Bogumił Kamiński](http://bogumilkaminski.pl/about/), May 23, 2018** | ||
# (Traducción de Miguel Raz Guzmán Macedo) | ||
|
||
using DataFrames # cargar paquete | ||
|
||
# ## Manejo de valores faltantes | ||
# | ||
# Un tipo singulete `Missings.Missing` permite lidiar con valores faltantes | ||
|
||
missing, typeof(missing) | ||
|
||
# Los arreglos automaticamente crean una unión de tipos apropiada. | ||
|
||
x = [1, 2, missing, 3] | ||
|
||
# `ismissing` checa si se le pasa un valor faltante. | ||
|
||
ismissing(1), ismissing(missing), ismissing(x), ismissing.(x) | ||
|
||
# Podemos extrar el tipo combinado con Missing de una `Union` via | ||
# | ||
# (¡Esto es muy útil para los arreglos!) | ||
|
||
eltype(x), Missings.T(eltype(x)) | ||
|
||
# comparaciones de `missing` producen `missing`. | ||
|
||
missing == missing, missing != missing, missing < missing | ||
|
||
# Eso también es cierto cuando `missing`s se comparan con valores de otros tipos. | ||
|
||
1 == missing, 1 != missing, 1 < missing | ||
|
||
# `isequal`, `isless`, y `===` producen resultados de tipo `Bool`. | ||
# | ||
|
||
isequal(missing, missing), missing === missing, isequal(1, missing), isless(1, missing) | ||
|
||
# En los próximos ejemplos, vemos que muchas (no todas) funciones manejan `missing`. | ||
|
||
map(x -> x(missing), [sin, cos, zero, sqrt]) # part 1 | ||
|
||
#- | ||
|
||
map(x -> x(missing, 1), [+, - , *, /, div]) # part 2 | ||
|
||
#- | ||
|
||
map(x -> x([1,2,missing]), [minimum, maximum, extrema, mean, any, float]) # part 3 | ||
|
||
# `skipmissing` devuelve un iterador que salta valores faltantes. Podemos usar `collect` y `skipmissing` para crear un arreglo que excluye estos valores faltantes. | ||
|
||
collect(skipmissing([1, missing, 2, missing])) | ||
|
||
# Similarmente, aquí combinamos `collect` y `Missings.replace` para crear un arreglo que reemplaza todos los valores faltantes con algún valor (`NaN`, en este caso). | ||
|
||
collect(Missings.replace([1.0, missing, 2.0, missing], NaN)) | ||
|
||
# Otra manera de hacer esto es: | ||
|
||
coalesce.([1.0, missing, 2.0, missing], NaN) | ||
|
||
# Cuidado: `nothing` también sería reemplazado aquí (Para Julia 0.7 un comportamiento más sofisticado de `coalesce` permite que esquivemos este problema.) | ||
|
||
coalesce.([1.0, missing, nothing, missing], NaN) | ||
|
||
# Puedes usar `recode` si tienes tipos homogéneos en el output. | ||
|
||
recode([1.0, missing, 2.0, missing], missing=>NaN) | ||
|
||
# Puedes usar `unique` o `levels` para obtener valores únicos con o sin missings, respectivamente. | ||
|
||
unique([1, missing, 2, missing]), levels([1, missing, 2, missing]) | ||
|
||
# En este ejemplo, convertimos `x` a `y` con `allowmissing`, donde `y` tiene un tipo que acepta missings. | ||
|
||
x = [1,2,3] | ||
y = allowmissing(x) | ||
|
||
# Después, lo convertimos de regreso con `disallowmissing`. ¡Esto falla si `y` contiene valores faltantes! | ||
|
||
z = disallowmissing(y) | ||
x,y,z | ||
|
||
# En el próximo ejemplo, mostramos que el tipo de cada columna de `x` es inicialmente `Int64`. Después de usar `allowmissing!`, aceptamos valores faltantes en las columnas 1 y 3. Los tipos de esas columnas se convierten en `Union`es de `Int64` y `Missings.Missing`. | ||
|
||
x = DataFrame(Int, 2, 3) | ||
println("Before: ", eltypes(x)) | ||
allowmissing!(x, 1) # Hacer que la primera columna permita valores faltantes | ||
allowmissing!(x, :x3) # Hacer que la columna :x3 acepte valores faltantes | ||
println("After: ", eltypes(x)) | ||
|
||
# En este ejemplo, usaremos `completecases` para encontrar todas las hileras de un `DataFrame` que tengan datos completos. | ||
|
||
x = DataFrame(A=[1, missing, 3, 4], B=["A", "B", missing, "C"]) | ||
println(x) | ||
println("Complete cases:\n", completecases(x)) | ||
|
||
# Podemos usar `dropmissing` o `dropmissing!` para quitar las filas con datos incompletos de un `DataFrame` y crear un nuevo `DataFrame` o mutar el original en su lugar. | ||
|
||
y = dropmissing(x) | ||
dropmissing!(x) | ||
[x, y] | ||
|
||
# Cuando llamamos `showcols` en un `DataFrame` con valores faltantes que les hicimos `drop`, las columnes siguen permitiendo valores faltantes. | ||
|
||
showcols(x) | ||
|
||
# Como ya excluimos los valores faltantes, podemos usar `disallowmissing!` con seguridad para que las columnas ya no puedan aceptar valores faltantes. | ||
|
||
disallowmissing!(x) | ||
showcols(x) | ||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we delete this? Since it will be a 1.0 compatible anyway so there's no need to talk about deprecations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah there's a couple of pre DataFrames 1.0 kinks that can be cleaned up. I'm waiting to run the notebooks and test that everything works to filter many of these out. I still don't know much about DataFrames so I don't know what is/isn't design yet.