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.