Nuevos sistemas de puntuación del Fútbol con python

Hace tiempo que me surge la duda de si el sistema de puntuación actual del fútbol en el que el que si ganas recibes 3 puntos, si empatas 1 y si pierdes 0 es el más adecuado.

Para comprobar como podría afectar un cambio en el sistema de puntuación sobre una liga ya jugada me he puesto manos a la obra y he realizado una pequeña aplicación en python.

Vamos a comparar 5 sistemas de puntuación para ver cómo afectarían a la clasificación final.

Primer sistema (actual): 3 puntos al ganador, 0 puntos al perdedor, en caso de empate 1 para cada uno

Segundo sistema (nuevo): 3 puntos al ganador si gana por más de 1 gol de diferencia, 2 puntos al ganador si solo gana por 1 gol de diferencia, 0 puntos al perdedor, en caso de empate 1 para cada uno

Tercer sistema (antiguo): 2 puntos al ganador, 0 puntos al perdedor, en caso de empate 1 para cada uno

Cuarto sistema (experimental): 4 puntos al ganador si gana por más de 2 goles de diferencia, 3 puntos al ganador si gana por 2 goles de diferencia, 2 puntos al ganador si solo gana por 1 gol de diferencia, 0 puntos al perdedor, en caso de empate 1 para cada uno

Quinto sistema (revolucionario): 2 puntos al ganador, -1 punto al perdedor, en caso de empate 1 para cada uno

Para realizar la tarea, lo primero que necesitamos son los datos en algún formato procesable mediante programación. Después de buscar en internet, he dado con una web que permite la descarga de los resultados en formato json para diferentes temporadas e incluso ligas. Todos ellos respetando el mismo formato, de modo que podemos utilizar la misma aplicación para otras temporadas y ligas. Después he desarrollado la aplicación que además de presentar los resultados en pantalla, genera un fichero csv con ellos para tratar los datos de forma más cómoda.

import json
import operator
import csv

data = {}
modos = ['actual', 'nuevo', 'antiguo', 'experimental', 'revolucionario']

with open('2016_2017.json') as json_file:
    try:
        futbolBD = json.load(json_file)
        jornadas = futbolBD['rounds']
        for jornada in jornadas:
            partidos = jornada['matches']
            for partido in partidos:
                equipo1 = partido['team1']['key']
                equipo2 = partido['team2']['key']
                goles1 = partido['score1']
                goles2 = partido['score2']
                puntos1, puntos2 = 0, 0

                for modo in modos:
                    dif = goles1 - goles2
                    if modo == "actual":
                        if dif > 0:
                            puntos1 = 3
                            puntos2 = 0
                        if dif < 0:
                            puntos1 = 0
                            puntos2 = 3
                        if dif == 0:
                            puntos1 = 1
                            puntos2 = 1
                    elif modo == "nuevo":
                        if dif == 1:
                            puntos1 = 2
                            puntos2 = 0
                        if dif == -1:
                            puntos1 = 0
                            puntos2 = 2
                        if dif >= 2:
                            puntos1 = 3
                            puntos2 = 0
                        if dif <= -2:
                            puntos1 = 0
                            puntos2 = 3
                        if dif == 0:
                            puntos1 = 1
                            puntos2 = 1
                    elif modo == "antiguo":
                        if dif > 0:
                            puntos1 = 2
                            puntos2 = 0
                        if dif < 0:
                            puntos1 = 0
                            puntos2 = 2
                        if dif == 0:
                            puntos1 = 1
                            puntos2 = 1
                    elif modo == "experimental":
                        if dif == 1:
                            puntos1 = 2
                            puntos2 = 0
                        if dif == -1:
                            puntos1 = 0
                            puntos2 = 2
                        if dif == 2:
                            puntos1 = 3
                            puntos2 = 0
                        if dif == -2:
                            puntos1 = 0
                            puntos2 = 3
                        if dif > 2:
                            puntos1 = 4
                            puntos2 = 0
                        if dif < -2:
                            puntos1 = 0
                            puntos2 = 4
                        if dif == 0:
                            puntos1 = 1
                            puntos2 = 1
                    elif modo == "revolucionario":
                        if dif > 0:
                            puntos1 = 2
                            puntos2 = -1
                        if dif < 0:
                            puntos1 = -1
                            puntos2 = 2
                        if dif == 0:
                            puntos1 = 1
                            puntos2 = 1
                    else:
                        print("modo no valido")

                    existeEquipo1 = data.get(equipo1, None)
                    if existeEquipo1 is None:
                        data[equipo1] = {}

                    if modo in data[equipo1].keys():
                        anterior = data[equipo1][modo]
                        data[equipo1][modo] = anterior + puntos1
                    else:
                        data[equipo1][modo] = puntos1

                    existeEquipo2 = data.get(equipo2, None)
                    if existeEquipo2 is None:
                        data[equipo2] = {}

                    if modo in data[equipo2].keys():
                        anterior = data[equipo2][modo]
                        data[equipo2][modo] = anterior + puntos2
                    else:
                        data[equipo2][modo] = puntos2

    except ValueError:
        print("error")

# CSV FILE
csv_file = "futbol.csv"
csv_columns = ['Nombre','Puntos ACT','Puntos NUE','Puntos ANT','Puntos EXP','Puntos REV']
try:
    with open(csv_file, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for item in data.keys():
            row = {'Nombre': item, 'Puntos ACT': data[item]['actual'], 'Puntos NUE': data[item]['nuevo'],
                   'Puntos ANT': data[item]['antiguo'], 'Puntos EXP': data[item]['experimental'],
                   'Puntos REV': data[item]['revolucionario']}
            writer.writerow(row)
except IOError:
    print("I/O error")

# CLASIFICACION
dataActual, dataNuevo, dataAntiguo, dataExperimental, dataRevolucionario = {}, {}, {}, {}, {}

for item in data:
    equipo = data[item]
    dataActual[item] = equipo['actual']
    dataNuevo[item] = equipo['nuevo']
    dataAntiguo[item] = equipo['antiguo']
    dataExperimental[item] = equipo['experimental']
    dataRevolucionario[item] = equipo['revolucionario']

print("Modo ACT " + str(sorted(dataActual.items(), key=operator.itemgetter(1), reverse=True)))
print("Modo NUE " + str(sorted(dataNuevo.items(), key=operator.itemgetter(1), reverse=True)))
print("Modo ANT " + str(sorted(dataAntiguo.items(), key=operator.itemgetter(1), reverse=True)))
print("Modo EXP " + str(sorted(dataExperimental.items(), key=operator.itemgetter(1), reverse=True)))
print("Modo REV " + str(sorted(dataRevolucionario.items(), key=operator.itemgetter(1), reverse=True)))

Los resultados son curiosos, básicamente, da casi igual el sistema de puntuación utilizado, la clasificación varía muy poco, aunque evidentemente, si los equipos son conscientes del tipo de puntuación utilizado, también cambian sus estrategias para obtener el mayor número de puntos.

Solo el Barcelona estaría interesado en el sistema de puntuación “Experimental” donde se recompensa el marcar muchos goles por partido.