def home(request): base = base_ctx(request=request) period = Period.objects.filter(computed=True).order_by('-start')[0] entries = filter_active_ratings(Rating.objects.filter(period=period).order_by('-rating')) entries = entries.select_related('team', 'teammembership')[0:10] for entry in entries: teams = entry.player.teammembership_set.filter(current=True) if teams.exists(): entry.team = teams[0].team.shortname entry.teamfull = teams[0].team.name entry.teamid = teams[0].team.id blogs = Post.objects.order_by('-date')[0:3] base.update({'entries': entries, 'blogposts': blogs}) return render_to_response('index.html', base)
st = cdf(rt-rp) + cdf(rt-rz) sz = cdf(rz-rp) + cdf(rz-rt) period.dom_p = sp period.dom_t = st period.dom_z = sz # Write some period statistics period.num_retplayers = num_retplayers period.num_newplayers = num_newplayers period.num_games = num_games period.computed = True period.needs_recompute = False period.save() # Write ranks ratings = list(filter_active_ratings(Rating.objects.filter(period=period))) for index, rating in enumerate(sorted(ratings, key=lambda r: r.rating, reverse=True)): rating.position = index + 1 for index, rating in enumerate(sorted(ratings, key=lambda r: r.rating + r.rating_vp, reverse=True)): rating.position_vp = index + 1 for index, rating in enumerate(sorted(ratings, key=lambda r: r.rating + r.rating_vt, reverse=True)): rating.position_vt = index + 1 for index, rating in enumerate(sorted(ratings, key=lambda r: r.rating + r.rating_vz, reverse=True)): rating.position_vz = index + 1 for rating in ratings: rating.save() # Recompute the hall of fame # NOTE: If you compute several periods after one another, it might be wise to comment this and run it only # after the last rating computation, as it takes time to run and adds up quickly. # os.system('./domination.py')
# Setup nplayers_max = 6 if proleague else 5 nplayers_needed = 6 if proleague else 1 Simulator = TeamPL if proleague else TeamAK # Get a list of all teams that can compete current_period = Period.objects.filter(computed=True).order_by('-id')[0] teams = Group.objects.filter(active=True, is_team=True) allowed_teams = [] for team in teams: ratings = Rating.objects.filter(period=current_period, player__groupmembership__group=team, player__groupmembership__current=True, player__groupmembership__playing=True)\ .exclude(player__race='S').exclude(player__race='R') if filter_active_ratings(ratings).count() >= nplayers_needed: allowed_teams.append(team) nteams = len(allowed_teams) # Prepare the score table scores = dict() for t in allowed_teams: scores[t] = 0.0 # Loop over all pairs of teams for (team_a, team_b) in combinations(allowed_teams, 2): print team_a.name, '--', team_b.name # Get player lists for both teams players = [] for team in [team_a, team_b]:
def period(request, period_id, page='1'): psize = 40 try: page = int(request.GET['page']) except: page = 1 period = get_object_or_404(Period, id=period_id, computed=True) # Best and most specialised players best = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2).order_by('-rating')[0] bestvp = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vp'}).order_by('-d')[0] bestvt = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vt'}).order_by('-d')[0] bestvz = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vz'}).order_by('-d')[0] specvp = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vp/dev_vp*rating'}).order_by('-d')[0] specvt = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vt/dev_vt*rating'}).order_by('-d')[0] specvz = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vz/dev_vz*rating'}).order_by('-d')[0] # Matchup statistics ntz = lambda k: k if k is not None else 0 def wl(rca, rcb): ms = Match.objects.filter(period=period, rca=rca, rcb=rcb).aggregate(Sum('sca'), Sum('scb')) w = ntz(ms['sca__sum']) l = ntz(ms['scb__sum']) ms = Match.objects.filter(period=period, rca=rcb, rcb=rca).aggregate(Sum('sca'), Sum('scb')) w += ntz(ms['scb__sum']) l += ntz(ms['sca__sum']) return w, l pvt_wins, pvt_loss = wl('P', 'T') pvz_wins, pvz_loss = wl('P', 'Z') tvz_wins, tvz_loss = wl('T', 'Z') # Filtering the ratings entries = Rating.objects.filter(period=period).select_related('team','teammembership') entries = filter_active_ratings(entries) try: race = request.GET['race'] except: race = 'ptzrs' q = None for r in race: qt = Q(player__race=r.upper()) if q == None: q = qt else: q = q | qt entries = entries.filter(q) try: nats = request.GET['nats'] except: nats = 'all' if nats == 'kr': entries = entries.filter(player__country='KR') elif nats == 'foreigners': entries = entries.exclude(player__country='KR') try: sort = request.GET['sort'] except: sort = '' if sort not in ['', 'vp', 'vt', 'vz']: sort = '' if sort == '': entries = entries.order_by('-rating', 'player__tag') elif sort == 'vp': entries = entries.extra(select={'d':'rating+rating_vp'}).order_by('-d', 'player__tag') elif sort == 'vt': entries = entries.extra(select={'d':'rating+rating_vt'}).order_by('-d', 'player__tag') elif sort == 'vz': entries = entries.extra(select={'d':'rating+rating_vz'}).order_by('-d', 'player__tag') # Pages nperiods = Period.objects.filter(computed=True).count() nitems = entries.count() npages = nitems/psize + (1 if nitems % psize > 0 else 0) page = min(max(page, 1), npages) entries = entries[(page-1)*psize:page*psize] # Collect team data for entry in entries: teams = entry.player.teammembership_set.filter(current=True) if teams.exists(): entry.team = teams[0].team.shortname entry.teamfull = teams[0].team.name entry.teamid = teams[0].team.id # Render base = base_ctx('Ranking', 'Current', request) base.update({'period': period, 'entries': entries, 'page': page, 'npages': npages, 'nperiods': nperiods, 'best': best, 'bestvp': bestvp, 'bestvt': bestvt, 'bestvz': bestvz, 'specvp': specvp, 'specvt': specvt, 'specvz': specvz, 'sortable': True, 'startcount': (page-1)*psize, 'localcount': True, 'sort': sort, 'race': race, 'nats': nats, 'pvt_wins': pvt_wins, 'pvt_loss': pvt_loss, 'pvz_wins': pvz_wins, 'pvz_loss': pvz_loss, 'tvz_wins': tvz_wins, 'tvz_loss': tvz_loss}) if period.id != base['curp'].id: base['curpage'] = '' return render_to_response('period.html', base)
def period(request, period_id, page='1'): psize = 40 try: page = int(request.GET['page']) except: page = 1 period = get_object_or_404(Period, id=period_id, computed=True) best = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2).order_by('-rating')[0] bestvp = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vp'}).order_by('-d')[0] bestvt = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vt'}).order_by('-d')[0] bestvz = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating+rating_vz'}).order_by('-d')[0] specvp = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vp/dev_vp*rating'}).order_by('-d')[0] specvt = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vt/dev_vt*rating'}).order_by('-d')[0] specvz = Rating.objects.filter(period=period, decay__lt=4, dev__lte=0.2)\ .extra(select={'d':'rating_vz/dev_vz*rating'}).order_by('-d')[0] entries = Rating.objects.filter(period=period).select_related('team','teammembership') entries = filter_active_ratings(entries) try: race = request.GET['race'] except: race = 'ptzrs' q = None for r in race: qt = Q(player__race=r.upper()) if q == None: q = qt else: q = q | qt entries = entries.filter(q) try: nats = request.GET['nats'] except: nats = 'all' if nats == 'kr': entries = entries.filter(player__country='KR') elif nats == 'foreigners': entries = entries.exclude(player__country='KR') try: sort = request.GET['sort'] except: sort = '' if sort not in ['', 'vp', 'vt', 'vz']: sort = '' if sort == '': entries = entries.order_by('-rating', 'player__tag') elif sort == 'vp': entries = entries.extra(select={'d':'rating+rating_vp'}).order_by('-d', 'player__tag') elif sort == 'vt': entries = entries.extra(select={'d':'rating+rating_vt'}).order_by('-d', 'player__tag') elif sort == 'vz': entries = entries.extra(select={'d':'rating+rating_vz'}).order_by('-d', 'player__tag') nperiods = Period.objects.filter(computed=True).count() nitems = entries.count() npages = nitems/psize + (1 if nitems % psize > 0 else 0) page = min(max(page, 1), npages) entries = entries[(page-1)*psize:page*psize] for entry in entries: teams = entry.player.teammembership_set.filter(current=True) if teams.exists(): entry.team = teams[0].team.shortname entry.teamfull = teams[0].team.name entry.teamid = teams[0].team.id base = base_ctx('Ranking', 'Current', request) base.update({'period': period, 'entries': entries, 'page': page, 'npages': npages, 'nperiods': nperiods,\ 'best': best, 'bestvp': bestvp, 'bestvt': bestvt, 'bestvz': bestvz, 'specvp': specvp,\ 'specvt': specvt, 'specvz': specvz, 'sortable': True, 'startcount': (page-1)*psize, 'localcount': True, 'sort': sort, 'race': race, 'nats': nats}) if period.id != base['curp'].id: base['curpage'] = '' return render_to_response('period.html', base)
limit = 7 # The benchmark position on the rating list. Above here, players will gain points. # Below, players will lose points. mean = False # Set to True to use the mean of the top N players as a benchmark, False to just # use the rating of the Nth player. first_period = 25 # Before this it doesn't count. # First, clear everything Rating.objects.update(domination=None) # Evaluate the domination scores for every player in every period print 'Evaluating domination scores...' for period in Period.objects.filter(computed=True, id__gte=first_period): bench = filter_active_ratings(Rating.objects.filter(period=period)).order_by('-rating')[limit-1].rating if mean: bench = filter_active_ratings(Rating.objects.filter(period=period, rating__gte=bench)) bench = bench.aggregate(Avg('rating'))['rating__avg'] filter_active_ratings(Rating.objects.filter(period=period)).update(domination=F('rating')-bench) # Evaluate the hall of fame scores print 'Evaluating Hall of Fame. This might take a while...' for player in Player.objects.all(): ratings = list(Rating.objects.filter(player=player, period__id__gte=first_period).order_by('period__id')) # Ignore players without ratings if len(ratings) == 0: continue # Collect a list of indices where the rating domination switches from positive to negative or vice versa