Ejercicio: Preparación de los datos mediante la adición de calificadores de fila
El DataFrame de pandas player_df_final
contiene datos de 40 jugadores. Las 26 primeras filas representan a jugadores humanos y las últimas 17, al equipo de los Looney. Vamos a compilar una aplicación que ayude al entrenador a decidir qué jugador debe tomarse un descanso para beber durante el partido, pero sin que se agoten los demás jugadores. En este módulo, nos centraremos exclusivamente en el equipo de los Looney. Por lo tanto, nos fijaremos en las 16 últimas filas de datos.
Antes de empezar a compilar la aplicación, debemos asegurarnos de que los datos se encuentren en un estado que esté preparado para que la aplicación los ingiera.
Comencemos por crear un DataFrame que represente solo a los jugadores del equipo de los Looney. Este código elige todas las filas, empezando por la fila 27 (índice 26, porque el DataFrame se basa en cero), y todas las columnas:
# Create a DataFrame of only Tune Squad players.
ts_df = player_df_final.iloc[26: , :]
ts_df
Este es el resultado:
ID | player | puntos | possessions | team_pace | GP | MPG | TS% | AST | TO | USG | ORR | DRR | REBR | PER | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
26 | 31 | tune_squad1 | 2049,0 | 1434,0 | 110,0 | 64,000000 | 38,800000 | 0,619 | 31.5 | 14.9 | 35,5 | 8.3 | 17.6 | 12.8 | 28,440000 |
27 | 32 | tune_squad2 | 1795,0 | 1481,8 | 112,1 | 62,000000 | 35,400000 | 0,608 | 31,9 | 14.5 | 32,0 | 6.5 | 22.5 | 12.9 | 23,340000 |
28 | 33 | tune_squad3 | 1805,0 | 1509,9 | 108,6 | 64,000000 | 35,400000 | 0,622 | 27,9 | 13.9 | 36,0 | 5.9 | 27,7 | 12,2 | 22,410000 |
29 | 34 | tune_squad4 | 1743,0 | 1422,4 | 112,9 | 64,000000 | 36,300000 | 0,619 | 30,9 | 15,6 | 34,5 | 5.9 | 18,9 | 14.8 | 29,858714 |
30 | 35 | tune_squad5 | 1963,0 | 1539,1 | 117,4 | 59,972222 | 35,272973 | 0,633 | 32,3 | 16,2 | 34,0 | 5.9 | 19,8 | 13.1 | 27,160000 |
31 | 36 | tune_squad6 | 2062,0 | 1505,7 | 111,5 | 59,972222 | 37,000000 | 0,620 | 29,8 | 15,6 | 36,2 | 4,9 | 23,9 | 14.7 | 27,860000 |
32 | 37 | tune_squad7 | 1845,0 | 1435,7 | 113,1 | 69,000000 | 36,900000 | 0,634 | 33,2 | 14,0 | 36,5 | 4,1 | 21,5 | 16.4 | 34,260000 |
33 | 38 | tune_squad8 | 1778,0 | 1526,4 | 109,3 | 66,000000 | 34,900000 | 0,612 | 30.6 | 15,9 | 35,9 | 5.5 | 18,8 | 13,7 | 28,650000 |
34 | 39 | tune_squad9 | 1901,0 | 1444,1 | 109,7 | 67,000000 | 36,500000 | 0,609 | 27,2 | 14.8 | 35,5 | 5.0 | 21,8 | 8,9 | 20,120000 |
35 | 41 | tune_squad11 | 2030,0 | 1431,0 | 112,3 | 68,000000 | 37,000000 | 0,618 | 32,5 | 15,3 | 34,5 | 5.7 | 15,7 | 13.2 | 30,070000 |
36 | 42 | tune_squad12 | 1631,0 | 1465,7 | 110,1 | 66,000000 | 37,500000 | 0,613 | 28,4 | 14.4 | 35,7 | 6.5 | 20,7 | 14,0 | 28,400000 |
37 | 43 | tune_squad13 | 1828,0 | 1507,2 | 112,7 | 64,000000 | 36,500000 | 0,618 | 31.3 | 14,0 | 34,9 | 5.9 | 21,3 | 14.5 | 29,102157 |
38 | 44 | tune_squad14 | 1821,0 | 1443,7 | 118,8 | 66,000000 | 36,600000 | 0,609 | 27,3 | 13.5 | 35,8 | 7.0 | 23.8 | 11.5 | 22,960000 |
39 | 45 | tune_squad16 | 1740,0 | 1443,9 | 114,1 | 68,000000 | 37,100000 | 0,611 | 26,6 | 15.2 | 29,3 | 8.3 | 17,7 | 11,1 | 21,220000 |
40 | 46 | tune_squad17 | 1993,0 | 1459,0 | 112,5 | 59,972222 | 36,900000 | 0,627 | 30,4 | 15.0 | 33,7 | 6.3 | 19,3 | 14,1 | 28,760000 |
Vamos a analizar estos datos un poco más. Algunos de los encabezados de columna son acrónimos. Veamos los nombres de columna desglosados:
- ID: identificador único para cada jugador del conjunto de datos
- player: identificador único creado para llevar un seguimiento de los jugadores del equipo de los Looney frente a los jugadores humanos
- points: número total de puntos obtenidos por un jugador en una temporada
- possessions: número total de posesiones de un jugador en una temporada
- team_pace: promedio de posesiones que un equipo usa por partido
- GP (Games played): partidos jugados por un jugador en una temporada
- MPG (Average minutes played): promedio de minutos jugados por un jugador por partido
- TS% (True shooting percentage): porcentaje de tiros real, es decir, el porcentaje de tiros del jugador, que tiene en cuenta los tiros libres y los triples
- AST (Assist ratio): relación de asistencias, es decir, el porcentaje de las posesiones de un jugador que acaban en una asistencia
- TO (Turnover ratio): relación de pérdidas de balón, es decir, el porcentaje de las posesiones de un jugador que acaban en una pérdida de balón
- USG (Usage rate): tasa de uso, es decir, el número de posesiones que un jugador usa en 40 minutos
- ORR (Offensive rebound rate): tasa de rebotes en ataque
- DRR (Defensive rebound rate): tasa de rebotes en defensa
- REBR (Rebound rate): tasa de rebotes, es decir, el porcentaje de tiros fallados que un jugador rebota
- PER (Player efficiency rating): clasificación de eficiencia del jugador, es decir, la medida de la productividad por minuto de un jugador en la cancha
Aunque muchos de estos puntos de datos tienen sentido en el contexto del baloncesto, podemos empezar a limpiar los datos incluso sin muchos conocimientos técnicos de cada una de estas columnas. Por eso, no debe preocuparse si no está familiarizado con estos términos Todavía nos queda mucho que hacer para obtener información sobre los datos.
Lo más importante que debe entender es que cada una de estas columnas son datos que se pueden contar durante un partido, excepto la clasificación de eficiencia del jugador (PER). PER es un cálculo que se basa en todas las demás estadísticas del jugador. PER determina lo bueno que es un jugador. Esta columna puede ayudar a predecir la eficacia de un jugador durante un partido. Cuando se escribió este módulo, el jugador de baloncesto con el valor de PER más alto era Michael Jordan, con una clasificación de 27,91. El jugador de baloncesto con la segunda clasificación más alta (y con la clasificación más alta de los jugadores de baloncesto activos actualmente) era LeBron James, con una puntuación de 27,49.
El cálculo del valor de PER no es perfecto, y algunos aficionados y científicos de datos podrían optar por evaluar los jugadores de otra manera. Aun así, en este módulo usaremos el valor de PER como la medida que ayudará al entrenador a decidir a qué jugador debe conceder una breve pausa para beber durante un partido.
Importación de datos del equipo de los Looney para combinarlos con los datos del jugador
Ahora, importará los nombres de los jugadores del equipo de los Looney para el partido. Pero antes de realizar el siguiente paso, abra el archivo tune_squad.csv en Visual Studio Code. Verá que el archivo está separado por tabulaciones, en lugar de por comas, por lo que debe establecer sep='\t'
en la llamada a pd.read_csv()
:
# Import Tune Squad player names.
ts_name_df = pd.read_csv('tune_squad.csv', sep='\t')
ts_name_df
ID player
0 31 Sylvester
1 32 Marvin the Martian
2 33 Road Runner
3 34 Foghorn Leghorn
4 35 Bugs Bunny
5 36 Elmer Fudd
6 37 Lola Bunny
7 38 Porky Pig
8 39 Tasmanian Devil
9 40 Yosemite Sam
10 41 Gossamer
11 42 Granny
12 43 Wile E. Coyote
13 44 Tweety
14 45 Penelope
15 46 Daffy Duck
El DataFrame ts_names_df
contiene el identificador del jugador, que coincide con el identificador del DataFrame principal, y el nombre real del jugador.
Combinación de DataFrames para calificar mejor los datos
Ahora tenemos dos DataFrames que contienen datos complementarios. Podemos combinar los DataFrames de la columna ID porque sabemos que estas columnas coinciden:
# Merge the two DataFrames.
ts_df = pd.merge(ts_df, ts_name_df, on='ID', how='left', suffixes=('_type', '_name'))
ts_df.head()
Este es el resultado:
ID | player_type | puntos | possessions | team_pace | GP | MPG | TS% | AST | TO | USG | ORR | DRR | REBR | PER | player_name | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 31 | tune_squad1 | 2049,0 | 1434,0 | 110,0 | 64,000000 | 38,800000 | 0,619 | 31.5 | 14.9 | 35,5 | 8.3 | 17.6 | 12.8 | 28,440000 | Silvestre |
1 | 32 | tune_squad2 | 1795,0 | 1481,8 | 112,1 | 62,000000 | 35,400000 | 0,608 | 31,9 | 14.5 | 32,0 | 6.5 | 22.5 | 12.9 | 23,340000 | Marvin |
2 | 33 | tune_squad3 | 1805,0 | 1509,9 | 108,6 | 64,000000 | 35,400000 | 0,622 | 27,9 | 13.9 | 36,0 | 5.9 | 27,7 | 12,2 | 22,410000 | Correcaminos |
3 | 34 | tune_squad4 | 1743,0 | 1422,4 | 112,9 | 64,000000 | 36,300000 | 0,619 | 30,9 | 15,6 | 34,5 | 5.9 | 18,9 | 14.8 | 29,858714 | Gallo Claudio |
4 | 35 | tune_squad5 | 1963,0 | 1539,1 | 117,4 | 59,972222 | 35,272973 | 0,633 | 32,3 | 16,2 | 34,0 | 5.9 | 19,8 | 13.1 | 27,160000 | Bugs Bunny |
Organización del DataFrame para mejorar la legibilidad
Aunque técnicamente no importa dónde se encuentra cada columna en un DataFrame, resulta más conveniente por cuestiones de legibilidad tener el nombre del jugador a la izquierda, cerca del identificador.
Para mover esa columna de modo que se encuentre al lado de la columna ID:
- Cree una lista de columnas.
- Quite la columna player_name de la lista (sabemos que está al final, por lo que podemos simplemente quitarla de la lista).
- Coloque player_name en la segunda posición de la lista de columnas. Para ello, reemplace la columna player_type.
- Establezca el DataFrame en la nueva disposición de las columnas.
# Rearrange the columns to put the ID and player_name columns next to each other.
column_list = list(ts_df)
player_name = column_list.pop()
column_list[1] = player_name
ts_df = ts_df[column_list]
ts_df.head()
Este es el resultado:
ID | player_name | puntos | possessions | team_pace | GP | MPG | TS% | AST | TO | USG | ORR | DRR | REBR | PER | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 31 | Silvestre | 2049,0 | 1434,0 | 110,0 | 64,000000 | 38,800000 | 0,619 | 31.5 | 14.9 | 35,5 | 8.3 | 17.6 | 12.8 | 28,440000 |
1 | 32 | Marvin | 1795,0 | 1481,8 | 112,1 | 62,000000 | 35,400000 | 0,608 | 31,9 | 14.5 | 32,0 | 6.5 | 22.5 | 12.9 | 23,340000 |
2 | 33 | Correcaminos | 1805,0 | 1509,9 | 108,6 | 64,000000 | 35,400000 | 0,622 | 27,9 | 13.9 | 36,0 | 5.9 | 27,7 | 12,2 | 22,410000 |
3 | 34 | Gallo Claudio | 1743,0 | 1422,4 | 112,9 | 64,000000 | 36,300000 | 0,619 | 30,9 | 15,6 | 34,5 | 5.9 | 18,9 | 14.8 | 29,858714 |
4 | 35 | Bugs Bunny | 1963,0 | 1539,1 | 117,4 | 59,972222 | 35,272973 | 0,633 | 32,3 | 16,2 | 34,0 | 5.9 | 19,8 | 13.1 | 27,160000 |
En el código para reorganizar las columnas, dado que la columna player_type no era necesaria ahora que tenemos los nombres reales de los jugadores, era más fácil reemplazarla por la columna player_name. No hizo falta quitar explícitamente la columna player_type.
© 2021 Warner Bros. Ent. Todos los derechos reservados