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
- Agrupa los Pokémon por Type 1 y calcula el promedio de HP, Attack, Defense, Speed.
- Guarda ese resultado en promedio.
- Define la variable respuesta_ataque con el tipo de Pokémon que tiene mayor promedio de ataque.
- Define la variable respuesta_defensa con el tipo de Pokémon que tiene menor promedio de defensa.
- Muestra el resultado.
require Explorer.DataFrame, as: DF
alias Explorer.Series
file = Path.expand("../files/pokemon.csv", __DIR__) # "pokemon.csv"
df = file
# |> Kino.FS.file_path()
|> DF.from_csv!()
Promedio por tipo:
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"))
)
Tipo con mayor ataque promedio:
respuesta_ataque =
promedio
|> DF.sort_by(desc: col("Attack"))
|> DF.pull("Type 1")
|> Series.first()
Tipo con menor defensa promedio:
respuesta_defensa =
promedio
|> DF.sort_by(asc: col("Defense"))
|> DF.pull("Type 1")
|> Series.first()
Verifica tu respuesta
Room.verify(respuesta_ataque, respuesta_defensa)