scraping-rtn 0.0.6.1__py3-none-any.whl → 0.0.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of scraping-rtn might be problematic. Click here for more details.

@@ -15,7 +15,10 @@ class RtnSingleTeamYear(object):
15
15
  else:
16
16
  self.team_id = team_id
17
17
 
18
- def get_team_mapping(self):
18
+ def get_team_mapping(self, force_update=False):
19
+ if force_update:
20
+ get_data_from_api.cache_clear()
21
+
19
22
  all_teams_data = get_data_from_api(endpoint='gymnasts2', suffix=str(self.year) + '/1').json()
20
23
  return {team['team_name']: team['id'] for team in all_teams_data['teams']}
21
24
 
@@ -32,19 +35,22 @@ class RtnSingleTeamYear(object):
32
35
  # else:
33
36
  # raise ValueError(f'{self.team_name} does not exist in data for {self.year}')
34
37
 
35
- def _get_raw_roster(self):
38
+ def _get_raw_roster(self, force_update=False):
36
39
  rename_map = {'id': 'Gymnast ID', 'hometown': 'Hometown', 'school_year': 'School Year', 'events': 'Events'}
37
40
  school_year_map = {'1': 'FR', '2': 'SO', '3': 'JR', '4': 'SR'}
38
41
 
42
+ if force_update:
43
+ get_data_from_api.cache_clear()
44
+
39
45
  roster_data = get_data_from_api(endpoint='rostermain', suffix=str(self.year)+'/'+str(self.team_id)+'/1').json()
40
46
 
41
47
  self._raw_roster = [{**{rename_map.get(k, k): v if k != 'school_year' else school_year_map.get(v, '') for k, v in data.items()},
42
48
  **{'Name': data['fname'] + ' ' + data['lname'], 'Team': self.team_name}}
43
49
  for data in roster_data]
44
50
 
45
- def get_roster(self, include_hometowns=False, include_class=False, include_events=False):
51
+ def get_roster(self, include_hometowns=False, include_class=False, include_events=False, force_update=False):
46
52
  if not hasattr(self, 'raw_roster'):
47
- self._get_raw_roster()
53
+ self._get_raw_roster(force_update=force_update)
48
54
 
49
55
  extra_cols = get_extra_cols(include_hometowns=include_hometowns, include_class=include_class, include_events=include_events)
50
56
 
@@ -56,7 +62,10 @@ class RtnSingleTeamYear(object):
56
62
 
57
63
  return self.roster
58
64
 
59
- def _get_raw_season_results(self):
65
+ def _get_raw_season_results(self, force_update=False):
66
+ if force_update:
67
+ get_data_from_api.cache_clear()
68
+
60
69
  meets = get_data_from_api(endpoint='dashboard', suffix=str(self.year)+'/'+str(self.team_id)).json()
61
70
  name_map = {'team_id': 'Team ID', 'team_name': 'Team', 'meet_id': 'Team Meet ID',
62
71
  'meet_date': 'Meet Date', 'team_score': 'Score', 'home': 'Home/Away',
@@ -67,9 +76,9 @@ class RtnSingleTeamYear(object):
67
76
  for k, v in data.items() if k != 'jas'} for data in meets['meets'] if data['team_name'] == self.team_name]
68
77
  self._raw_schedule = [{k: v for k, v in data.items() if k not in ('Score', 'VT', 'UB', 'BB', 'FX')} for data in self._raw_season_results]
69
78
 
70
- def get_schedule(self):
79
+ def get_schedule(self, force_update=False):
71
80
  if not hasattr(self, '_raw_schedule'):
72
- self._get_raw_season_results()
81
+ self._get_raw_season_results(force_update=force_update)
73
82
 
74
83
  if len(self._raw_schedule) > 0:
75
84
  return pd.DataFrame(self._raw_schedule)
@@ -91,14 +100,14 @@ class RtnSingleTeamYear(object):
91
100
  * Uses team meet id to join back to meet info, such as opponent, etc.
