Pandas Python para generar gráficos de Tiros de NBA

Desde que me encontré por primera vez con una visualización de carta de tiros de la NBA; mientras leía una pieza Kirk Goldsberry de CourtVision en Grantland.com; me han fascinado las visualizaciones de datos deportivos; y me intriga cómo pueden liderar para mejorar la toma de decisiones para equipos y jugadores.

Así que, cuando empece con data science supe que mi primer proyecto sería un intento de recrear la carta de tiros de un jugador de NBA.

Reuniendo los datos

Mi primer paso era reunir los datos de ubicación para cada toma. El análisis de los deportes ha progresado, casi todos los equipos tienen un departamento de análisis dedicado. Las ligas profesionales han seguido su ejemplo y reforzado sus departamentos de estadísticas.

La NBA brinda muchas estadísticas detalladas en su sitio web que reunidas usando cámaras Second Spectrum instaladas para rastrear el movimiento en tiempo real de los jugadores y la pelota. Ejemplos de datos recopilados de Second Spectrum incluyen velocidad, distancia recorrida, toques de pintura y más.

Desafortunadamente la NBA no permite el acceso a la API en su página de estadísticas, así que tuve que cavar más profundo para encontrar lo que estaba buscando: datos detallados de disparo para cada jugador.

En la página de detalles de cada jugador se puede ver:

En una variedad de trazados, y examinar la hoja de cálculo con los detalles básicos de cada toma. Con la ventaja adicional de ver un video de cada toma con un simple clic del botón de reproducción.

Página de detalles del disparo de Kristaps Porzingis –https://stats.nba.com/events/?flag=3&CFID=33&CFPARAMS=2017-18&PlayerID=204001&ContextMeasure=FGA&Season=2017-18&section=player&sct=hex [19659006]

A pesar de la abundancia de datos disponibles en la página web

Los datos no estaban en una estructura que me permitiera analizarlos adecuadamente, tampoco era accesible la totalidad de los datos que buscaba.

Sin embargo, utilizando las herramientas de desarrollo de Google Chrome; específicamente XHR (XMLHttpRequest), pude obtener un archivo json que se podía leer y transformar fácilmente usando Pandas Python.

Pestaña Chrome XHR y json resultante vinculado por url

Esto era la información exacta que estaba buscando, anhelaba una forma de recopilar datos para cualquier jugador, o un grupo de jugadores, sin tener que repetir estos tediosos pasos.

Después de notar que la cadena de url de 725 caracteres solo tenía un valor condicional, el player_id, que debía cambiarse para obtener los datos de disparo de otra persona. Escribí un script de Python para reunir los datos de cualquier jugador con su ID de nba.com .

Utilizando la biblioteca Python Requests, pude tomar los datos json sin tener que ir al sitio web.

Codigo para tomar datos de json de stats.nba.com y transformarlos en Pandas Python DataFrame

Limpiando los datos

Pandas Python en una increíble biblioteca que me permitió convertir el json en un DataFrame y limpiar los datos para mostrar valores y columnas que quería. Sin mucho esfuerzo, Pandas Python transforma la fea estructura json en un formato limpio y fácil de leer.

Pandas Python también proporciona algunas características interesantes; como el método .describe (), que automáticamente calcula y genera una muestra de datos estadísticos relevantes, como la media, la mediana y la desviación estándar para todas las columnas numéricas.

Esta única línea de código, como se ve a continuación, me dio información inmediata sobre las opciones de tiro del delantero estrella de los Knicks de Nueva York, Kristaps Porzingis.

Por ejemplo, la distancia promedio de tiro de Porzingis fue de 14.28 pies de distancia de la canasta, y su tiro típico fue ligeramente del lado izquierdo de la canasta.

Muestreo de datos del método Pandas Python DataFrame
.describe () para Kristaps Porzingis ‘DataFrame

Trazando las tomas

Teniendo los datos en el formato correcto, pude trazar cada toma usando Plotly, una biblioteca de gráficos y visualización.

En primer lugar, utilicé la plantilla de Savvas Tjortjoglou para dibujar un esquema de la corte con las dimensiones exactas.

A continuación, separé todas las tomas en dos categorías: marcas y errores, que luego podría trazar como diferentes colores.

Usando el módulo Plotly graph objects, pude trazar las marcas y errores como un diagrama de dispersión sobre el contorno, estableciendo los valores xey.

Para X_LOC y Y_LOC respectivamente, que representan las coordenadas para cada intento de disparo. [19659016] Código para crear un diagrama de dispersión para todos los disparos.

Luego tenía que ejecutar mi programa y como si fuera mágico cada toma se trazó como estaba diseñada.

Conclusión

Esto fue un proyecto paralelo extremadamente divertido y satisfactorio para mí. Combinó mi pasión por los deportes con habilidades que aprendí en un mes desde que comencé a programar.

En el futuro; quiero hacer los diagramas de disparo mas interactivos, y retocarlos para que sean visualmente atractivos y mejoren la legibilidad.

También reemplazar los puntos de datos de disparo individuales superpuestos con hexbins representando frecuencia y eficiencia para cada ubicación de disparo; o al agregar una comparación al promedio de la liga.

Dejá un comentario