Powered by AppSignal & Oban Pro

Habitación 2: Tipos de Pokémon

oaks_lab/solutions/03.livemd

Habitación 2: Tipos de Pokémon

Mix.install([
  {:explorer, "~> 0.11.1"},
  {:kino, "~> 0.19.0"},
  {:kino_explorer, "~> 0.1.25"},
  {:kino_vega_lite, "~> 0.1.13"},
  {:helpers, path: Path.expand("../helpers", __DIR__)}
])

defmodule Room do
  require Explorer.DataFrame, as: DF

  def verify(count) do
    case count == 18 do
      true -> Helpers.Messages.correct(
              "04.livemd",
              "Existen 18 tipos de Pokémon."
            )

          _ ->
            Helpers.Messages.error(
              "La puerta sigue cerrada... Revisa bien los datos y cuenta nuevamente los tipos de Pokémon."
            )
        end

    |> Kino.Markdown.new()
  end
end

Contexto

El sistema del laboratorio sigue bloqueado…

En la pantalla aparece un nuevo mensaje del Profesor Oak:

> “Un buen Científico de Datos debe ser capaz de responder preguntas simples con datos. > ¿Cuántos Pokémon de cada tipo existen?”

Para contar cuántos Pokémon hay por tipo puedes usar:

conteo =
  df
  |> DF.frequencies(["Type 1"])
  |> DF.sort_by(desc: counts)

Si se quiere contar la cantidad total de filas

conteo
|> DF.n_rows()

Para graficar los resultados se utiliza Vega-lite:

alias VegaLite, as: Vl

chart =
  Vl.new()
  |> Vl.data_from_values(conteo)
  |> Vl.mark(:bar)
  |> Vl.encode_field(:x, "Type 1", type: :nominal, title: "Tipo")
  |> Vl.encode_field(:y, "counts", type: :quantitative, title: "Cantidad")

Desafío de la habitación

  1. Crea la variable conteo que contenga la cantidad de Pokémon por Type 1.
  2. Genera un gráfico de barras con ese conteo.
  3. Verifica tu respuesta.
require Explorer.DataFrame, as: DF
alias VegaLite, as: Vl

file = Path.expand("../files/pokemon.csv", __DIR__) # "pokemon.csv"

df = file
  # |> Kino.FS.file_path()
  |> DF.from_csv!()

Contar los elementos

conteo =
  df
  |> DF.frequencies(["Type 1"])
  |> DF.sort_by(desc: counts)

Crear la gráfica

chart =
  Vl.new(title: "Cantidad de Pokémon por Tipo")
  |> Vl.data_from_values(conteo)
  |> Vl.mark(:bar)
  |> Vl.encode_field(:x, "Type 1", type: :nominal, title: "Tipo")
  |> Vl.encode_field(:y, "counts", type: :quantitative, title: "Cantidad")

Obtener la respuesta

respuesta =
    conteo
    |> DF.n_rows()

Verificar tu respuesta

Room.verify(respuesta)