Powered by AppSignal & Oban Pro

Habitación 3: Estadísticas de Combate

oaks_lab/04.livemd

Habitación 3: Estadísticas de Combate

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

defmodule Room do
  require Explorer.DataFrame, as: DF

  def verify(attack, defense) do
    if attack == "Dragon" and defense == "Normal" do
        Helpers.Messages.correct(
          "05.livemd",
          "Has identificado correctamente las fortalezas y debilidades."
        )
    else
        Helpers.Messages.error(
          "Revisa bien los datos... ¿Estás seguro de haber calculado los promedios correctamente?"
        )
    end
    |> Kino.Markdown.new()
  end
end

Contexto

En esta sala aparece una gran pantalla que dice:

> Cada tipo de Pokémon tiene fortalezas y debilidades. Solo si logras descubrir qué tipo tiene mayor ataque promedio y cuál tiene menor defensa promedio… podrás seguir avanzando.

Con group_by(), summarise() y mean() podemos agrupar y calcular promedios de estadísticas.

Por ejemplo:

promedio =
  df
  |> DF.group_by("Type 1")
  |> DF.summarise(
    Attack: mean(col("Attack")),
    Defense: mean(col("Defense")),
    HP: mean(col("HP")),
    Speed: mean(col("Speed"))
  )

Luego puedes usar:

  • DF.sort_by(desc: col()) → Para saber qué tipo tiene el mayor promedio en una columna.
  • DF.sort_by(asc: col()) → Para saber qué tipo tiene el menor promedio en una columna.

Por ejemplo:

tipo_mas_ataque = promedio
  |> DF.sort_by(desc: col("Attack"))
  |> DF.pull("Type 1")
  |> Series.first()

tipo_menos_defensa = promedio
  |> DF.sort_by(asc: col("Defense"))
  |> DF.pull("Type 1")
  |> Series.first()

Desafío de la habitación

  1. Agrupa los Pokémon por Type 1 y calcula el promedio de HP, Attack, Defense, Speed.
  2. Guarda ese resultado en promedio.
  3. Define la variable respuesta_ataque con el tipo de Pokémon que tiene mayor promedio de ataque.
  4. Define la variable respuesta_defensa con el tipo de Pokémon que tiene menor promedio de defensa.
  5. Muestra el resultado.
require Explorer.DataFrame, as: DF
alias Explorer.Series

file = "pokemon.csv"

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

Promedio por tipo:

promedio = ?

Tipo con mayor ataque promedio:

respuesta_ataque = ?

Tipo con menor defensa promedio:

respuesta_defensa = ?

Verifica tu respuesta

Room.verify(respuesta_ataque, respuesta_defensa)