Added winrate over time statistic

This commit is contained in:
Yarne Coppens 2024-08-24 20:42:22 +02:00
parent 96a8f21af1
commit 0b412b8951
3 changed files with 47 additions and 3 deletions

View file

@ -21,7 +21,7 @@ class GamesStatistic(StatisticBase):
} }
class TimeLineStatistic(StatisticBase): class TimeLineStatistic(StatisticBase):
result: Dict[Union[date, int], int] result: Dict[Union[date, int], Union[int, float]]
model_config = { model_config = {
'validate_assignment':True 'validate_assignment':True

View file

@ -218,3 +218,10 @@ def get_winrate(player_name: str | None = None, session: Session = Depends(get_s
statistic_to_return = statistic_creator.get_winrate(session, player_name) statistic_to_return = statistic_creator.get_winrate(session, player_name)
return statistic_to_return 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

View file

@ -180,3 +180,40 @@ def get_winrate(session: Session, player_name: str | None = None):
return statistic_to_return return statistic_to_return
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