research/uefa/cycle24/draw24/archive/drawsimulation_auswertung.py
2024-01-31 17:12:11 +01:00

401 lines
10 KiB
Python
Executable File

# %%
PROJECT_PATH = '/home/md/Work/ligalytics/leagues_stable/'
import os, sys
sys.path.insert(0, PROJECT_PATH)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "leagues.settings")
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
import random
import time
# XPRESS ENVIRONMENT
os.environ['XPRESSDIR'] = "/opt/xpressmp_8.4"
os.environ['XPRESS'] = "/opt/xpressmp_8.4/bin"
os.environ['LD_LIBRARY_PATH'] = os.environ['XPRESSDIR']+"/lib:"+os.environ['LD_LIBRARY_PATH']
os.environ['DYLD_LIBRARY_PATH'] = os.environ['XPRESSDIR']+"/lib:"
os.environ['SHLIB_PATH'] = os.environ['XPRESSDIR']+"/lib:"
os.environ['LIBPATH'] = os.environ['XPRESSDIR']+"/lib:"
# os.environ['PYTHONPATH'] =os.environ['XPRESSDIR']+"/lib:"+os.environ['PYTHONPATH']
os.environ['PYTHONPATH'] =os.environ['XPRESSDIR']+"/lib:"
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprs.jar:"
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprb.jar:"+os.environ['CLASSPATH']
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprm.jar:"+os.environ['CLASSPATH']
os.environ['PATH'] =os.environ['XPRESSDIR']+"/bin:"+os.environ['PATH']
from leagues import settings
settings.DATABASES['default']['NAME'] = PROJECT_PATH+'/db.sqlite3'
import django
django.setup()
from scheduler.models import *
from pulp import *
import csv
import xpress as xp
xp.controls.outputlog = 0
scenario = Scenario.objects.get(id=32)
# %%
order = {}
order['FC Bayern München'] = 1
order['Manchester City FC'] = 2
order['Liverpool FC'] = 3
order['Real Madrid CF'] = 4
order['Chelsea FC'] = 5
order['FC Barcelona'] = 6
order['Paris Saint-Germain'] = 7
order['Juventus'] = 8
order['Club Atlético de Madrid'] = 9
order['Sevilla FC'] = 10
order['RB Leipzig'] = 11
order['Tottenham Hotspur'] = 12
order['AFC Ajax'] = 13
order['FC Porto'] = 14
order['Arsenal FC'] = 15
order['Borussia Dortmund'] = 16
order['FC Salzburg'] = 17
order['FC Shakhtar Donetsk'] = 18
order['FC Internazionale Milano'] = 19
order['SSC Napoli'] = 20
order['Eintracht Frankfurt'] = 21
order['SL Benfica'] = 22
order['Sporting Clube de Portugal'] = 23
order['Bayer 04 Leverkusen'] = 24
order['Rangers FC'] = 25
order['GNK Dinamo'] = 26
order['FK Crvena zvezda'] = 27
order['Olympique de Marseille'] = 28
order['F.C. Copenhagen'] = 29
order['Club Brugge'] = 30
order['AC Milan'] = 31
order['PSV Eindhoven'] = 32
order['Celtic FC'] = 33
order['FC Viktoria Plzeň'] = 34
order['AS Monaco'] = 35
order['Maccabi Haifa FC'] = 36
# %%
teams = Team.objects.filter(season=scenario.season,active=True).order_by('pot','country')
countries = list(set(list(teams.values_list('country', flat=True))))
# print(countries)
# %%
getTeamByID = {
t.id:t for t in teams
}
getPotByID = {
t.id:t.pot for t in teams
}
getTeamByName = {
t.name:t for t in teams
}
getCountryByTeamID = {
t.id:t.country for t in teams
}
played_countries = {
(t1, c):0 for c in countries for t1 in teams
}
stats = {
(t1,t2):0 for t1 in teams for t2 in teams
}
random_stats = {
(t1,t2):0 for t1 in teams for t2 in teams
}
pots = {
t1:{
p:0 for p in range(1,5)
}
for t1 in teams
}
simulations = 0
maxVal = 1
minVal = 99999999
maxCVal = 1
minCVal = 9999999
with open('verteilung_draw2.csv', newline='') as csvfile:
# with open('verteilung_random.csv', newline='') as csvfile:
reader = csv.reader(csvfile)
next(reader, None)
for row in reader:
simulations = int(row[0])
team = getTeamByID[int(row[1])]
Aopps = [getTeamByID[int(t)] for t in row[2].split(";")]
for o in Aopps:
stats[team,o] += 1
pots[team][getPotByID[o.id]] += 1
played_countries[team,o.country] += 1
Bopps = [getTeamByID[int(t)] for t in row[3].split(";")]
for o in Bopps:
stats[team,o] += 1
pots[team][getPotByID[o.id]] += 1
played_countries[team,o.country] += 1
Copps = [getTeamByID[int(t)] for t in row[4].split(";")]
for o in Copps:
stats[team,o] += 1
pots[team][getPotByID[o.id]] += 1
played_countries[team,o.country] += 1
Dopps = [getTeamByID[int(t)] for t in row[5].split(";")]
for o in Dopps:
stats[team,o] += 1
pots[team][getPotByID[o.id]] += 1
played_countries[team,o.country] += 1
if stats[team,o] > maxVal:
maxVal = stats[team,o]
if played_countries[team,o.country] > maxCVal:
maxCVal = played_countries[team,o.country]
# with open('verteilung_draw.csv', newline='') as csvfile:
with open('verteilung_random.csv', newline='') as csvfile:
reader = csv.reader(csvfile)
next(reader, None)
for row in reader:
# simulations = int(row[0])
team = getTeamByID[int(row[1])]
Aopps = [getTeamByID[int(t)] for t in row[2].split(";")]
for o in Aopps:
random_stats[team,o] += 1
# pots[team][getPotByID[o.id]] += 1
# played_countries[team,o.country] += 1
Bopps = [getTeamByID[int(t)] for t in row[3].split(";")]
for o in Bopps:
random_stats[team,o] += 1
# pots[team][getPotByID[o.id]] += 1
# played_countries[team,o.country] += 1
Copps = [getTeamByID[int(t)] for t in row[4].split(";")]
for o in Copps:
random_stats[team,o] += 1
# pots[team][getPotByID[o.id]] += 1
# played_countries[team,o.country] += 1
Dopps = [getTeamByID[int(t)] for t in row[5].split(";")]
for o in Dopps:
random_stats[team,o] += 1
# pots[team][getPotByID[o.id]] += 1
# played_countries[team,o.country] += 1
diff = {}
mindval = 999999
maxdval = 0
for key in random_stats.keys():
diff[key] = stats[key]/simulations - random_stats[key]/simulations
if diff[key] > maxdval:
maxdval = diff[key]
if diff[key] > 0 and diff[key] < mindval:
mindval = diff[key]
for key, val in stats.items():
if val > 0 and val < minVal:
minVal = val
print(minVal)
for key, val in played_countries.items():
if val > 0 and val < minCVal:
minCVal = val
# for t in pots:
# print(t,pots[t])
def heatmap_color_for(value):
if value <= 0.5:
g = 256
r = 2 * max(0,value) * 256
if value > 0.5:
g = 2*(1-min(1,value))*256
r = 256
return f"rgb({r},{g},{0})"
sol = " \
<style> \
table, th, td { \
border: 1px solid black; \
border-collapse: collapse; \
text-align: center; \
min-width:40px; \
padding:3px; \
margin: 3px; \
font-family : Arial;\
} \
h1 {\
font-family : Arial;\
}\
\
#etable td:nth-child(10),#etable th:nth-child(10) { border-right: 5px solid black; }\
#etable td:nth-child(19),#etable th:nth-child(19) { border-right: 5px solid black; }\
#etable td:nth-child(28),#etable th:nth-child(28) { border-right: 5px solid black; }\
tr:nth-child(9) { border-bottom: 5px solid black; }\
tr:nth-child(18) { border-bottom: 5px solid black; }\
tr:nth-child(27) { border-bottom: 5px solid black; }\
</style> \
"
sol += "<h1>Probabilities of games</h1>"
sol += "<table id='etable' style='border:1px solid black'>\n"
sol += "<thead>\n"
sol += "<tr>"
sol += "<th></th>"
sol += "<th colspan=9 style='border-right: 5px solid black;'>Pot A</th>"
sol += "<th colspan=9 style='border-right: 5px solid black;'>Pot B</th>"
sol += "<th colspan=9 style='border-right: 5px solid black;'>Pot C</th>"
sol += "<th colspan=9>Pot D</th>"
sol += "</tr>"
sol += "<tr>\n"
sol += f"<th>n = {simulations+1}</th>\n"
# for o in order:
for t in teams:
# t = getTeamByName[o]
sol += f"<th>{t.shortname}</th>\n"
sol += "</tr>\n"
sol += "</thead>\n"
sol += "<tbody>\n"
# for o1 in order:
for t1 in teams:
# t1 = getTeamByName[o1]
sol += "<tr>\n"
sol += f"<td>{t1.shortname}</td>"
# for o2 in order:
for t2 in teams:
# t2 = getTeamByName[o2]
color = heatmap_color_for((stats[t1,t2]-minVal)/(maxVal-minVal))
if stats[t1,t2] == 0:
color = 'grey'
val = f"{round(round(stats[t1,t2]/simulations,2)*100)}%"
# val = stats[t1,t2]
sol += f"<td style='background-color:{color}'>{val}</td>"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
sol += "<br>"
sol += "<br>"
sol += "<br>"
sol += "<h1>Average number of Games against other countries</h1>"
sol += "<table style='border:1px solid black'>\n"
sol += "<thead>\n"
sol += "<tr>"
sol += "<tr>\n"
sol += f"<th>n = {simulations+1}</th>\n"
for c in countries:
sol += f"<th>{c}</th>\n"
sol += "</tr>\n"
sol += "</thead>\n"
sol += "<tbody>\n"
# for o1 in order:
for t1 in teams:
# t1 = getTeamByName[o1]
sol += "<tr>\n"
sol += f"<td>{t1.shortname}</td>"
for c in countries:
# color = heatmap_color_for((played_countries[t1,c]-minCVal)/(maxCVal-minCVal))
color = 'lightsteelblue'
if played_countries[t1,c] == 0:
color = 'grey'
# val = f"{round(round(played_played_countries[t1][c]/simulations,2)*100)}%"
val = f"{round(played_countries[t1,c]/(simulations+1),2)}"
# val = stats[t1,t2]
sol += f"<td style='background-color:{color}'>{val}</td>"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
sol += "<br>"
sol += "<br>"
sol += "<br>"
sol += "<h1>Draw procedure compared to evenly distributed encounters</h1>"
sol += "<table style='border:1px solid black'>\n"
sol += "<thead>\n"
sol += "<tr>\n"
sol += f"<th>n = {simulations+1}</th>\n"
# for o in order:
for t in teams:
# t = getTeamByName[o]
sol += f"<th>{t.shortname}</th>\n"
sol += "</tr>\n"
sol += "</thead>\n"
sol += "<tbody>\n"
# for o1 in order:
for t1 in teams:
# t1 = getTeamByName[o1]
sol += "<tr>\n"
sol += f"<td>{t1.shortname}</td>"
# for o2 in order:
for t2 in teams:
# t2 = getTeamByName[o2]
color = heatmap_color_for((abs(diff[t1,t2])-mindval)/(maxdval-mindval))
if stats[t1,t2] == 0:
color = 'grey'
val = f"{diff[t1,t2]}%"
# val = stats[t1,t2]
sol += f"<td style='background-color:{color}'>{round(round(diff[t1,t2],2)*100)}%</td>"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
with open(f'stats.html', 'w') as f:
f.write(sol)
# %%