# %%
# PROJECT_PATH = '/home/md/Work/ligalytics/leagues_stable/'
PROJECT_PATH = '/home/django/leagues/'
import os, sys
sys.path.insert(0, PROJECT_PATH)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "leagues.settings")
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
from leagues import settings
# settings.DATABASES['default']['NAME'] = PROJECT_PATH+'/db.sqlite3'
# settings.DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql'
# settings.DATABASES['default']['HOST'] = '0.0.0.0'
# settings.DATABASES['default']['PORT'] = '5432'
# settings.DATABASES['default']['USER'] = 'postgres'
# settings.DATABASES['default']['PASSWORD'] = 'secret123'
# settings.DATABASES['default']['NAME'] = 'mypgsqldb'
# settings.DATABASES['default']['ATOMIC_REQUESTS'] = False
# settings.DATABASES['default']['AUTOCOMMIT'] = True
# settings.DATABASES['default']['CONN_MAX_AGE'] = 0
# settings.DATABASES['default']['CONN_HEALTH_CHECKS'] = False
# settings.DATABASES['default']['OPTIONS'] = {}
settings.DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql'
settings.DATABASES['default']['HOST'] = '0.0.0.0'
settings.DATABASES['default']['PORT'] = '5433'
settings.DATABASES['default']['USER'] = 'leagues_user'
settings.DATABASES['default']['PASSWORD'] = 'ligalytics'
settings.DATABASES['default']['NAME'] = 'prod_16'
import django
django.setup()
from scheduler.models import *
import pulp
from pulp import lpSum, value, XPRESS, GUROBI, PULP_CBC_CMD
from django.db.models import Q
from django.template.loader import render_to_string
from qualifiers.models import *
from common.models import GlobalTeam, GlobalCountry
from common.functions import getRandomHexColor
from scheduler.models import Season, Scenario, Team, DayObj, CountryClash, Country
from qualifiers.draws import groupTeams, optimize_inversions4
from scheduler.solver.tasks.optimize import optimize
import random
import time
import json
import csv
import networkx as nx
import matplotlib.pyplot as plt
from datetime import timedelta
scenario = Scenario.objects.get(id=9541)
season = scenario.season
teams = Team.objects.filter(season=season,active=True).order_by('pot')
# %%
nSimulations = season.scenarios.count()
teams_in_group_together = {
(t1,t2):0 for t1 in teams for t2 in teams
}
violated_wishes = defaultdict(lambda:{'violations':0,'comments':defaultdict(lambda:0)})
violated_blockings = defaultdict(lambda:{'violations':0,'comments':defaultdict(lambda:0)})
elementary_violations = defaultdict(lambda:defaultdict(lambda:0))
for scenario in season.scenarios.all():
for conference in Conference.objects.filter(scenario=scenario,display_group=True).order_by('name'):
for t1 in conference.teams.all():
for t2 in conference.teams.all():
if t1 != t2:
teams_in_group_together[(t1,t2)] += 1
for wish in EncWish.objects.filter(scenario=scenario).exclude(violation="").order_by('prio'):
violated_wishes[f"{wish.reason}"]['violations'] += 1
violated_wishes[f"{wish.reason}"]['comments'][wish.violation.strip()] += 1
for wish in HAWish.objects.filter(scenario=scenario).exclude(violation="").order_by('prio'):
violated_wishes[f"{wish.reason}"]['violations'] += 1
violated_wishes[f"{wish.reason}"]['comments'][wish.violation.strip()] += 1
for wish in Pairing.objects.filter(scenario=scenario).exclude(violation="").order_by('prio'):
violated_wishes[f"{wish.comment}"]['violations'] += 1
violated_wishes[f"{wish.comment}"]['comments'][wish.violation.strip()] += 1
for game in scenario.solutionlist():
blockings = Blocking.objects.filter(scenario=scenario,day__id=game[0]).filter(Q(team=game[1],type="Home") | Q(team=game[1],type="Away"))
if blockings:
for b in blockings:
violated_blockings[b.team]['violations'] += 1
violated_blockings[b.team]['comments'][f"{b.type} - {b.day}"] += 1
violated_blockings = dict(sorted(violated_blockings.items(), key=lambda x: x[1]['violations'], reverse=True))
violated_wishes = dict(sorted(violated_wishes.items(), key=lambda x: x[1]['violations'], reverse=True))
for key,val in violated_wishes.items():
for k,v in val['comments'].items():
suffix = ""
for i in k.split("
"):
if i == "":
continue
elif i in ["1 too many","1 too few"]:
suffix = f": {i}"
continue
else:
split_vio = i.split(":")
try:
day_str = datetime.datetime.strptime(split_vio[0].strip(),"%a, %b %d, %Y")
vio = ":".join(split_vio[1:])
except:
vio = ":".join(split_vio[0:])
elementary_violations[key][f"{vio}{suffix}"] += v
elementary_violations[key] = dict(sorted(elementary_violations[key].items(), key=lambda x: x[1], reverse=True))
elementary_violations = dict(sorted(elementary_violations.items(), key=lambda x: sum(x[1].values()), reverse=True))
minVal = 999999
maxVal = 0
for key, val in teams_in_group_together.items():
if val > 0 and val < minVal:
minVal = val
if val > maxVal:
maxVal = val
# %%
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},0.5)"
def percentage(value):
return f"{round(value/max(nSimulations,1)*100)}%"
sol = '
'
sol += " \
\
"
sol += ""
sol += "Probabilities of games
"
sol += "\n"
sol += "\n"
sol += ""
sol += f"| {nSimulations} | "
sol += "Pot A | "
sol += "Pot B | "
sol += "Pot C | "
sol += "Pot D | "
sol += "
"
sol += "\n"
sol += f" | \n"
for t in teams:
sol += f"{t.shortname} | \n"
sol += "
\n"
sol += "\n"
sol += "\n"
for t1 in teams:
sol += "\n"
sol += f"| {t1.shortname} | "
for t2 in teams:
color = heatmap_color_for((abs(teams_in_group_together[(t1,t2)]-(maxVal+minVal)/2))/((maxVal-minVal)/2 or 1))
opacity = "1"
if teams_in_group_together[(t1,t2)] == 0:
color = 'Gainsboro'
opacity = "0.7"
val = f"{percentage(teams_in_group_together[(t1,t2)])}"
sol += f"{val} | "
sol += "
\n"
sol += "\n"
sol += "
\n"
sol += "
"
sol += "
"
sol += "
"
sol += "
"
sol += "Availabilities
"
sol += "\n"
sol += "\n"
sol += "\n"
for t in violated_blockings.keys():
sol += f"| {t.shortname} | \n"
sol += "
\n"
sol += "\n"
sol += "\n"
sol += "\n"
for val in violated_blockings.values():
sol += f"| {val['violations']} ({percentage(val['violations'])}) | "
sol += "
\n"
sol += "\n"
for val in violated_blockings.values():
sol += f""
for c,n in val['comments'].items():
sol += f"{c} "
sol += f" | "
sol += f""
for c,n in val['comments'].items():
sol += f"{n} ({percentage(n)}) "
sol += f" | "
sol += "
\n"
sol += "\n"
sol += "
\n"
sol += "
"
sol += "
"
sol += "
"
sol += "
"
sol += "Wishes
"
sol += "\n"
sol += "\n"
sol += "\n"
for t in elementary_violations.keys():
sol += f"| {t} | \n"
sol += "
\n"
sol += "\n"
sol += "\n"
sol += "\n"
for key in elementary_violations.keys():
val = violated_wishes[key]
sol += f"| {val['violations']} ({percentage(val['violations'])}) | "
sol += "
\n"
sol += "\n"
for key,val in elementary_violations.items():
sol += f"| "
for c,n in elementary_violations[key].items():
sol += f""
sol += f" | "
sol += "
\n"
sol += "\n"
sol += "
\n"
with open(f'analytics.html', 'w') as f:
f.write(sol)
# %%