From 0b412b895110ef73cf2d2599025cffe7fed07b4d Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 24 Aug 2024 20:42:22 +0200 Subject: [PATCH] Added winrate over time statistic --- src/classes/statistic_classes.py | 2 +- src/main.py | 9 +++++++- src/modules/statistic_creator.py | 39 +++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/classes/statistic_classes.py b/src/classes/statistic_classes.py index 797b27d..4288877 100644 --- a/src/classes/statistic_classes.py +++ b/src/classes/statistic_classes.py @@ -21,7 +21,7 @@ class GamesStatistic(StatisticBase): } class TimeLineStatistic(StatisticBase): - result: Dict[Union[date, int], int] + result: Dict[Union[date, int], Union[int, float]] model_config = { 'validate_assignment':True diff --git a/src/main.py b/src/main.py index 853c014..d3940a9 100644 --- a/src/main.py +++ b/src/main.py @@ -217,4 +217,11 @@ def get_shelf_of_shame(query: BoardgameFilterParams = Depends(), session: Sessio def get_winrate(player_name: str | None = None, session: Session = Depends(get_session)): statistic_to_return = statistic_creator.get_winrate(session, player_name) - return statistic_to_return \ No newline at end of file + return statistic_to_return + +@app.get('/statistics/winrate_over_time', response_model=statistic_classes.TimeLineStatistic) +def get_winrate_over_time(player_name: str, day_step: int = 1, session: Session=Depends(get_session)): + statistic_to_return = statistic_creator.get_winrate_over_time(session, player_name, day_step) + + return statistic_to_return + diff --git a/src/modules/statistic_creator.py b/src/modules/statistic_creator.py index fbe19f5..4fde7a2 100644 --- a/src/modules/statistic_creator.py +++ b/src/modules/statistic_creator.py @@ -179,4 +179,41 @@ def get_winrate(session: Session, player_name: str | None = None): return statistic_to_return - \ No newline at end of file + +def get_winrate_over_time(session: Session, player_name: str, day_step = 1): + + def daterange(start_date: date, end_date: date, day_step): + days = int((end_date - start_date).days) + for n in range(0, days, day_step): + yield start_date + timedelta(n) + + + wanted_player = data_connection.get_player(player_name, session) + all_playplayers = [playplayer for playplayer in wanted_player.playplayers] + all_playplayers.sort(key=lambda x: x.play.play_date) + + start_date = all_playplayers[0].play.play_date + + timeline_dict = {} + + for current_date in daterange(start_date, date.today(), day_step): + playplayers_at_date = list(filter(lambda playplayer: playplayer.play.play_date <= current_date, all_playplayers)) + total_games_played = len(playplayers_at_date) + total_games_won = 0 + for playplayer in playplayers_at_date: + if playplayer.has_won: + total_games_won += 1 + + timeline_dict[current_date] = total_games_won / total_games_played + + + statistic_dict = { + 'name': 'Player winrate over time', + 'result': timeline_dict + } + + statistic_to_return = statistic_classes.TimeLineStatistic.model_validate(statistic_dict) + + return statistic_to_return + +