Package nflgame :: Module player
[frames] | no frames]

Source Code for Module nflgame.player

  1  import json 
  2  import os.path 
  3   
  4  from nflgame import OrderedDict 
  5  import nflgame.seq 
  6  import nflgame.statmap 
7 8 9 -def _create_players(jsonf=None):
10 """ 11 Creates a dict of Player objects from the players.json file, keyed 12 by GSIS ids. 13 """ 14 if jsonf is None: 15 jsonf = os.path.join(os.path.split(__file__)[0], 'players.json') 16 data = json.loads(open(jsonf).read()) 17 18 players = {} 19 for playerid in data: 20 players[playerid] = Player(data[playerid]) 21 return players
22
23 24 -class Player (object):
25 """ 26 Player instances represent meta information about a single player. 27 This information includes name, team, position, status, height, 28 weight, college, jersey number, birth date, years, pro, etc. 29 30 Player information is populated from NFL.com profile pages. 31 """
32 - def __init__(self, data):
33 self.playerid = data['gsisid'] 34 self.name = data['name'] 35 self.team = data['team'] 36 self.position = data['position'] 37 self.profile_url = data['profile_url'] 38 self.number = data['number'] 39 self.status = data['status'] 40 self.weight = data['weight'] 41 self.height = data['height'] 42 self.college = data['college'] 43 self.years_pro = data['years_pro'] 44 self.birthdate = data['birthdate']
45
46 - def stats(self, year, week=None):
47 games = nflgame.games(year, week) 48 players = nflgame.combine(games).filter(playerid=self.playerid) 49 return list(players)[0]
50
51 - def plays(self, year, week=None):
52 plays = [] 53 games = nflgame.games(year, week) 54 for g in games: 55 plays += filter(lambda p: p.has_player(self.playerid), 56 list(g.drives.plays())) 57 return nflgame.seq.GenPlays(plays)
58
59 - def __str__(self):
60 return '%s (%s, %s)' % (self.name, self.position, self.team)
61
62 63 -class PlayerDefense (Player):
64 - def __init__(self, team):
65 self.playerid = None 66 self.name = team 67 self.team = team 68 self.position = 'DEF'
69
70 - def stats(self, year, week=None):
71 assert False, 'Cannot be called on a defense.'
72
73 - def plays(self, year, week=None):
74 assert False, 'Cannot be called on a defense.'
75
76 - def __str__(self):
77 return '%s Defense' % self.team
78
79 80 -class PlayerStats (object):
81 """ 82 Player represents a single player and all of his statistical categories. 83 Every player has 'playerid', 'name' and 'home' fields. 84 Additionally, depending upon which statistical categories that player 85 was involved in for the game, he'll have properties such as 'passing_tds', 86 'rushing_yds', 'defense_int' and 'kicking_fgm'. 87 88 In order to know whether a paricular player belongs to a statical category, 89 you may use the filtering methods of a player sequence or alternatively, 90 use the has_cat method with arguments like 'passing', 'rushing', 'kicking', 91 etc. (A player sequence in this case would be an instance of 92 GenPlayerStats.) 93 94 You may also inspect whether a player has a certain property by using 95 the special __dict__ attribute. For example:: 96 97 if 'passing_yds' in player.__dict__: 98 # Do something with player.passing_yds 99 """
100 - def __init__(self, playerid, name, home):
101 """ 102 Create a new Player instance with the player id (from NFL.com's 103 GameCenter), the player's name (e.g., "T.Brady") and whether the 104 player is playing in a home game or not. 105 """ 106 self.playerid = playerid 107 self.player = None 108 self.name = name 109 self.home = home 110 self._stats = OrderedDict() 111 if self.playerid in nflgame.players: 112 self.player = nflgame.players[self.playerid]
113
114 - def has_cat(self, cat):
115 return self.__dict__.get(cat, False)
116
117 - def __refresh_categories(self):
118 for cat in nflgame.statmap.categories: 119 for f in self.__dict__: 120 if f.startswith(cat): 121 self.__dict__[cat] = True 122 break
123 124 @property
125 - def tds(self):
126 """ 127 Returns the total number of touchdowns credited to this player across 128 all statistical categories. 129 """ 130 n = 0 131 for f, v in self.__dict__.iteritems(): 132 if f.endswith('tds'): 133 n += v 134 return n
135 136 @property
137 - def stats(self):
138 """ 139 Returns a dict of all stats for the player. 140 """ 141 return self._stats
142
143 - def formatted_stats(self):
144 """ 145 Returns a roughly-formatted string of all statistics for this player. 146 """ 147 s = [] 148 for stat, val in self._stats.iteritems(): 149 s.append('%s: %s' % (stat, val)) 150 return ', '.join(s)
151
152 - def _add_stats(self, stats):
153 for k, v in stats.iteritems(): 154 self.__dict__[k] = self.__dict__.get(k, 0) + v 155 self._stats[k] = self.__dict__[k] 156 self.__refresh_categories()
157
158 - def __str__(self):
159 """ 160 Simply returns the player's name, e.g., "T.Brady". 161 """ 162 return self.name
163
164 - def __add__(self, other):
165 """ 166 Adds two players together. Only two player objects that correspond 167 to the same human (i.e., GameCenter identifier) can be added together. 168 169 If two different players are added together, an assertion will 170 be raised. 171 172 The effect of adding two player objects simply corresponds to the 173 sums of all statistical values. 174 175 Note that as soon as two players have been added, the 'home' property 176 becomes undefined. 177 """ 178 assert self.playerid == other.playerid 179 assert type(self) == type(other) 180 181 new_player = self.__class__(self.playerid, self.name, None) 182 new_player._add_stats(self._stats) 183 new_player._add_stats(other._stats) 184 185 return new_player
186
187 - def __sub__(self, other):
188 assert self.playerid == other.playerid 189 assert type(self) == type(other) 190 191 new_player = GamePlayerStats(self.playerid, self.name, self.home) 192 new_player._add_stats(self._stats) 193 for bk, bv in other._stats.iteritems(): 194 if bk not in new_player._stats: # stat was taken away? ignore. 195 continue 196 197 new_player._stats[bk] -= bv 198 if new_player._stats[bk] == 0: 199 del new_player._stats[bk] 200 else: 201 new_player.__dict__[bk] = new_player._stats[bk] 202 203 anydiffs = False 204 for k, v in new_player._stats.iteritems(): 205 if v > 0: 206 anydiffs = True 207 break 208 if not anydiffs: 209 return None 210 return new_player
211
212 - def __getattr__(self, name):
213 # If name has one of the categories as a prefix, then return 214 # a default value of zero 215 for cat in nflgame.statmap.categories: 216 if name.startswith(cat): 217 return 0 218 print name 219 raise AttributeError
220
221 222 -class GamePlayerStats (PlayerStats):
223 - def __init__(self, playerid, name, home):
224 super(GamePlayerStats, self).__init__(playerid, name, home) 225 self.games = 1
226
227 - def __add__(self, other):
228 new_player = super(GamePlayerStats, self).__add__(other) 229 new_player.games = self.games + other.games 230 return new_player
231
232 233 -class PlayPlayerStats (PlayerStats):
234 pass
235