Tracks
/
Julia
Julia
/
Ejercicios
/
Etiquetas con nombres
Etiquetas con nombres

Etiquetas con nombres

Ejercicio de aprendizaje

Introducción

Muchos lenguajes tienen una forma, como null o none, de indicar un valor que no existe. Como Julia está diseñado para manejar grandes volúmenes de datos (a menudo desordenados), tiene varias formas de representar la nada.

El objetivo general es marcar los valores faltantes o sospechosos a medida que aparecen, y luego continuar sin lanzar una excepción.

nothing

Si un valor realmente no existe, se representa con nothing. Esto es probablemente lo más parecido a lo que harían C (NULL) o Python (None).

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

Así que nothing es un valor singleton de tipo Nothing, y podemos comprobarlo.

Un uso común de nothing es como valor de retorno (o no-valor) de funciones que se usan solo por sus efectos secundarios (imprimir, configurar la red, o lo que sea).

missing

Para situaciones en las que un valor existe en teoría, pero no sabemos cuál es, se usa missing. Por ejemplo, al contar vehículos que viajan por una carretera, puede que los observadores humanos necesiten un descanso o que los sensores automáticos fallen, pero el tráfico sigue fluyendo.

Así, missing es un marcador de posición que advierte a las personas que deben decidir cómo manejar ese hueco en los datos.

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})

julia> ismissing.(mv)  # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
 0
 0
 1

Pocos lenguajes más tienen esta funcionalidad incorporada, pero hay análogos cercanos: NA en R o NULL en SQL.

Por lo general, las expresiones devuelven missing de forma predeterminada si hay valores missing presentes. Si quieres que estos valores se ignoren, usa la función skipmissing() para dejarlo explícito:

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> sum(mv)  # missing in, missing out
missing

julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])

julia> collect(skipmissing(mv))
2-element Vector{Int64}:
 1
 2

julia> sum(skipmissing(mv))  # functions like sum() can work with iterators
3

Como skipmissing crea un iterador, envuélvelo en collect() si necesitas un vector.

A veces es útil reemplazar los valores missing con algún valor predeterminado. La macro @coalesce() es útil para esto, ya que devuelve el primer valor que no sea missing (o missing si no hay nada más).

julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
 "I"
 "exist"
 missing

julia> [@coalesce(s, "-") for  s in str]
3-element Vector{String}:
 "I"
 "exist"
 "-"

NaN

Abreviatura de «Not a Number», NaN señala un problema de cálculo en situaciones donde se esperaba un número.

julia> v = [0, 1, -1]
3-element Vector{Int64}:
  0
  1
 -1

julia> v / 0
3-element Vector{Float64}:
 NaN
  Inf
 -Inf
 
julia> sum(v / 0)
NaN

Cualquier tipo de cálculo sobre datos que incluyan un NaN dará como resultado NaN.

Actualmente no hay una función especial para eliminar los valores NaN, pero la función estándar filter() puede hacerlo de forma bastante sencilla. Solo se copiarán al array de resultados los valores para los cuales cierta condición dada sea true:

julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
 1.0
 2.0

Instrucciones

En este ejercicio vas a escribir código para crear insignias de identificación que los empleados de la fábrica puedan llevar puestas. Los empleados tienen un ID, un nombre y el nombre de un departamento. Las etiquetas de las insignias de los empleados tienen este formato: "[id] - name - DEPARTMENT".

1. Crea una insignia para un empleado

Implementa la función print_name_badge. Debe recibir un ID, un nombre y un departamento. Debe devolver la etiqueta de la insignia, con el nombre del departamento en mayúsculas.

julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"

2. Crea una insignia para un empleado nuevo

Debido a una peculiaridad del sistema, a veces los empleados nuevos todavía no tienen un ID cuando empiezan a trabajar en la fábrica. Como las insignias son obligatorias, recibirán una insignia temporal sin el prefijo del ID.

Extiende la función print_name_badge. Cuando falte el ID, debe crear una insignia sin él.

julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"

3. Crea una insignia para el dueño

Incluso el dueño de la fábrica tiene que llevar una insignia en todo momento. Sin embargo, un dueño no tiene departamento y nunca lo tendrá: está por encima de todos los departamentos. En este caso, la etiqueta debe devolver "OWNER" en lugar del nombre del departamento.

Extiende la función print_name_badge. Cuando el departamento sea nothing, asume que la insignia pertenece al dueño de la empresa.

julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"

Ten en cuenta que también es posible que el dueño sea un empleado nuevo.

julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"

4. Calcula el salario total de los empleados que no tienen ID

Como una métrica aproximada de qué tan bien se están emitiendo los ID, quieres ver el salario combinado de los empleados que no tienen ID. Un valor alto significa que hay muchos esperando, o que el problema está afectando a personas con más antigüedad: ambas cosas son malas.

Implementa la función salaries_no_id, que recibe un vector de ID y un vector correspondiente de salarios, y devuelve la suma de los salarios de las personas que todavía no tienen ID. Ambos vectores tienen la misma longitud.

julia> ids = [204, missing, 210, 352, missing, 263]
julia> salaries = [23, 21, 47, 35, 17, 101] * 1000
julia> salaries_no_id(ids, salaries)
38,000
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Julia Exercism

¿Todo listo para empezar Etiquetas con nombres?

Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.