<jupyter_start><jupyter_text>Laboratorio 4<jupyter_code>import pandas as pd
from pathlib import Path<jupyter_output><empty_output><jupyter_text>Utilizarás el conjunto de datos de pokemon.<jupyter_code>pkm = (
    pd.read_csv(Path().resolve().parent / "data" / "pokemon.csv", index_col="#")
    .rename(columns=lambda x: x.replace(" ", "").replace(".", "_").lower())
)
pkm.head()<jupyter_output><empty_output><jupyter_text>Ejercicio 1(1 pto)Agrupar por `generation` y `legendary` y obtener por grupo:* Promedio de `hp`* Mínimo y máximo de `sp_atk` y `sp_def`<jupyter_code>(
    pkm.groupby(['generation','legendary'])
    .agg(hp_mean = ('hp','mean'),
         sp_atk_min=('sp_atk','min'), sp_atk_max=('sp_atk','max'),
         sp_def_min=('sp_def','min'), sp_def_max=('sp_def','max')
    )
)<jupyter_output><empty_output><jupyter_text>Ejercicio 2(1 pto)El profesor Oakgueda determinó que una buen indicador de pokemones es: $$ 0.2 \, \textrm{hp} + 0.4 \,(\textrm{attack} + \textrm{sp_atk})^2 + 0.3 \,( \textrm{defense} + \textrm{sp_deff})^{1.5} + 0.1 \, \textrm{speed}$$Según este indicador, ¿Qué grupo de pokemones (`type1`, `type2`) es en promedio mejor que el resto?<jupyter_code>oakgueda_ind = 0.2*pkm.loc[:,'hp'] + 0.4*(pkm.loc[:,'attack'] + pkm.loc[:,'sp_atk'])**2 + 0.3*(pkm.loc[:,'defense'] + pkm.loc[:,'sp_def'])**1.5 + 0.1*pkm.loc[:,'speed']
pkm_auxiliar = pkm.assign(indice= oakgueda_ind).groupby(['type1','type2']).agg(indice_mean=('indice','mean'))
pkm_auxiliar.head()
mejor_pkm = pkm_auxiliar[pkm_auxiliar == pkm_auxiliar.max()]
mejor_pkm = mejor_pkm.loc[lambda x: x.notnull().all(axis=1)].head()
for idx, row in mejor_pkm.iterrows():
    print(f"En promedio, los pokemones {idx[0]}-{idx[1]} son mejores según el indicador del profesor Oakgueda.")<jupyter_output>En promedio, los pokemones Ground-Fire son mejores según el indicador del profesor Oakgueda.<jupyter_text>__Respuesta__: En promedio, los pokemones Ground-Fire son mejores según el indicador del profesor Oakgueda.  Ejercicio 3(1 pto)Define una función que escale los datos tal que, si $s$ es una columna: $$s\_scaled = \frac{s - \min(s)}{\max(s) - \min(s)}$$Y luego transforma cada columna numérica agrupando por si el pokemon es legendario o no.<jupyter_code>def minmax_scale(s):
    return (s-s.min())/(s.max()-s.min())

pkm.assign(
    hp=lambda df: df.groupby("legendary")["hp"].transform(minmax_scale),
    attack=lambda df:  df.groupby("legendary")["attack"].transform(minmax_scale),
    defense=lambda df: df.groupby("legendary")["defense"].transform(minmax_scale),
    sp_atk=lambda df: df.groupby("legendary")["sp_atk"].transform(minmax_scale),
    sp_def=lambda df: df.groupby("legendary")["sp_def"].transform(minmax_scale),
    speed=lambda df: df.groupby("legendary")["speed"].transform(minmax_scale),
    generation=lambda df: df.groupby("legendary")["generation"].transform(minmax_scale)
)<jupyter_output><empty_output><jupyter_text>Ejercicio 4(1 pto)El profesor Oakgueda necesita saber cuántos pokemones hay luego de filtrar el dataset tal que el grupo de (`type1`, `type2`) tenga en promedio un indicador (el del ejercicio 2) mayor a 40000.<jupyter_code>contador= pkm_auxiliar[lambda x: x['indice_mean']>40000].count()[0]
print (f'Hay solo {contador} pokemones que cumplen esta condición.')<jupyter_output>Hay solo 2 pokemones que cumplen esta condición.
{'fraction_non_alphanumeric': 0.16940543770540784, 'fraction_numerical': 0.015835076187630713, 'mean_word_length': 6.294117647058823, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '528447', 'license': 'MIT', 'n_tokens_mistral': 1345, 'n_tokens_neox': 1301, 'n_words': 262, 'path': 'labs/lab04.ipynb', 'repo_name': 'Bacuna98/mat281_portfolio', 'size': '3347'}