見出し画像

レーティングツールを作成してみた(プログラミング)


レーティングツール

皆さんいつもごったまぜの数理科学記事を読んでくれてありがとうございます。現在数学は色んなものに手を付けすぎていてアウトプット出来る状態ではないので、今回は遊びで作ったツールを紹介してみます。
皆さんはレートと言うものをご存じですか?オンライン対戦等をしている読者の方はなじみが深いと思います。私も将棋等でよくお世話になっている概念です。簡単に言うと相対的な強さの可視化です。
今回のツール作成の動機はサークル等で行われる個人競技において強さが分かると面白いなと思った事です。そしてレーティングの数理について調べ実際に有用なツールとして作ってみました。そして私はこれを実際に使っています。作成時間は2時間くらいです。自分で使うだけなので製品としてのコーディングにはなっていないですが有用です。これを読んでくれた読者の方は実際に使っていただいて大丈夫です。

環境

Pythonで作成しています。conda 23.1.0

ツール解説

  1. [レーティングテスト.xlsx]を用意する

  2. [レーティング]シートの内容は画像の通り

  3. [勝敗]シートの内容は画像の通り

  4. [run.py]を実行した結果は画像の通り

レーティングシート
勝敗シート
結果

考え方は色々あると思いますが、このツールの動作はレーティングの洗い替えになります。

コード

# ワークブックの読み込み
from openpyxl import load_workbook
wb = load_workbook('レーティングテスト.xlsx')

## 点数調整用
def clamp(point, min, max):
  if(point < min):
    return min
  elif(max < point):
    return max
  else:
    return point

# イロレーティング
def calculatePoint(winnerRate, loserRate):
    K = 32
    point = K / (10 ** ( (winnerRate - loserRate) / 400 ) + 1)
    point = clamp(point, 2, 32)
    return point

# 勝敗の読み込みi回目
def readWin(ws, i):
    results = []
    for row in ws.iter_rows():
        if row[0].row < 3:
            continue
        winner = ws.cell(row = row[0].row, column = (i + 1) * 2  -1).value
        loser = ws.cell(row = row[0].row, column = (i + 1) * 2).value
        results.append((winner, loser))
    return results
   

# 勝敗読み込み
ws = wb['勝敗']
results_dic = {}
kaisu = 3
for i in range(kaisu):
   results_dic[i] = readWin(ws, i)

# 現レート読み込み
rws = wb['レーティング']
ratings = {}
first = True
for row in rws.iter_rows():
    if first:
        first = False
        continue
    name = rws.cell(row = row[0].row, column = 2).value
    rate = rws.cell(row = row[0].row, column = 3).value
    print(name)
    ratings[name] = rate

# 演算
for key in results_dic:
    for res in results_dic[key]:
        winner = res[0]
        loser = res[1]
        print('winner', winner)
        if winner:
            win_rate = ratings[winner]
            lose_rate = ratings[loser]
            point = calculatePoint(win_rate, lose_rate)

            # 辞書の更新
            ratings[winner] = win_rate + point
            ratings[loser] = lose_rate - point

    # エクセルへの書き込み
    for _key in ratings.keys():
        for row in rws.iter_rows():
            name = rws.cell(row = row[0].row, column = 2).value
            rate = rws.cell(row = row[0].row, column = 3).value
            if _key == name:
                # レートの更新(※マジックナンバーあり!!)
                rws.cell(row = row[0].row, column = 4 + int(key)).value = ratings[_key]

# エクセルの保存
wb.save('レーティングテスト.xlsx')

レーティングの数理

下記記事を参考にしました。

アルゴリズムの大まかな解説

  1. [勝敗]シートを読み込みます。(※kaisu変数はマジックナンバーです。実行する度に戦った日の数だけ使用側で書き換えます)。result_dicに日にちID(的なもの)key、valueをその日の勝者、敗者のtupleのリストとして読み込んでおきます。

  2. [レーティング]シートを読み込みます。ratingsのkeyは人、valueはレートです。結局これを書き換えながらエクセルに書き込むだけです。

  3. result_dicを日付で回します。イロレーティングを基に1日のratingsを演算し終わったらエクセルに一日の結果を書き込みます。

まとめ

これだけで簡単なレーティングツールが完成しました。便利に使っています。

今回は裏芸紹介のコーナーでした。では!!


この記事が気に入ったらサポートをしてみませんか?