Tutorial NBA_api: aprenda a calcular triple doubles

Raquel Reis
Mulheres em Dados
Published in
4 min readDec 2, 2023

Análise de dados tem impacto direto em vários setores da sociedade, e no esporte não é diferente. Nos últimos anos, a NBA tem investido muito em ser cada vez mais data driven. E realmente a inserção de times voltado para data analytics dentro da liga tem sido capaz de mudar o jogo (literalmente).

Mesmo você não tendo o luxo de ser uma analista de dados contratado pela maior liga de basquete do mundo, você pode fazer suas próprias análises de dados utilizando uma api gratuita com os dados da NBA. É o combo diversão + aprendizado.

Vamos para um tutorial mão na massa de como calcular uma das métricas mais famosas do basquete, o triple double (triplo-duplo na tradução para o português).

Mas primeiramente, o que é o triple double?

Um atleta faz um triplo-duplo quando termina o jogo com ao menos dez execuções em três das cinco principais estatísticas (pontos, assistências, rebotes, tocos e roubos de bola), ou seja, três fundamentos com dígitos duplos.

Ou seja, precisamos verificar as 5 principais estatísticas e checar se em pelo menos 3 delas o jogador conseguiu dígitos duplos (maior ou igual a 10).

Agora que você já entendeu como calcular, vamos ver como fazemos isso usando a nba_api. Queremos como resultado final descobrir a quantidade de triple-doubles de algum jogador durante uma temporada.

Obs: você já precisa ter seu ambiente python configurado na sua máquina para rodar esse tutorial. Ok?

Primeiro passo: instalar os pacotes necessários

Vamos instalar a nba_api e o nosso queridinho pandas.

pip3 install pandas nba_api

Segundo passo: selecionar o jogador que queremos puxar a estatística de triple doubles

Por ser gratuita, a nba_api tem limitações de requests. Por isso, vamos puxar o relatório de triple-doubles em uma temporada e de um jogador por vez.

O endpoint players.get_players() retorna um dicionário com os nomes e IDs de todos os jogadores da NBA. Ter o ID do jogador é importante para acessarmos os demais endpoints.

import pandas as pd
from nba_api.stats.static import players
from nba_api.stats.endpoints import playergamelog

#endpoint
player_dict = players.get_players()
#dataframe com IDs dos jogadores
players_df = pd.DataFrame(player_dict)
#obter o ID do jogador a partir do nome completo
player_id = players_df.loc[players_df['full_name'] == player_name, 'id'].item()

No trecho acima, para facilitar a manipulação, o dicionário foi transformado em um DataFrame.

Vamos obter o ID do jogador a partir do nome completo do mesmo. Uma observação importante é na coluna 'full_name', os nomes estão com a primeira maíuscula e as restantes minúsculas. Por exemplo: Stephen Curry, Nikola Jokic, etc.
A variável player_name precisa estar correta para ter um retorno válido do ID. Se necessário, acrescente o capitalize() para forçar esse formato.

Terceiro passo: obter as estatísticas do jogador selecionado no passo anterior

O endpoint playergamelog.PlayerGameLog() retorna as estatísticas principais de um jogador por temporada.

# criação de instância para o objeto PlayerGameLog
player_game_log = playergamelog.PlayerGameLog(
# id obtido anteriormente
player_id=player_id,
season=season,
season_type_all_star=season_type)
# dataframe com as estatísticas
games_data = player_game_log.get_data_frames()[0]

Verifique a documentação para preencher corretamente os parâmetros do endpoint.

Quarto passo: criar uma coluna booleana para assinalar cada vez que ocorreu um triple double

# lista com as 5 estatística principais
stats = ['REB', 'AST', 'STL', 'BLK', 'PTS']
# coluna booleana de triple double
games_data['TRIP_DOUB'] = (games_data[stats] >= 10).sum(1) == 3

No trecho de código acima, foi criada com uma lista com as 5 principais estatísticas. Pra quem ficou perdido, um lembrete abaixo destas estatísticas.

# REB = Rebounds (Rebotes)
# AST = Assistences (Assistências)
# STL = Steals (Roubos)
# BLK = Blocks (Bloqueios ou Tocos)
# PTS = Points (Pontos)

No dataframe games_data, temos todas as estatísticas do jogador na temporada em que cada linha é um jogo. A criação da coluna ['TRIP_DOUB'] é uma coluna booleana que vai calcular para cada jogo se teve ou não um triplo duplo (True se houve, False se não teve).

Quinto passo: criar um relatório simples das estatísticas do jogador na temporada

report = "-----------TRIPLE-DOUBLE REPORT " + player_name.upper() + "-----------\n\n"
report += "Total of Triple-Doubles: " + str(games_data['TRIP_DOUB'].sum()) + "\n"
report += "Total of games: " + str(len(games_data)) + "\n"
report += "Percentage of Triple-Doubles: " + str(round(games_data['TRIP_DOUB'].sum()*100 / len(games_data), 2)) + "%\n"
report += "Avg of Points: " + str(round(games_data['PTS'].mean(), 2)) + "\n"
report += "Avg of Rebounds: " + str(round(games_data['REB'].mean(), 2)) + "\n"
report += "Avg of Assists: " + str(round(games_data['AST'].mean(), 2)) + "\n"
report += "Avg of Steals: " + str(round(games_data['STL'].mean(), 2)) + "\n"
report += "Avg of Blocks: " + str(round(games_data['BLK'].mean(), 2)) + "\n"
print(report)

No trecho acima, tem uma sugestão de relatório para ser o output do seu código. Não limite sua criatividade e explore mais métricas.

Output do exemplo de código mostrado utilizando o jogador Nikola Jokic nas playoffs de 2022–23

Os números do Nikola Jokic são realmente impressionantes 👏

Gostou desse conteúdo? O código completo está nesse repositório: https://github.com/raquelcreis/triple-double-nba-api

Agora é sua vez de fazer uma jogada incrível! Te vejo em um próximo tutorial 👋

--

--