Ranking Dos Times - Ranking dos times com mais decisões alteradas pelo VAR no Brasileirão ...
Ranking dos times com mais decisões alteradas pelo VAR no Brasileirão ...

Como criar um ranking funcional de times sem complicar

Pessoal, eu estava precisando montar um ranking de times para um projeto interno e acabei gastando mais tempo do que deveria com detalhes bobos. Achei que postava algo prático aqui.

Conceito básico de ranking dos times

A base é simples: cada time acumula pontos conforme os resultados. Vitória dá 3, empate 1, derrota 0. Isso todo mundo sabe. O problema é que o ranking que parece bom no papel geralmente quebra na prática por causa de critérios de desempate mal definidos. No Brasil, o padrão da CBF usa: pontos, vitórias, saldo de gols, gols pró, confrontos diretos e, se persistir, sorteio. Mas se você for construir isso do zero, o caminho mais limpo é usar uma estrutura de dados que aceite extensão fácil. Recomendo começar com um dicionário ou objeto onde cada chave é o nome do time e os valores incluem pontos, jogos, vitórias, empates, derrotas, gols pró, gols contra e saldo.

Passo a passo prático

Primeiro, defina a fonte dos dados. Pode ser uma planilha, uma API ou scrape de site. Eu usei a API da CBF para o Brasileirão, mas eles mudam o endpoint sem aviso e quebra tudo. Se o dado não for confiável, o ranking não é confiável também. Depois, monte o loop de processamento. Para cada jogo, atualize as estatísticas dos dois times envolvidos. Aqui vai um exemplo mínimo em Python:

time_a = {'pontos': 0, 'vitorias': 0, 'gols_pro': 0, 'golscontra': 0}
time_b = {'pontos': 0, 'vitorias': 0, 'gols_pro': 0, 'golscontra': 0} if placar_a > placar_b:
  time_a['pontos'] += 3
  time_a['vitorias'] += 1
elif placar_a == placar_b:
  time_a['pontos'] += 1
  time_b['pontos'] += 1

Atualize gols_pró e gols_contra também, senão o saldo fica errado e o desempate falha.

O erro que eu cometi e como corrigi

Eu deixei de considerar jogos de categorias de base e times B quando o rankung era para um torneio específico. Resultado: o Fluminense B jogava pela Série B e aparecia na tabela do principal, distorcendo o ranking dos times. A solução foi filtrar por competição antes de processar, usando o ID do torneio ao invés de confiar só no nome do clube.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Critérios de ordenação que funcionam

A ordenação final deve seguir uma chave composta. Em SQL seria algo como ORDER BY pontos DESC, vitórias DESC, saldo_gols DESC, gols_pro DESC. Em Python, usa-se o parâmetro key do sort com uma tupla: times_ordenados = sorted(times.items(), key=lambda x: (-x[1]['pontos'], -x[1]['vitorias'], -x[1]['saldo_gols'], -x[1]['gols_pro']))

Nota o sinal de menos na frente. Isso evita ter que inverter a lista depois com reverse=True, o que gera confusão visual quando você revisa o código semanas depois.

Dica técnica sobre ranking dos times em ligas com rodízio

Se o campeonato tem turnos separados (como o Paulista ou Baiano), o ranking geral pode mascarar desempenho real. Um time pode terminar em segundo no turno mas ser o pior do returno. A solução é manter rankings paralelos por turno e um ranking consolidado apenas para classificação final. Não tente colocar tudo numa tabela só sem deixar claro o que cada coluna significa.

Limitações que ninguém comenta

Ranking baseado apenas em pontos é cego para contexto. Um time que venceu 10-0 pode ter o mesmo número de pontos que um que venceu 1-0, mas a diferença em confiança e força de jogo é enorme. Esse é um viés que existe em qualquer sistema desse tipo. A única forma de mitigar é adicionar um fator de força do adversário, mas isso complica muito a implementação e exige dados históricos de qualidade. Outro problema real: empates repetidos nos critérios de desempate são frequentes em campeonatos pequenos. Quando dois times ficam idênticos em todos os critérios objetivos, a solução oficial é o sorteio. Isso pode gerar discussões acaloradas em fóruns, então seja transparente sobre isso desde o início.

Ferramentas úteis

Para quem quer algo pronto, há bibliotecas como pandas para manipulação de dados e datasets abertos da CBF. O problema é que os datasets às vezes vêm com campos faltando, especialmente em temporadas mais antigas. Sempre valide a completude dos dados antes de rodar o ranking. Se o objetivo é apenas consultar um ranking já feito, sites como o StatsBomb e o SofaScore oferecem tabelas atualizadas automaticamente. O detalhe é que eles às vezes usam critérios diferentes dos oficiais, então conferir com a fonte primária é recomendável.

Agora, se quiser o código completo do ranking dos times que eu construí, ele está disponível num repositório público no GitHub. O link é direto e não precisa de cadastro. Tem um README com instruções de instalação, os arquivos de dados usados e exemplos de execução. O código está em Python 3.10+, então verifique a versão antes de rodar.