см. Вопрос ниже 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(),
.......}