Ejercicio: Preparación de los datos mediante la adición de calificadores de fila

Completado

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:

  1. Cree una lista de columnas.
  2. Quite la columna player_name de la lista (sabemos que está al final, por lo que podemos simplemente quitarla de la lista).
  3. Coloque player_name en la segunda posición de la lista de columnas. Para ello, reemplace la columna player_type.
  4. 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