research/uefa/cycle24/simulations/mixed_draws/probabilities_october.py
2024-01-31 15:37:32 +01:00

317 lines
8.0 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
scenario = Scenario.objects.get(id=34)
# %%
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
}
random_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_undirected = 0
simulations_directed = 0
maxVal = 1
minVal = 99999999
maxCVal = 1
minCVal = 9999999
maxRVal = 1
minRVal = 9999999
maxCRVal = 1
minCRVal = 9999999
old_c = "START"
for i in range(16):
with open(f'thread_{i}_pot_by_pot.csv', newline='') as csvfile:
# with open('verteilung_random.csv', newline='') as csvfile:
reader = csv.reader(csvfile)
next(reader, None)
for row in reader:
if int(row[0]) != old_c:
old_c = int(row[0])
simulations_undirected +=1
team = getTeamByID[int(row[1])]
Aopps = [getTeamByID[int(t)] for t in row[2].split(";")][:2]
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[2].split(";")][2:4]
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[2].split(";")][4:6]
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[2].split(";")][6:]
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]
diff = {}
mindval = 999999
maxdval = 0
# simulations_undirected = 1
simulations_directed = 1
for key in random_stats.keys():
diff[key] = stats[key]/simulations_undirected - 2*random_stats[key]/simulations_directed
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
for key, val in random_stats.items():
if val > 0 and val < minRVal:
minRVal = val
for key, val in played_countries.items():
if val > 0 and val < minCVal:
minCVal = val
for key, val in random_played_countries.items():
if val > 0 and val < minCRVal:
minCRVal = 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 = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
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 += "</head><body>"
sol += "<h2>Probabilities of games - drawn simultaneously</h2>"
sol += "<table id='etable' style='border:5px solid black'>\n"
sol += "<thead>\n"
sol += "<tr>"
sol += f"<th>{simulations_undirected}</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></th>\n"
# for o in order:
for t in teams:
# t = getTeamByName[o]
sol += f"<th>({t.country}) {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.country}) {t1.shortname}</td>"
# for o2 in order:
for t2 in teams:
# t2 = getTeamByName[o2]
color = heatmap_color_for((stats[t1,t2]-minVal)/((maxVal-minVal) or 1))
if stats[t1,t2] == 0:
color = 'grey'
val = f"{round((stats[t1,t2]/simulations_undirected)*100)}%"
# val = stats[t1,t2]
sol += f"<td style='background-color:{color}'>{val}</td>"
sol += "</tr>\n"
sol += "</tbody>\n"
sol += "</table>\n"
with open(f'probabilities_simultaneously.html', 'w') as f:
f.write(sol)
# %%