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

404 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 numpy as np
import xpress as xp
xp.controls.outputlog = 0
scenario = Scenario.objects.get(id=59)
# %%
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
drawpositions = range(1,10)
positions = range(8)
nOpponents = {}
nConflicts = {}
for t in teams:
for p in positions:
for d in drawpositions:
nOpponents[(t.id,p,d)] = []
nConflicts[(t.id,p,d)] = []
with open('draw_options_noHA_2country.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 = int(row[1])
drawpos = ((int(row[2])-1) % 9) + 1
pos = 0
for p in row[4].split(";"):
if p != "None":
nOpponents[(team,pos,drawpos)].append(int(p))
else:
nOpponents[(team,pos,drawpos)].append(0)
pos += 1
pos = 0
for p in row[5].split(";"):
if p != "None" and len(nOpponents[(team,pos,drawpos)]) > 0:
nConflicts[(team,pos,drawpos)].append(int(p))
else:
nConflicts[(team,pos,drawpos)].append(0)
pos += 1
for key in nOpponents.keys():
nOpponents[key] = round(np.mean(nOpponents[key]),2) if nOpponents[key] else "---"
for key in nConflicts.keys():
if nOpponents[key] == "---":
nConflicts[key] = "---"
else:
nConflicts[key] = round(np.mean(nConflicts[key])*100) if nConflicts[key] else 0
# %%
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;\
}\
\
#header2 td:nth-child(19),#header th:nth-child(18) { border-right: 5px solid black; }\
#header2 td:nth-child(37),#header th:nth-child(36) { border-right: 5px solid black; }\
#header2 td:nth-child(55),#header th:nth-child(54) { border-right: 5px solid black; }\
#header3 th:nth-child(11) { border-right: 5px solid black; }\
#header3 th:nth-child(20) { border-right: 5px solid black; }\
#header3 th:nth-child(29) { border-right: 5px solid black; }\
#body1 td:nth-child(20) { border-right: 5px solid black; }\
#body1 td:nth-child(38) { border-right: 5px solid black; }\
#body1 td:nth-child(56) { border-right: 5px solid black; }\
#body2 td:nth-child(19) { border-right: 5px solid black; }\
#body2 td:nth-child(37) { border-right: 5px solid black; }\
#body2 td:nth-child(55) { border-right: 5px solid black; }\
tr:nth-child(9) { border-bottom: 5px solid black; }\
tr:nth-child(19) { border-bottom: 5px solid black; }\
tr:nth-child(29) { border-bottom: 5px solid black; }\
</style> \
"
sol += "<h1>Number of draw options</h1>"
sol += "<table id='etable' style='border:1px solid black'>\n"
sol += "<thead>\n"
sol += "<tr id='header'>"
sol += f"<th colspan='2'>n = {simulations}</th>\n"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot A</th>"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot B</th>"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot C</th>"
sol += "<th colspan=18>Pot D</th>"
sol += "</tr>"
sol += "<tr id='header3'>\n"
sol += f"<th rowspan='2'>Pot</th><th rowspan='2'>#</th>\n"
# for o in order:
for t in teams:
sol += f"<th colspan='2'>{t.shortname}</th>\n"
sol += "</tr>\n"
sol += "<tr id='header'>\n"
for t in teams:
sol += f"<th>H</th>\n"
sol += f"<th>A</th>\n"
sol += "</tr>\n"
sol += "</thead>\n"
sol += "<tbody>\n"
# for o1 in order:
potMap = {
0: 'A',
2: 'B',
4: 'C',
6: 'D'
}
for pot in [0,2,4,6]:
sol += "<tr id='body1'>\n"
sol += f"<td rowspan='9'><b>{potMap[pot]}</b></td>"
for drawpos in drawpositions:
# t1 = getTeamByName[o1]
sol += f"<td>{drawpos}</b></td>"
# for o2 in order:
for t in teams:
for r in range(2):
color = 'white'
sol += f"<td style='background-color:{color}'>{nOpponents[(t.id,pot+r,drawpos)]}</td>"
# 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 += "<tr id='body2'>\n"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
sol += "<br>\n"
sol += "<br>\n"
sol += "<br>\n"
sol += "<h1>Probability of combinatorial clashes</h1>"
sol += "<table id='etable' style='border:1px solid black'>\n"
sol += "<thead>\n"
sol += "<tr id='header'>"
sol += f"<th colspan='2'>n = {simulations}</th>\n"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot A</th>"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot B</th>"
sol += "<th colspan=18 style='border-right: 5px solid black;'>Pot C</th>"
sol += "<th colspan=18>Pot D</th>"
sol += "</tr>"
sol += "<tr id='header3'>\n"
sol += f"<th rowspan='2'>Pot</th><th rowspan='2'>#</th>\n"
# for o in order:
for t in teams:
sol += f"<th colspan='2'>{t.shortname}</th>\n"
sol += "</tr>\n"
sol += "<tr id='header'>\n"
for t in teams:
sol += f"<th>H</th>\n"
sol += f"<th>A</th>\n"
sol += "</tr>\n"
sol += "</thead>\n"
sol += "<tbody>\n"
# for o1 in order:
potMap = {
0: 'A',
2: 'B',
4: 'C',
6: 'D'
}
for pot in [0,2,4,6]:
sol += "<tr id='body1'>\n"
sol += f"<td rowspan='9'><b>{potMap[pot]}</b></td>"
for drawpos in drawpositions:
# t1 = getTeamByName[o1]
sol += f"<td>{drawpos}</b></td>"
# for o2 in order:
for t in teams:
for r in range(2):
color = 'white'
if nConflicts[(t.id,pot+r,drawpos)] != "---":
sol += f"<td style='background-color:{color}'>{nConflicts[(t.id,pot+r,drawpos)]}%</td>"
else:
sol += f"<td style='background-color:{color}'>{nConflicts[(t.id,pot+r,drawpos)]}</td>"
# 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 += "<tr id='body2'>\n"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
with open(f'opponents_noHA_2country.html', 'w') as f:
f.write(sol)
# %%