# %% 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 draws.models import SuperGroup 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 supergroups = SuperGroup.objects.filter(draw__season=season).order_by('name') 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

" for sg in supergroups: sol += f"

{sg}

" if sg.name == "Nations League D": sol += "\n" sol += "\n" sol += "" sol += f"" sol += "" sol += "" sol += "" else: sol += "
{nSimulations}Pot APot B
\n" sol += "\n" sol += "" sol += f"" sol += "" sol += "" sol += "" sol += "" sol += "" sol += "\n" sol += f"\n" for t in sg.teams.order_by('pot'): sol += f"\n" sol += "\n" sol += "\n" sol += "\n" for t1 in sg.teams.order_by('pot'): sol += "\n" sol += f"" for t2 in sg.teams.order_by('pot'): 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 = 'lightgrey' opacity = "0.7" val = f"{percentage(teams_in_group_together[(t1,t2)])}" sol += f"" sol += "\n" sol += "\n" sol += "
{nSimulations}Pot APot BPot CPot D
{t.shortname} - {t.pot}
{t1.shortname} - {t.pot}{val}
\n" sol += "
" sol += "
" sol += "
" sol += "
" sol += "

Availabilities

" sol += "\n" sol += "\n" sol += "\n" for t in violated_blockings.keys(): sol += f"\n" sol += "\n" sol += "\n" sol += "\n" sol += "\n" for val in violated_blockings.values(): sol += f"" sol += "\n" sol += "\n" for val in violated_blockings.values(): sol += f"" sol += f"" sol += "\n" sol += "\n" sol += "
{t.shortname}
{val['violations']} ({percentage(val['violations'])})
" for c,n in val['comments'].items(): sol += f"{c}
" sol += f"
" for c,n in val['comments'].items(): sol += f"{n} ({percentage(n)})
" sol += f"
\n" sol += "
" sol += "
" sol += "
" sol += "
" sol += "

Wishes

" sol += "\n" sol += "\n" sol += "\n" for t in elementary_violations.keys(): sol += f"\n" sol += "\n" sol += "\n" sol += "\n" sol += "\n" for key in elementary_violations.keys(): val = violated_wishes[key] sol += f"" sol += "\n" sol += "\n" for key,val in elementary_violations.items(): sol += f"" sol += "\n" sol += "\n" sol += "
{t}
{val['violations']} ({percentage(val['violations'])})
" for c,n in elementary_violations[key].items(): sol += f"
{c}{n} ({percentage(n)})
" sol += f"
\n" with open(f'analytics.html', 'w') as f: f.write(sol) # %%