как отслеживать рейтинг истинного игрока, а также время - PullRequest
0 голосов
/ 13 января 2020

см. Вопрос ниже Python Trueskill - Использование словарей

что если будет новая дата в столбце, и я хочу отслеживать рейтинг игрока после каждой гонки? Как я могу достичь этого?

Пример ввода:

date game participant rank ....(various game stats)
1/1/2019   1    alice       2
1/1/2019   1    bob         1
1/1/2019   1    eve         3
1/2/2019   2    alice       1
1/2/2019   2    eve         1
1/4/2019   3    bob         1
1/4/2019   3    carol       2
1/4/2019   3    alice       3
1/4/2019   3    ted         4
1/4/2019   3    eve         5

Я использовал код:

from collections import defaultdict
  from itertools import groupby
  from pprint import pprint
  from trueskill import Rating, rate

  results = [(1/1/2019, 1, 'alice', 2),
           (1/1/2019, 1, 'bob', 1),
           (1/1/2019, 1, 'eve', 3),
           (1/2/2019, 2, 'alice', 1),
           (1/2/2019, 2, 'eve', 1),
           (1/4/2019, 3, 'bob', 1),
           (1/4/2019, 3, 'carol', 2),
           (1/4/2019, 3, 'alice', 3),
           (1/4/2019, 3, 'ted', 4),
           (1/4/2019, 3, 'eve', 5)]
ratings = defaultdict(Rating)

for game_id, result in groupby(results, lambda x: x[1]):
    result = list(result)
    rating_groups = [(ratings[name],) for date, game_id, name, rank in result]
    ranks = [rank for date, game_id, name, rank in result]
    transformed_groups = rate(rating_groups, ranks=ranks)
    for x, (date, game_id, name, rank) in enumerate(result):
        ratings[name], = transformed_groups[x]

pprint(dict(ratings))

И результат будет:

{'alice': trueskill.Rating(mu=23.967, sigma=4.088),
 'bob': trueskill.Rating(mu=36.119, sigma=5.434),
 'carol': trueskill.Rating(mu=29.226, sigma=5.342),
 'eve': trueskill.Rating(mu=16.740, sigma=4.438),
 'ted': trueskill.Rating(mu=21.013, sigma=5.150)}

Что если я хочу, чтобы выходной результат был:

{1/1/2019: 'alice': trueskill.Rating(),
 1/1/2019: 'bob': trueskill.Rating(),
 1/1/2019: 'eve': trueskill.Rating(),
 1/2/2019: 'alice': trueskill.Rating(),
 1/2/2019: 'eve': trueskill.Rating(),
 .......}

1 Ответ

0 голосов
/ 13 января 2020
from collections import defaultdict
from itertools import groupby
from pprint import pprint
from trueskill import Rating, rate

results = [('1/1/2019',1, 'alice', 2),
           ('1/1/2019',1, 'bob', 1),
           ('1/1/2019',1, 'eve', 3),
           ('1/2/2019',2, 'alice', 1),
           ('1/2/2019',2, 'eve', 1),
           ('1/4/2019',3, 'bob', 1),
           ('1/4/2019',3, 'carol', 2),
           ('1/4/2019',3, 'alice', 3),
           ('1/4/2019',3, 'ted', 4),
           ('1/4/2019',3, 'eve', 5)]
ratings = defaultdict(Rating)
print(ratings)

for game_time, result in groupby(results, lambda x: x[0]):
    result = list(result)
    print(game_time)
    rating_groups = [(ratings[(game_time,name)],) for game_time,game_id, name, rank in result]
    ranks = [rank for game_time,game_id, name, rank in result]
    transformed_groups = rate(rating_groups, ranks=ranks)
    for x, (game_time,game_id, name, rank) in enumerate(result):
        ratings[(game_time,name)], = transformed_groups[x]

pprint(dict(ratings))
...