add team statistics

This commit is contained in:
Maximilian Keßler 2023-11-20 17:49:52 +01:00
parent 92f8e124bf
commit b832a3aa5c
Signed by: max
GPG key ID: BCC5A619923C0BA5
2 changed files with 54 additions and 7 deletions

2
bdr.py
View file

@ -13,7 +13,7 @@ def analyze_game(instance: HanabLiveInstance, actions: List[Action]) -> Tuple[Li
discard = instance.deck[action.target]
if not game.is_trash(discard):
if game.is_critical(discard):
termination = 'Discard crit'
termination = 'Discard crit' if action.type == ActionType.Discard else 'Bomb crit'
break
if discard.rank != 1:
if discard in game.deck[game.progress:]:

View file

@ -3,7 +3,7 @@ import requests_cache
import json
import csv
import pandas
from typing import List, Optional
from typing import List, Optional, Dict
from pathlib import Path
from hanabi.database import global_db_connection_manager
@ -73,7 +73,7 @@ def get_player_games(player: str):
return json.loads(r.text)
def collect_player_games():
def collect_player_games() -> Dict[int, Entry]:
global_games = {}
for player in player_mapping.keys():
print('Parsing games for player {}'.format(player))
@ -201,9 +201,7 @@ def make_endgame_tables(ids: List[int], strategy: Optional[str] = None):
x.to_html(Path(filename).with_suffix('.html'), escape=False)
def make_results_table(games):
analysis = analyze_games(games)
def make_results_table(games, analysis):
streaks = {}
fieldnames = ['Game ID', 'Seed', 'Player #', 'Result', 'BDR']
fieldnames += sort_players_by_num_games(games)
@ -243,6 +241,51 @@ def make_results_table(games):
a.to_html("out/games.html", escape=False)
def make_team_table(games, analysis):
stats = {3: {}, 4: {}, 5: {}}
for game_id, entry in games.items():
normalized_players = sorted(map(lambda player: player_mapping.get(player, 'Other'), entry.players))
if 'Other' in normalized_players:
continue
num_p = len(normalized_players)
key = ", ".join(normalized_players)
bdr, termination = analysis[game_id]
if key not in stats[num_p]:
stats[num_p][key] = {
'Games': 0,
'BDR': 0,
'Win': 0,
'Discard crit': 0,
'Bomb crit': 0,
'Strikeout': 0,
'VTK': 0,
'Lost Endgame': 0
}
stats[num_p][key]['Games'] += 1
stats[num_p][key]['BDR'] += len(bdr)
if entry.won:
stats[num_p][key]['Win'] += 1
else:
stats[num_p][key][termination] += 1
for num_p in range(3, 6):
filename = Path('out/teams_{}.csv'.format(num_p))
with open(filename, 'w') as f:
writer = csv.DictWriter(f, fieldnames=['Team', 'Games', 'Win', 'BDR', 'Discard crit', 'Bomb crit', 'Strikeout', 'VTK', 'Lost Endgame'])
writer.writeheader()
for team, row in sorted(stats[num_p].items(), key=lambda item: -item[1]['Games']):
row['Team'] = team
writer.writerow(row)
x = pandas.read_csv(filename)
x.to_html(filename.with_suffix('.html'))
def create_replay_links(ids: List[int], strategy: str):
outfile = Path('out/{}_links.csv'.format(strategy))
with open(outfile, 'w') as f:
@ -263,10 +306,14 @@ def create_replay_links(ids: List[int], strategy: str):
def main():
games = collect_player_games()
analysis = analyze_games(games)
game_ids = sorted(int(key) for key in games.keys())
# This is the main table, tracking streaks, loss reasons, BDRs
make_results_table(games)
make_results_table(games, analysis)
# This tracks team statistics
make_team_table(games, analysis)
# Additional endgame analysis stats:
# For the real games