Esempio n. 1
0
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)
Esempio n. 2
0
    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')
Esempio n. 3
0
# 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]:
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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