92
101
  """
93
102
  if not hasattr(self, '_raw_season_results'):
94
- self._get_raw_season_results()
103
+ self._get_raw_season_results(force_update=force_update)
95
104
 
96
105
  if len(self._raw_season_results) > 0:
97
106
  if (len({'VT', 'UB', 'BB', 'FX'}.intersection(self._raw_season_results[0].keys())) != 4 or force_update):
98
107
  if method == 'team_consistency':
99
- self._team_event_scores_team_consistency()
108
+ self._team_event_scores_team_consistency(force_update=force_update)
100
109
  elif method == 'by_meet':
101
- self._team_event_scores_by_meet()
110
+ self._team_event_scores_by_meet(force_update=force_update)
102
111
  else:
103
112
  raise ValueError('Method must be "team_consistency" or "by_meet"')
104
113
 
@@ -109,10 +118,13 @@ class RtnSingleTeamYear(object):
109
118
 
110
119
  return self.season_results
111
120
 
112
- def _team_event_scores_by_meet(self):
121
+ def _team_event_scores_by_meet(self, force_update=False):
113
122
  team_scores_all = []
114
123
  for meet_id in [data['Team Meet ID'] for data in self._raw_season_results if data['Meet Date'] <= datetime.now()]:
115
124
  try:
125
+ if force_update:
126
+ get_data_from_api.cache_clear()
127
+
116
128
  meet_res = get_data_from_api(endpoint='meetresults', suffix=str(meet_id)).json()
117
129
  # This API call returns scores from all teams at this meet, not just this team. Need to pick out correct score
118
130
  team_scores = [score for score in meet_res['teams'] if score['tname'] == self.team_name and score['mid'] == str(meet_id)]
@@ -128,7 +140,10 @@ class RtnSingleTeamYear(object):
128
140
  for i in range(len(self._raw_season_results)):
129
141
  self._raw_season_results[i].update({'VT': np.nan, 'UB': np.nan, 'BB': np.nan, 'FX': np.nan})
130
142
 
131
- def _team_event_scores_team_consistency(self):
143
+ def _team_event_scores_team_consistency(self, force_update=False):
144
+ if force_update:
145
+ get_data_from_api.cache_clear()
146
+
132
147
  res = get_data_from_api(endpoint='teamConsistency', suffix=f'{self.year}/{self.team_id}').json()
133
148
  if len(res['labels']) == 0:
134
149
  print(f'No team consistency data found for {self.team_name} in {self.year}')
@@ -164,18 +179,21 @@ class RtnSingleTeamYear(object):
164
179
  if not hasattr(self, '_raw_roster'):
165
180
  self.get_roster()
166
181
 
167
- self._individual_scores_individual_consistency()
182
+ self._individual_scores_individual_consistency(force_update=force_update)
168
183
  elif method == 'by_meet':
169
- self._individual_scores_by_meet()
184
+ self._individual_scores_by_meet(force_update=force_update)
170
185
  else:
171
186
  raise ValueError('Method must be "individual_consistency" or "by_meet"')
172
187
 
173
188
  return self.individual_results
174
189
 
175
- def _individual_scores_by_meet(self):
190
+ def _individual_scores_by_meet(self, force_update=False):
176
191
  individual_scores_all = []
177
192
  for meet_id in [meet['Team Meet ID'] for meet in self._raw_schedule if meet['Meet Date'] <= datetime.now()]:
178
193
  try:
194
+ if force_update:
195
+ get_data_from_api.cache_clear()
196
+
179
197
  meet_res = get_data_from_api(endpoint='meetresults', suffix=str(meet_id)).json()
180
198
  if len(meet_res) == 0 or len(meet_res['scores']) == 0 or len(meet_res['scores'][0]) == 0:
181
199
  print(f'No data found for meet {meet_id}')
@@ -211,10 +229,13 @@ class RtnSingleTeamYear(object):
211
229
  'Team ID', 'Team', 'Team Meet ID', 'Home/Away', 'Opponents',
212
230
  'Meet Name', 'Meet ID'])
213
231
 
214
- def _individual_scores_individual_consistency(self):
232
+ def _individual_scores_individual_consistency(self, force_update=False):
215
233
  ind_consistency_all = []
216
234
  for gymnast in self._raw_roster:
217
235
  try:
236
+ if force_update:
237
+ get_data_from_api.cache_clear()
238
+
218
239
  res = get_data_from_api(endpoint='indConsistency', suffix=f"{self.year}/{gymnast['Gymnast ID']}").json()
219
240
  ind_consistency = [{'Meet Date': normalize_date(res['labels'][i][:7] + str(self.year), dt_format='%b-%d-%Y'),
220
241
  'VT': round(float(res['vts'][i]), 4) if res['vts'][i] is not None else np.nan,
@@ -236,22 +257,24 @@ class RtnSingleTeamYear(object):
236
257
  else:
237
258
  self.individual_results = pd.DataFrame(columns=SCHEDULE_COLS + IND_RESULTS_COLS)
238
259
 
239
- def get_individual_nqs(self):
260
+ def get_individual_nqs(self, force_update=False):
240
261
  if not hasattr(self, '_raw_roster'):
241
- self._get_raw_roster()
262
+ self._get_raw_roster(force_update=force_update)
242
263
 
243
264
  if not hasattr(self, '_raw_individual_nqs'):
244
- self._get_raw_individual_nqs()
265
+ self._get_raw_individual_nqs(force_update=force_update)
245
266
 
246
267
  if len(self._raw_individual_nqs) > 0:
247
268
  return pd.DataFrame(self._raw_individual_nqs)
248
269
  else:
249
270
  return pd.DataFrame(columns=ROSTER_COLS + EVENTS) # + ['AA'])
250
271
 
251
- def _get_raw_individual_nqs(self):
272
+ def _get_raw_individual_nqs(self, force_update=False):
252
273
  name_map = {'maxv': 'VT', 'maxub': 'UB', 'maxbb': 'BB', 'maxfx': 'FX',
253
274
  # 'maxaa': 'AA',
254
275
  'gid': 'Gymnast ID'}
276
+ if force_update:
277
+ get_data_from_api.cache_clear()
255
278
 
256
279
  nqsData = get_data_from_api(endpoint='rostermain', suffix=f'{self.year}/{self.team_id}/4').json()
257
280
  ind_nqs = [{name_map[k]: round(float(v), 4) if k != 'gid' and v != '' else (np.nan if k != 'gid' else v)
@@ -264,18 +287,24 @@ class RtnSingleTeamYear(object):
264
287
  else:
265
288
  self._raw_individual_nqs = []
266
289
 
267
- def _get_current_week(self):
290
+ def _get_current_week(self, force_update=False):
268
291
  if not hasattr(self, 'week'):
292
+ if force_update:
293
+ get_data_from_api.cache_clear()
294
+
269
295
  week_data = get_data_from_api(endpoint='currentweek', suffix=str(self.year)).json()
270
296
  return min(int(week_data['week']), int(week_data['max']))
271
297
 
272
- def _get_raw_rankings(self, team_vs_ind, event, week):
298
+ def _get_raw_rankings(self, team_vs_ind, event, week, force_update=False):
273
299
  team_ind_map = {'team': 0, 'ind': 1}
274
300
  event_api_map = {'VT': 1, 'UB': 2, 'BB': 3, 'FX': 4, 'AA': 5}
275
301
  rename_map = {'rank': 'Rank', 'gid': 'Gymnast ID', 'team': 'Team', 'tid': 'Team ID',
276
302
  'rqs': 'NQS', 'reg': 'Region', 'con': 'Conference', 'div': 'Division',
277
303
  'usag': 'USAG', 'ave': 'Average', 'high': 'High', 'name': 'Team'}
278
304
 
305
+ if force_update:
306
+ get_data_from_api.cache_clear()
307
+
279
308
  res = get_data_from_api(endpoint='results', suffix=f'{self.year}/{week}/{team_ind_map[team_vs_ind]}/{event_api_map[event]}').json()
280
309
  if team_vs_ind == 'ind':
281
310
  self._raw_rankings[team_vs_ind][event] = [{**{rename_map.get(k): float(v) if k in ['rqs', 'ave', 'high'] else v for k, v in data.items() if k in rename_map},
@@ -286,9 +315,9 @@ class RtnSingleTeamYear(object):
286
315
  **{'Event': event}}
287
316
  for data in res['data']]
288
317
 
289
- def get_overall_rankings(self, team_vs_ind='team', event='AA', week=None):
318
+ def get_overall_rankings(self, team_vs_ind='team', event='AA', week=None, force_update=False):
290
319
  if not week:
291
- week = self._get_current_week()
320
+ week = self._get_current_week(force_update=force_update)
292
321
 
293
322
  if not hasattr(self, '_raw_rankings'):
294
323
  self._raw_rankings = {'team': {event: None for event in EVENT_MAP.values()},
@@ -300,7 +329,7 @@ class RtnSingleTeamYear(object):
300
329
  'Division', 'Conference', 'Region', 'USAG']}
301
330
 
302
331
  if self._raw_rankings[team_vs_ind][event] is None:
303
- self._get_raw_rankings(team_vs_ind=team_vs_ind, event=event, week=week)
332
+ self._get_raw_rankings(team_vs_ind=team_vs_ind, event=event, week=week, force_update=force_update)
304
333
 
305
334
  return pd.DataFrame(self._raw_rankings[team_vs_ind][event])[col_orders[team_vs_ind]]
306
335
 
scraping_rtn/__init__.py CHANGED
@@ -7,12 +7,12 @@ def save(df, filename):
7
7
  df.to_csv(filename, index=False)
8
8
 
9
9
 
10
- def all_teams(year):
10
+ def all_teams(year, force_update=False):
11
11
  rtn = RtnSingleTeamYear(year=year, team_name=None)
12
- return list(rtn.get_team_mapping().keys())
12
+ return list(rtn.get_team_mapping(force_update=force_update).keys())
13
13
 
14
14
 
15
- def roster(year, teams, include_hometowns=False, include_class=False, include_events=False, verbose=False):
15
+ def roster(year, teams, include_hometowns=False, include_class=False, include_events=False, verbose=False, force_update=False):
16
16
  teams = validate_input(teams)
17
17
 
18
18
  all_rosters = []
@@ -21,7 +21,7 @@ def roster(year, teams, include_hometowns=False, include_class=False, include_ev
21
21
  print(f'Getting roster for {team} ', end='\r' if team != teams[-1] else None)
22
22
  rtn = RtnSingleTeamYear(year=year, team_name=team)
23
23
  res = rtn.get_roster(include_hometowns=include_hometowns, include_class=include_class,
24
- include_events=include_events)
24
+ include_events=include_events, force_update=force_update)
25
25
  if verbose and len(res) == 0:
26
26
  print(f'\tNo roster found for {team}')
27
27
  all_rosters.append(res)
@@ -30,7 +30,7 @@ def roster(year, teams, include_hometowns=False, include_class=False, include_ev
30
30
  return pd.concat(all_rosters)[ROSTER_COLS + extra_cols]
31
31
 
32
32
 
33
- def schedule(year, teams, verbose=False):
33
+ def schedule(year, teams, verbose=False, force_update=False):
34
34
  teams = validate_input(teams)
35
35
 
36
36
  all_schedules = []
@@ -38,7 +38,7 @@ def schedule(year, teams, verbose=False):
38
38
  if verbose:
39
39
  print(f'Getting schedule for {team} ', end='\r' if team != teams[-1] else None)
40
40
  rtn = RtnSingleTeamYear(year=year, team_name=team)
41
- res = rtn.get_schedule()
41
+ res = rtn.get_schedule(force_update=force_update)
42
42
  if verbose and len(res) == 0:
43
43
  print(f'\tNo schedule found for {team}')
44
44
  all_schedules.append(res)
@@ -54,7 +54,7 @@ def team_results(year, teams, method='team_consistency', force_update=False, ver
54
54
  if verbose:
55
55
  print(f'Getting schedule and results for {team} ', end='\r' if team != teams[-1] else None)
56
56
  rtn = RtnSingleTeamYear(year=year, team_name=team)
57
- res = rtn.get_team_scores(method=method,force_update=force_update)
57
+ res = rtn.get_team_scores(method=method, force_update=force_update)
58
58
  if verbose and len(res) == 0:
59
59
  print(f'\tNo schedule and results found for {team}')
60
60
  all_results.append(res)
@@ -78,7 +78,7 @@ def individual_results(year, teams, method='by_meet', force_update=False, verbos
78
78
  return pd.concat(all_scores)[SCHEDULE_COLS + IND_RESULTS_COLS]
79
79
 
80
80
 
81
- def individual_nqs(year, teams, verbose=False):
81
+ def individual_nqs(year, teams, verbose=False, force_update=False):
82
82
  teams = validate_input(teams)
83
83
 
84
84
  all_nqs = []
@@ -86,7 +86,7 @@ def individual_nqs(year, teams, verbose=False):
86
86
  if verbose:
87
87
  print(f'Getting individual NQS for {team} ', end='\r' if team != teams[-1] else None)
88
88
  rtn = RtnSingleTeamYear(year=year, team_name=team)
89
- res = rtn.get_individual_nqs()
89
+ res = rtn.get_individual_nqs(force_update=force_update)
90
90
  if verbose and len(res) == 0:
91
91
  print(f'\tNo individual NQS found for {team}')
92
92
  all_nqs.append(res)
@@ -94,6 +94,6 @@ def individual_nqs(year, teams, verbose=False):
94
94
  return pd.concat(all_nqs)[ROSTER_COLS + EVENTS] # + ['AA']]
95
95
 
96
96
 
97
- def rankings(year, team_vs_ind='team', event='AA', week=None):
97
+ def rankings(year, team_vs_ind='team', event='AA', week=None, force_update=False):
98
98
  rtn = RtnSingleTeamYear(year=year, team_name=None)
99
- return rtn.get_overall_rankings(team_vs_ind=team_vs_ind, event=event, week=week)
99
+ return rtn.get_overall_rankings(team_vs_ind=team_vs_ind, event=event, week=week, force_update=force_update)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: scraping_rtn
3
- Version: 0.0.6.1
3
+ Version: 0.0.7.1
4
4
  Summary: package to scrape gymnastics data from Road To Nationals
5
5
  Author-email: Claire Harmon <ceharmon220@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/cgn-charmon/scraping_rtn
@@ -0,0 +1,8 @@
1
+ scraping_rtn/RtnSingleTeamYear.py,sha256=04vdtfmw7eEGl6h-Jb0DykqlbNX6bRcY8cs0SbAsv0I,18435
2
+ scraping_rtn/__init__.py,sha256=RWz-VwgQ2qwdJaC43J_tXrnIsgbtMgGw_k2Xoby4l9M,4055
3
+ scraping_rtn/src.py,sha256=vKWqCi9tfsJC1Di2uzHm_w0xk4ooTuzXrYtUSXG5TrI,24003
4
+ scraping_rtn-0.0.7.1.dist-info/LICENSE,sha256=hbUs8BYJhECMTIKtiPtjcfq-0fWEtLTxB42IS_SzxWk,1069
5
+ scraping_rtn-0.0.7.1.dist-info/METADATA,sha256=AZBvumI9uK27lSQX7l8bCfTqCZijz7iVIXJewod3O7k,669
6
+ scraping_rtn-0.0.7.1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
7
+ scraping_rtn-0.0.7.1.dist-info/top_level.txt,sha256=PlP9g-4WmuusQ1B-LmteQpLp-jVJdnh0BX8qAzBqDEE,13
8
+ scraping_rtn-0.0.7.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,8 +0,0 @@
1
- scraping_rtn/RtnSingleTeamYear.py,sha256=-gPmz-YGgHwaetk5PmWhsailJbQgtyoP8ox53qAyNDk,17123
2
- scraping_rtn/__init__.py,sha256=GjqUhVyBgQhCFzLaAQ4rm1pevZv5uAuEdxeyJjaRpe0,3825
3
- scraping_rtn/src.py,sha256=vKWqCi9tfsJC1Di2uzHm_w0xk4ooTuzXrYtUSXG5TrI,24003
4
- scraping_rtn-0.0.6.1.dist-info/LICENSE,sha256=hbUs8BYJhECMTIKtiPtjcfq-0fWEtLTxB42IS_SzxWk,1069
5
- scraping_rtn-0.0.6.1.dist-info/METADATA,sha256=le7_XMpLUam4y8grEmao3Sr_V2m27uU8guNMxlfnJ5s,669
6
- scraping_rtn-0.0.6.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
7
- scraping_rtn-0.0.6.1.dist-info/top_level.txt,sha256=PlP9g-4WmuusQ1B-LmteQpLp-jVJdnh0BX8qAzBqDEE,13
8
- scraping_rtn-0.0.6.1.dist-info/RECORD,,