1 import json
2 import os.path
3
4 from nflgame import OrderedDict
5 import nflgame.seq
6 import nflgame.statmap
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
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 """
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):
50
51 - def plays(self, year, week=None):
58
60 return '%s (%s, %s)' % (self.name, self.position, self.team)
61
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
77 return '%s Defense' % self.team
78
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
115 return self.__dict__.get(cat, False)
116
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
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
138 """
139 Returns a dict of all stats for the player.
140 """
141 return self._stats
142
151
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
159 """
160 Simply returns the player's name, e.g., "T.Brady".
161 """
162 return self.name
163
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
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:
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
220
223 - def __init__(self, playerid, name, home):
226
231
235