Source code for pbpstats.resources.possessions.possessions

"""
The ``Possessions`` class has some basic properties for aggregating possession stats
"""
from itertools import groupby
from operator import itemgetter

from pbpstats import KEYS_OFF_BY_FACTOR_OF_5_WHEN_AGGREGATING_FOR_TEAM_AND_LINEUPS
from pbpstats.resources.base import Base


[docs]class Possessions(Base): """ Class for possession items :param list items: list of :obj:`~pbpstats.resources.possessions.possession.Possession` items, typically from a possession data loader """ def __init__(self, items): self.items = items @property def data(self): """ returns possessions dict """ return self.__dict__ def _aggregate_event_stats(self, *args): stats = [ event_stat for item in self.items for event in item.events for event_stat in event.event_stats ] grouper = itemgetter(*args) results = [] for key, grp in groupby(sorted(stats, key=grouper), grouper): temp_dict = dict(zip([*args], key)) value = sum(item["stat_value"] for item in grp) if ( temp_dict["stat_key"] in KEYS_OFF_BY_FACTOR_OF_5_WHEN_AGGREGATING_FOR_TEAM_AND_LINEUPS and "player_id" not in args ): # since stat keys are summed up from player stats # team and lineup stats will need some stats to be divided by 5 value = value / 5 temp_dict["stat_value"] = ( value if isinstance(value, int) else round(value, 1) ) results.append(temp_dict) return results @property def team_stats(self): """ returns list of dicts with aggregated stats by team """ return self._aggregate_event_stats("team_id", "stat_key") @property def opponent_stats(self): """ returns list of dicts with aggregated stats by opponent """ return self._aggregate_event_stats("opponent_team_id", "stat_key") @property def player_stats(self): """ returns list of dicts with aggregated stats by player """ return self._aggregate_event_stats("player_id", "team_id", "stat_key") @property def lineup_stats(self): """ returns list of dicts with aggregated stats by lineup """ return self._aggregate_event_stats("lineup_id", "team_id", "stat_key") @property def lineup_opponent_stats(self): """ returns list of dicts with aggregated stats by lineup opponent """ return self._aggregate_event_stats( "opponent_lineup_id", "opponent_team_id", "stat_key" )