Skip to content

Instantly share code, notes, and snippets.

@sublee
Last active December 13, 2015 20:08
Show Gist options
  • Save sublee/4967876 to your computer and use it in GitHub Desktop.
Save sublee/4967876 to your computer and use it in GitHub Desktop.
Comedy Big League TrueSkill ratings

<Comedy Big League Season 4> TrueSkill rating calculator

This small code collects match results and calculate TrueSkill ratings of the teams. The match results are provided from Enhawiki mobile mirror.

It depends on trueskill, ranking, lxml and requests.

# -*- coding: utf-8 -*-
"""
<`Comedy Big League`_ Season 4> TrueSkill rating calculator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This small code collects match results and calculate `TrueSkill`_ ratings
of the teams. The match results are provided from `Enhawiki mobile
mirror`_.
It depends on :mod:`trueskill`, :mod:`ranking`, :mod:`lxml` and
:mod:`requests`.
.. _Comedy Big League: http://cobig.interest.me/
.. _TrueSkill: http://pythonhosted.org/trueskill
.. _Enhawiki mobile mirror: http://m.enha.kr/wiki/
:copyright: (c) 2013 by Heungsub Lee
:license: Public domain.
"""
from __future__ import unicode_literals
from collections import defaultdict
from lxml import etree
from ranking import Ranking
import requests
from trueskill import Rating, rate_1vs1
from trueskill.mathematics import Gaussian
res = requests.get('http://m.enha.kr/wiki/'
'코미디%20빅%20리그%202012-2013/세부결과')
html = etree.fromstring(res.text, etree.HTMLParser(encoding='utf-8'))
# collect match results
ratings = defaultdict(Rating)
prev_ranking = {}
for round_, table in enumerate(html.xpath('//table'), start=1):
trs = table.xpath('.//tr')
if len(trs) != 12:
continue
match_results = []
for tr in [tr for x, tr in enumerate(trs) if x % 2 == 1]:
tds = tr.xpath('.//td')
try:
left_wins = '#87cefa' in tds[0].get('style')
except TypeError:
continue
winner = tds[2 if left_wins else 3].text.strip()
loser = tds[3 if left_wins else 2].text.strip()
# fix a writing error
if loser == '129':
loser = '코벤져스'
match_results.append((winner, loser))
if not match_results:
continue
# rate collected matches
for winner, loser in match_results:
rated = rate_1vs1(ratings[winner], ratings[loser])
ratings[winner], ratings[loser] = rated
# print ratings
print
print '== Until round %d ==' % round_
print
key = lambda x: x[1].exposure
ranking = sorted(ratings.iteritems(), key=key, reverse=True)
for rank, (team, rating) in Ranking(ranking, key=key, start=1):
try:
prev_rank = prev_ranking[team]
except KeyError:
delta = 0
else:
delta = prev_rank - rank
delta = ' {:+2}'.format(delta) if delta else ' '
print '{0:2}{1}'.format(rank, delta),
print '{0.mu:.3f} {0.sigma:.3f}'.format(rating), team
prev_ranking[team] = rank
== Until round 1 ==
1 29.396 7.171 따지남
1 29.396 7.171 원달라
1 29.396 7.171 졸탄
1 29.396 7.171 소모임
1 29.396 7.171 삼미 슈퍼스타즈
1 29.396 7.171 까푸치노
7 20.604 7.171 옹달
7 20.604 7.171 아3인
7 20.604 7.171 이개인
7 20.604 7.171 개통령
7 20.604 7.171 실미도
7 20.604 7.171 개불
== Until round 2 ==
1 33.073 6.240 원달라
1 33.073 6.240 삼미 슈퍼스타즈
1 33.073 6.240 까푸치노
4 -3 25.719 6.240 따지남
4 -3 25.719 6.240 졸탄
4 -3 25.719 6.240 소모임
7 28.458 7.201 GG
8 -1 24.281 6.240 이개인
8 -1 24.281 6.240 개불
10 -3 20.604 7.171 실미도
11 -4 18.043 6.464 개통령
12 -5 16.927 6.240 옹달
12 -5 16.927 6.240 아3인
== Until round 3 ==
1 36.166 5.493 까푸치노
2 +6 29.581 5.322 개불
3 -2 29.980 5.493 원달라
4 -3 27.772 5.322 삼미 슈퍼스타즈
5 +3 28.093 5.498 이개인
6 -2 27.304 5.720 소모임
7 -3 27.134 5.745 졸탄
8 +4 22.228 5.322 옹달
9 -2 23.382 6.033 GG
10 -6 20.419 5.322 따지남
11 -1 20.604 7.171 실미도
12 -1 16.342 5.884 개통령
13 -1 15.513 5.745 아3인
== Until round 4 ==
1 +1 33.499 4.658 개불
2 -1 31.992 4.759 까푸치노
3 +1 30.712 4.725 삼미 슈퍼스타즈
4 +1 30.524 4.928 이개인
5 -2 26.849 4.833 원달라
6 +2 25.688 4.703 옹달
7 -1 24.672 5.075 소모임
8 +2 23.397 4.754 따지남
9 -2 23.102 4.957 졸탄
10 -1 19.555 5.191 GG
11 +2 18.446 5.088 아3인
12 -1 20.604 7.171 실미도
13 -1 13.264 5.176 개통령
== Until round 5 ==
1 34.402 4.374 개불
2 32.808 4.489 까푸치노
3 31.701 4.419 삼미 슈퍼스타즈
4 31.078 4.711 이개인
5 +2 27.517 4.497 소모임
6 24.768 4.410 옹달
7 -2 24.269 4.337 원달라
8 22.395 4.443 따지남
9 22.216 4.651 졸탄
10 +3 17.044 4.534 개통령
11 17.856 4.848 아3인
12 -2 15.752 4.543 GG
13 -1 20.604 7.171 실미도
== Until round 6 ==
1 35.304 4.110 개불
2 34.610 4.091 까푸치노
3 29.955 4.040 삼미 슈퍼스타즈
4 +2 26.309 4.052 옹달
5 26.564 4.210 소모임
6 +1 25.797 3.997 원달라
7 -3 25.804 4.087 이개인
8 +2 21.931 3.981 개통령
9 -1 20.831 4.076 따지남
10 -1 20.459 4.229 졸탄
11 20.537 4.496 아3인
12 15.752 4.543 GG
13 20.604 7.171 실미도
14 17.079 6.378 3GO
== Until round 7 ==
1 35.846 3.926 개불
2 35.259 3.888 까푸치노
3 31.054 3.770 삼미 슈퍼스타즈
4 +1 27.543 3.939 소모임
5 -1 25.673 3.854 옹달
6 25.284 3.829 원달라
7 24.679 3.807 이개인
8 +3 22.859 4.031 아3인
9 +1 21.631 3.991 졸탄
10 -2 20.111 3.662 개통령
11 -2 19.914 3.831 따지남
12 15.752 4.543 GG
13 20.604 7.171 실미도
14 14.415 5.525 3GO
== Until round 8 ==
1 36.820 3.678 개불
2 35.897 3.699 까푸치노
3 30.156 3.551 삼미 슈퍼스타즈
4 +2 26.912 3.526 원달라
5 -1 26.888 3.743 소모임
6 +1 25.599 3.580 이개인
7 -2 24.023 3.546 옹달
8 +2 20.836 3.504 개통령
9 -1 21.260 3.802 아3인
10 -1 21.631 3.991 졸탄
11 +2 25.663 5.784 실미도
12 -1 18.982 3.599 따지남
13 -1 15.752 4.543 GG
14 12.765 4.963 3GO
== Until round 9 ==
1 33.647 3.317 개불
2 32.638 3.333 까푸치노
3 30.830 3.376 삼미 슈퍼스타즈
4 29.828 3.210 원달라
5 +1 28.652 3.250 이개인
6 -1 27.685 3.538 소모임
7 23.352 3.371 옹달
8 +3 27.649 5.113 실미도
9 +3 20.459 3.447 따지남
10 -2 20.107 3.361 개통령
11 -2 20.438 3.587 아3인
12 -2 21.631 3.991 졸탄
13 15.752 4.543 GG
14 17.085 6.207 코벤져스
15 -1 12.765 4.963 3GO
== Until round 10 ==
1 34.779 3.110 개불
2 31.494 3.123 까푸치노
3 31.668 3.222 삼미 슈퍼스타즈
4 +2 29.243 3.267 소모임
5 -1 27.363 2.958 원달라
6 -1 27.337 3.041 이개인
7 24.252 3.180 옹달
8 +1 23.301 3.133 따지남
9 -1 25.728 4.557 실미도
10 19.212 3.172 개통령
11 +1 21.631 3.991 졸탄
12 -1 18.914 3.389 아3인
13 +1 21.645 5.108 코벤져스
14 -1 15.752 4.543 GG
15 12.765 4.963 3GO
== Until round 11 ==
1 35.349 2.979 개불
2 +1 32.125 3.099 삼미 슈퍼스타즈
3 -1 31.652 3.067 까푸치노
4 +2 28.177 2.906 이개인
5 -1 28.614 3.114 소모임
6 -1 27.702 2.869 원달라
7 +1 24.154 2.997 따지남
8 -1 23.807 3.063 옹달
9 23.842 4.085 실미도
10 +1 21.631 3.991 졸탄
11 -1 18.823 3.062 개통령
12 18.729 3.318 아3인
13 19.379 4.494 코벤져스
14 15.752 4.543 GG
15 12.765 4.963 3GO
== Until round 12 ==
1 35.620 2.933 개불
2 +1 31.652 3.067 까푸치노
3 -1 30.472 2.880 삼미 슈퍼스타즈
4 29.630 2.726 이개인
5 28.937 3.032 소모임
6 26.318 2.695 원달라
7 25.665 2.798 따지남
8 24.845 2.904 옹달
9 21.996 3.699 실미도
10 +2 20.021 3.092 아3인
11 -1 21.631 3.991 졸탄
12 -1 17.722 2.886 개통령
13 18.708 4.239 코벤져스
14 15.752 4.543 GG
15 22.879 7.241 레오
16 -1 12.765 4.963 3GO
== Until round 13 ==
1 36.098 2.820 개불
2 +1 31.079 2.755 삼미 슈퍼스타즈
3 -1 31.652 3.067 까푸치노
4 29.217 2.636 이개인
5 29.608 2.890 소모임
6 +1 26.123 2.700 따지남
7 -1 25.786 2.593 원달라
8 24.229 2.780 옹달
9 23.021 3.478 실미도
10 19.462 2.958 아3인
11 +1 18.761 2.791 개통령
12 -1 21.631 3.991 졸탄
13 17.362 3.903 코벤져스
14 15.752 4.543 GG
15 16.345 5.559 레오
16 12.765 4.963 3GO
== Until round 14 ==
1 36.611 2.711 개불
2 30.589 2.653 삼미 슈퍼스타즈
3 31.652 3.067 까푸치노
4 29.787 2.533 이개인
5 28.181 2.706 소모임
6 27.368 2.551 따지남
7 25.235 2.494 원달라
8 24.745 2.675 옹달
9 23.875 3.273 실미도
10 18.878 2.831 아3인
11 18.210 2.687 개통령
12 21.631 3.991 졸탄
13 18.681 3.665 코벤져스
14 15.752 4.543 GG
15 13.669 4.845 레오
16 12.765 4.963 3GO
== Until round 15 ==
1 36.720 2.676 개불
2 +1 31.652 3.067 까푸치노
3 -1 29.479 2.513 삼미 슈퍼스타즈
4 +1 29.337 2.557 소모임
5 -1 28.754 2.407 이개인
6 28.416 2.423 따지남
7 25.526 2.431 원달라
8 25.135 2.596 옹달
9 23.716 3.210 실미도
10 +1 17.873 2.607 개통령
11 +1 21.631 3.991 졸탄
12 -2 17.582 2.698 아3인
13 17.950 3.458 코벤져스
14 +1 17.461 4.135 레오
15 -1 15.752 4.543 GG
16 12.765 4.963 3GO
== Until round 17 ==
1 36.733 2.671 개불
2 31.652 3.067 까푸치노
3 +3 28.776 2.387 따지남
4 +1 28.754 2.407 이개인
5 -1 28.635 2.503 소모임
6 -3 28.274 2.383 삼미 슈퍼스타즈
7 +1 26.421 2.453 옹달
8 -1 25.760 2.384 원달라
9 23.716 3.210 실미도
10 32.447 6.141 레드버터
11 -1 17.579 2.569 개통령
12 -1 21.631 3.991 졸탄
13 -1 17.569 2.692 아3인
14 -1 17.950 3.458 코벤져스
15 28.007 6.956 변합지졸
16 -2 16.783 3.896 레오
17 -2 15.752 4.543 GG
18 20.744 6.644 더블패티
19 -3 12.765 4.963 3GO
== Until round 21 ==
1 34.870 2.499 개불
2 +4 29.758 2.262 삼미 슈퍼스타즈
3 -1 31.652 3.067 까푸치노
4 -1 28.776 2.387 따지남
5 -1 28.754 2.407 이개인
6 -1 27.990 2.453 소모임
7 25.948 2.403 옹달
8 25.487 2.345 원달라
9 +1 34.259 5.407 레드버터
10 +5 31.809 5.674 변합지졸
11 -2 23.716 3.210 실미도
12 32.140 6.174 개성공단
13 18.416 2.611 아3인
14 -2 21.631 3.991 졸탄
15 -4 16.759 2.466 개통령
16 18.666 3.523 레오
17 -3 17.950 3.458 코벤져스
18 -1 15.752 4.543 GG
19 -1 15.584 5.281 더블패티
20 -1 12.765 4.963 3GO
== Until round 32 ==
1 34.870 2.499 개불
2 29.189 2.225 삼미 슈퍼스타즈
3 31.652 3.067 까푸치노
4 28.776 2.387 따지남
5 28.754 2.407 이개인
6 27.990 2.453 소모임
7 +1 25.915 2.308 원달라
8 +1 34.259 5.407 레드버터
9 -2 24.670 2.295 옹달
10 31.809 5.674 변합지졸
11 32.707 6.081 로케트펀치
12 -1 23.716 3.210 실미도
13 -1 32.140 6.174 개성공단
14 -1 19.457 2.496 아3인
15 +1 21.411 3.171 레오
16 -1 16.759 2.466 개통령
17 -3 19.199 3.562 졸탄
18 29.396 7.171 미추미추
19 -2 17.950 3.458 코벤져스
20 27.340 7.301 부레옥잠
21 -3 15.752 4.543 GG
22 19.606 6.421 안쌍
23 -4 14.644 5.029 더블패티
24 20.604 7.171 J양P
25 -5 12.765 4.963 3GO
== Until round 33 ==
1 34.870 2.499 개불
2 29.323 2.195 삼미 슈퍼스타즈
3 31.652 3.067 까푸치노
4 28.776 2.387 따지남
5 28.754 2.407 이개인
6 27.990 2.453 소모임
7 25.661 2.273 원달라
8 +3 34.463 5.367 로케트펀치
9 24.996 2.260 옹달
10 -2 34.259 5.407 레드버터
11 -1 31.809 5.674 변합지졸
12 23.716 3.210 실미도
13 32.140 6.174 개성공단
14 +4 31.022 6.361 미추미추
15 -1 19.260 2.464 아3인
16 -1 20.907 3.088 레오
17 +3 30.015 6.214 부레옥잠
18 -2 16.759 2.466 개통령
19 -2 18.855 3.436 졸탄
20 -1 17.950 3.458 코벤져스
21 +2 17.637 4.540 더블패티
22 -1 15.752 4.543 GG
23 +1 17.428 5.950 J양P
24 -2 14.729 5.364 안쌍
25 12.765 4.963 3GO
== Until round 34 ==
1 34.870 2.499 개불
2 30.081 2.137 삼미 슈퍼스타즈
3 31.652 3.067 까푸치노
4 28.857 2.368 따지남
5 28.754 2.407 이개인
6 27.990 2.453 소모임
7 25.864 2.242 원달라
8 +1 25.719 2.205 옹달
9 +1 34.259 5.407 레드버터
10 -2 29.936 4.420 로케트펀치
11 31.809 5.674 변합지졸
12 23.716 3.210 실미도
13 32.140 6.174 개성공단
14 +1 20.138 2.359 아3인
15 +1 19.530 2.876 레오
16 +1 24.553 4.926 부레옥잠
17 +1 16.759 2.466 개통령
18 +3 21.618 4.107 더블패티
19 18.855 3.436 졸탄
20 -6 23.205 5.101 미추미추
21 -1 17.950 3.458 코벤져스
22 15.752 4.543 GG
23 16.037 5.346 J양P
24 14.323 5.135 안쌍
25 12.765 4.963 3GO
== Until round 35 ==
1 33.455 2.398 개불
2 30.250 2.107 삼미 슈퍼스타즈
3 +1 29.355 2.286 따지남
4 -1 31.652 3.067 까푸치노
5 28.754 2.407 이개인
6 27.990 2.453 소모임
7 25.418 2.173 원달라
8 24.648 2.110 옹달
9 34.259 5.407 레드버터
10 30.462 4.205 로케트펀치
11 +5 30.046 4.086 부레옥잠
12 -1 31.809 5.674 변합지졸
13 +1 21.363 2.242 아3인
14 -2 23.716 3.210 실미도
15 -2 32.140 6.174 개성공단
16 -1 19.307 2.818 레오
17 +3 24.145 4.780 미추미추
18 20.996 3.878 더블패티
19 -2 16.759 2.466 개통령
20 -1 18.855 3.436 졸탄
21 17.950 3.458 코벤져스
22 15.752 4.543 GG
23 16.037 5.346 J양P
24 13.370 4.808 안쌍
25 12.765 4.963 3GO
== Until round 36 ==
1 +1 30.773 2.041 삼미 슈퍼스타즈
2 -1 31.390 2.268 개불
3 +1 31.652 3.067 까푸치노
4 -1 28.740 2.201 따지남
5 28.754 2.407 이개인
6 27.990 2.453 소모임
7 +4 31.832 3.744 부레옥잠
8 25.286 2.037 옹달
9 -2 24.741 2.093 원달라
10 -1 34.259 5.407 레드버터
11 -1 28.571 3.831 로케트펀치
12 +1 22.063 2.177 아3인
13 -1 31.809 5.674 변합지졸
14 +2 22.160 2.605 레오
15 -1 23.716 3.210 실미도
16 -1 32.140 6.174 개성공단
17 +2 16.759 2.466 개통령
18 -1 20.964 4.102 미추미추
19 +1 18.855 3.436 졸탄
20 -2 18.336 3.545 더블패티
21 17.950 3.458 코벤져스
22 +2 17.457 4.155 안쌍
23 -1 15.752 4.543 GG
24 -1 16.037 5.346 J양P
25 12.765 4.963 3GO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment