from elo import do_sauceda, Game, Team
from datetime import date
import Image
FIN = file('scores.dat')
def parse_data(fin):
teams = {}
games = []
for line in fin:
if not line.strip(): continue
try:
dt, field, team1, team2, score, winner = \
[x.strip() for x in line.split('\t')]
if score == 'N/A':
continue #rain out
score_l, score_w = \
sorted([int(x) for x in score.strip().split('-')])
#why do I need to strip this? (otherwise strptime fails)
dt = dt.strip()
except ValueError:
print "Could not decode line:\n%s" % line
raise
if winner == team2:
loser = team1
elif winner == team1:
loser = team2
else:
#it's a tie; pick a name for each
winner = team1
loser = team2
teams[winner] = teams.get(winner, Team(winner))
teams[loser] = teams.get(loser, Team(loser))
games.append(Game(teams[winner], score_w, teams[loser], score_l, dt))
if score_w > score_l:
teams[winner].wins += 1
teams[loser].losses += 1
else:
teams[winner].draws += 1
teams[loser].draws += 1
return teams, games
def parse_future(fin):
games = []
for line in fin:
if not line.strip(): continue
dt, loc, t1, t2, _, _ = [x.strip() for x in line.strip().split('\t')]
games.append((t1, t2))
return games
def print_future(teams, games, fout):
print >>fout, "
Next Week's Predictions:
"
print >>fout, """| Winner | Loser | Margin |
"""
for t1, t2 in games:
r1 = teams[t1].ranking
r2 = teams[t2].ranking
diff = abs(r1 - r2)
if r1 > r2:
w, l = t1, t2
else:
l, w = t1, t2
print >>fout, "| %s | %s | %.1f |
" \
% (w, l, diff * .02)
def make_rosters(fin):
rosters = {}
blank = 1
for line in fin:
line = line.strip()
if not line:
blank = 1
continue
line = line.strip('"')
line = line.replace('""', '"')
if blank:
try:
team, n, captain = line.split('-')
except ValueError:
team, n = line.split('-')
captain = team
f = file(team + '.txt', 'w')
blank = 0
else:
f.write(line + '\n')
def print_rankings(teams, games, fout):
print >>fout, """\
CT Ultimate Summer League Rankings
| Team Name | Ranking | Record |
Pt Diff | Relative | Week Change | SOS (rank) |
Roster |
"""
max_rank = max([team.ranking for team in teams])
min_rank = min([team.ranking for team in teams])
max_diff = max_rank - min_rank
max_dt = max([g.dt for g in games])
seconds_in_day = 24*60*60
soses = list(sorted([(t.calc_sos(), t.name) for t in teams]))
soses = dict([(t[1], (i, t[0])) for i, t in enumerate(reversed(soses))])
for i, team in enumerate(teams):
rank_pct = int(((team.ranking - min_rank) / max_diff) * 100)
bar = Image.new("RGB", (rank_pct + 2, 10), (0, 0, 255))
change = int(round(team.week_change(max_dt)))
if change > 0:
change = '%+d' % change
elif change < 0:
change = '%+d' % change
else:
change = ' 0'
bar.save('team%d.gif' % i)
#Sean's team contains illegal file name chars (real solution: sanitize)
if team.name.find('Sean') > -1:
roster = 'Sean Laing'
else:
roster = team.name
sos = "%.1f (%d)" % (soses[team.name][1], soses[team.name][0] + 1)
rank = str(i + 1).rjust(2, ' ').replace(' ', ' ')
s = '''\
| %s. %s | %d | %d-%d-%d | %d |
 | %s | %s |
Roster
|
''' % \
(rank, roster, team.name, team.ranking, team.wins, \
team.losses, team.draws, team.pd, i, change, sos, roster)
print >>fout, s
print >>fout, "
"
def graph_teams(teams):
import pylab as g
rankings = []
for i, team in enumerate(reversed(teams)):
rankings = team.history + [team.ranking]
#rankings.append(team.ranking)
#g.text(i+.5, team.ranking-6, team.name)
for j, game in enumerate(team.games):
if game.winner.name == team.name:
opp = game.loser.name
else:
opp = game.winner.name
g.text(j, rankings[j], opp)
g.plot(range(len(rankings)), rankings, 's-b')
if team.name.find('Sean') > -1:
name = 'Sean Laing'
else:
name = team.name
g.savefig('%s.png' % name)
g.clf()
#g.show()
def get_ranking(team): return team.ranking
if __name__ == '__main__':
teams, games = parse_data(FIN)
do_sauceda(games)
make_rosters(file('sl2005rosters.dat'))
#sort teams by ranking
ordered = list(reversed(sorted(teams.values(), key=get_ranking)))
#and print them out
fout = file('elo.html', 'w')
print_rankings(ordered, games, fout)
#now graph them
graph_teams(list(ordered))
#future_games = parse_future(file('future.dat'))
#print_future(teams, future_games, fout)
print >> fout, ""