scraping-rtn 0.0.6.0__tar.gz → 0.0.7__tar.gz
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.
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/PKG-INFO +2 -2
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/pyproject.toml +1 -1
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn/RtnSingleTeamYear.py +62 -66
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn/__init__.py +11 -11
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn/src.py +3 -6
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn.egg-info/PKG-INFO +2 -2
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/LICENSE +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/README.md +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/setup.cfg +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn.egg-info/SOURCES.txt +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn.egg-info/dependency_links.txt +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn.egg-info/requires.txt +0 -0
- {scraping_rtn-0.0.6.0 → scraping_rtn-0.0.7}/src/scraping_rtn.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: scraping_rtn
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7
|
|
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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from .src import EVENT_MAP, EVENTS,
|
|
1
|
+
from .src import EVENT_MAP, EVENTS, get_data_from_api, fix_opponents, normalize_date, merge_dicts, \
|
|
2
2
|
get_extra_cols, SCHEDULE_COLS, RESULTS_COLS, IND_RESULTS_COLS, ROSTER_COLS
|
|
3
3
|
import pandas as pd
|
|
4
4
|
import numpy as np
|
|
@@ -15,14 +15,11 @@ class RtnSingleTeamYear(object):
|
|
|
15
15
|
else:
|
|
16
16
|
self.team_id = team_id
|
|
17
17
|
|
|
18
|
-
def
|
|
19
|
-
|
|
18
|
+
def get_team_mapping(self, force_update=False):
|
|
19
|
+
if force_update:
|
|
20
|
+
get_data_from_api.clear_cache()
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
if not hasattr(self, 'session'):
|
|
23
|
-
self.connect_session()
|
|
24
|
-
|
|
25
|
-
all_teams_data = get_data_from_api(session=self.session, endpoint='gymnasts2', suffix=str(self.year) + '/1').json()
|
|
22
|
+
all_teams_data = get_data_from_api(endpoint='gymnasts2', suffix=str(self.year) + '/1').json()
|
|
26
23
|
return {team['team_name']: team['id'] for team in all_teams_data['teams']}
|
|
27
24
|
|
|
28
25
|
def get_team_id(self):
|
|
@@ -38,22 +35,22 @@ class RtnSingleTeamYear(object):
|
|
|
38
35
|
# else:
|
|
39
36
|
# raise ValueError(f'{self.team_name} does not exist in data for {self.year}')
|
|
40
37
|
|
|
41
|
-
def _get_raw_roster(self):
|
|
42
|
-
if not hasattr(self, 'session'):
|
|
43
|
-
self.connect_session()
|
|
44
|
-
|
|
38
|
+
def _get_raw_roster(self, force_update=False):
|
|
45
39
|
rename_map = {'id': 'Gymnast ID', 'hometown': 'Hometown', 'school_year': 'School Year', 'events': 'Events'}
|
|
46
40
|
school_year_map = {'1': 'FR', '2': 'SO', '3': 'JR', '4': 'SR'}
|
|
47
41
|
|
|
48
|
-
|
|
42
|
+
if force_update:
|
|
43
|
+
get_data_from_api.clear_cache()
|
|
44
|
+
|
|
45
|
+
roster_data = get_data_from_api(endpoint='rostermain', suffix=str(self.year)+'/'+str(self.team_id)+'/1').json()
|
|
49
46
|
|
|
50
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()},
|
|
51
48
|
**{'Name': data['fname'] + ' ' + data['lname'], 'Team': self.team_name}}
|
|
52
49
|
for data in roster_data]
|
|
53
50
|
|
|
54
|
-
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):
|
|
55
52
|
if not hasattr(self, 'raw_roster'):
|
|
56
|
-
self._get_raw_roster()
|
|
53
|
+
self._get_raw_roster(force_update=force_update)
|
|
57
54
|
|
|
58
55
|
extra_cols = get_extra_cols(include_hometowns=include_hometowns, include_class=include_class, include_events=include_events)
|
|
59
56
|
|
|
@@ -65,11 +62,11 @@ class RtnSingleTeamYear(object):
|
|
|
65
62
|
|
|
66
63
|
return self.roster
|
|
67
64
|
|
|
68
|
-
def _get_raw_season_results(self):
|
|
69
|
-
if
|
|
70
|
-
|
|
65
|
+
def _get_raw_season_results(self, force_update=False):
|
|
66
|
+
if force_update:
|
|
67
|
+
get_data_from_api.clear_cache()
|
|
71
68
|
|
|
72
|
-
meets = get_data_from_api(
|
|
69
|
+
meets = get_data_from_api(endpoint='dashboard', suffix=str(self.year)+'/'+str(self.team_id)).json()
|
|
73
70
|
name_map = {'team_id': 'Team ID', 'team_name': 'Team', 'meet_id': 'Team Meet ID',
|
|
74
71
|
'meet_date': 'Meet Date', 'team_score': 'Score', 'home': 'Home/Away',
|
|
75
72
|
'opponent': 'Opponents', 'meet_desc': 'Meet Name', 'linked_id': 'Meet ID'}
|
|
@@ -79,9 +76,9 @@ class RtnSingleTeamYear(object):
|
|
|
79
76
|
for k, v in data.items() if k != 'jas'} for data in meets['meets'] if data['team_name'] == self.team_name]
|
|
80
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]
|
|
81
78
|
|
|
82
|
-
def get_schedule(self):
|
|
79
|
+
def get_schedule(self, force_update=False):
|
|
83
80
|
if not hasattr(self, '_raw_schedule'):
|
|
84
|
-
self._get_raw_season_results()
|
|
81
|
+
self._get_raw_season_results(force_update=force_update)
|
|
85
82
|
|
|
86
83
|
if len(self._raw_schedule) > 0:
|
|
87
84
|
return pd.DataFrame(self._raw_schedule)
|
|
@@ -103,14 +100,14 @@ class RtnSingleTeamYear(object):
|
|
|
103
100
|
* Uses team meet id to join back to meet info, such as opponent, etc.
|
|
104
101
|
"""
|
|
105
102
|
if not hasattr(self, '_raw_season_results'):
|
|
106
|
-
self._get_raw_season_results()
|
|
103
|
+
self._get_raw_season_results(force_update=force_update)
|
|
107
104
|
|
|
108
105
|
if len(self._raw_season_results) > 0:
|
|
109
106
|
if (len({'VT', 'UB', 'BB', 'FX'}.intersection(self._raw_season_results[0].keys())) != 4 or force_update):
|
|
110
107
|
if method == 'team_consistency':
|
|
111
|
-
self._team_event_scores_team_consistency()
|
|
108
|
+
self._team_event_scores_team_consistency(force_update=force_update)
|
|
112
109
|
elif method == 'by_meet':
|
|
113
|
-
self._team_event_scores_by_meet()
|
|
110
|
+
self._team_event_scores_by_meet(force_update=force_update)
|
|
114
111
|
else:
|
|
115
112
|
raise ValueError('Method must be "team_consistency" or "by_meet"')
|
|
116
113
|
|
|
@@ -121,14 +118,14 @@ class RtnSingleTeamYear(object):
|
|
|
121
118
|
|
|
122
119
|
return self.season_results
|
|
123
120
|
|
|
124
|
-
def _team_event_scores_by_meet(self):
|
|
125
|
-
if not hasattr(self, 'session'):
|
|
126
|
-
self.connect_session()
|
|
127
|
-
|
|
121
|
+
def _team_event_scores_by_meet(self, force_update=False):
|
|
128
122
|
team_scores_all = []
|
|
129
123
|
for meet_id in [data['Team Meet ID'] for data in self._raw_season_results if data['Meet Date'] <= datetime.now()]:
|
|
130
124
|
try:
|
|
131
|
-
|
|
125
|
+
if force_update:
|
|
126
|
+
get_data_from_api.clear_cache()
|
|
127
|
+
|
|
128
|
+
meet_res = get_data_from_api(endpoint='meetresults', suffix=str(meet_id)).json()
|
|
132
129
|
# This API call returns scores from all teams at this meet, not just this team. Need to pick out correct score
|
|
133
130
|
team_scores = [score for score in meet_res['teams'] if score['tname'] == self.team_name and score['mid'] == str(meet_id)]
|
|
134
131
|
assert len(team_scores) == 1, 'Multiple team scores??'
|
|
@@ -143,11 +140,11 @@ class RtnSingleTeamYear(object):
|
|
|
143
140
|
for i in range(len(self._raw_season_results)):
|
|
144
141
|
self._raw_season_results[i].update({'VT': np.nan, 'UB': np.nan, 'BB': np.nan, 'FX': np.nan})
|
|
145
142
|
|
|
146
|
-
def _team_event_scores_team_consistency(self):
|
|
147
|
-
if
|
|
148
|
-
|
|
143
|
+
def _team_event_scores_team_consistency(self, force_update=False):
|
|
144
|
+
if force_update:
|
|
145
|
+
get_data_from_api.clear_cache()
|
|
149
146
|
|
|
150
|
-
res = get_data_from_api(
|
|
147
|
+
res = get_data_from_api(endpoint='teamConsistency', suffix=f'{self.year}/{self.team_id}').json()
|
|
151
148
|
if len(res['labels']) == 0:
|
|
152
149
|
print(f'No team consistency data found for {self.team_name} in {self.year}')
|
|
153
150
|
for i in range(len(self._raw_season_results)):
|
|
@@ -182,22 +179,22 @@ class RtnSingleTeamYear(object):
|
|
|
182
179
|
if not hasattr(self, '_raw_roster'):
|
|
183
180
|
self.get_roster()
|
|
184
181
|
|
|
185
|
-
self._individual_scores_individual_consistency()
|
|
182
|
+
self._individual_scores_individual_consistency(force_update=force_update)
|
|
186
183
|
elif method == 'by_meet':
|
|
187
|
-
self._individual_scores_by_meet()
|
|
184
|
+
self._individual_scores_by_meet(force_update=force_update)
|
|
188
185
|
else:
|
|
189
186
|
raise ValueError('Method must be "individual_consistency" or "by_meet"')
|
|
190
187
|
|
|
191
188
|
return self.individual_results
|
|
192
189
|
|
|
193
|
-
def _individual_scores_by_meet(self):
|
|
194
|
-
if not hasattr(self, 'session'):
|
|
195
|
-
self.connect_session()
|
|
196
|
-
|
|
190
|
+
def _individual_scores_by_meet(self, force_update=False):
|
|
197
191
|
individual_scores_all = []
|
|
198
192
|
for meet_id in [meet['Team Meet ID'] for meet in self._raw_schedule if meet['Meet Date'] <= datetime.now()]:
|
|
199
193
|
try:
|
|
200
|
-
|
|
194
|
+
if force_update:
|
|
195
|
+
get_data_from_api.clear_cache()
|
|
196
|
+
|
|
197
|
+
meet_res = get_data_from_api(endpoint='meetresults', suffix=str(meet_id)).json()
|
|
201
198
|
if len(meet_res) == 0 or len(meet_res['scores']) == 0 or len(meet_res['scores'][0]) == 0:
|
|
202
199
|
print(f'No data found for meet {meet_id}')
|
|
203
200
|
continue
|
|
@@ -232,14 +229,14 @@ class RtnSingleTeamYear(object):
|
|
|
232
229
|
'Team ID', 'Team', 'Team Meet ID', 'Home/Away', 'Opponents',
|
|
233
230
|
'Meet Name', 'Meet ID'])
|
|
234
231
|
|
|
235
|
-
def _individual_scores_individual_consistency(self):
|
|
236
|
-
if not hasattr(self, 'session'):
|
|
237
|
-
self.connect_session()
|
|
238
|
-
|
|
232
|
+
def _individual_scores_individual_consistency(self, force_update=False):
|
|
239
233
|
ind_consistency_all = []
|
|
240
234
|
for gymnast in self._raw_roster:
|
|
241
235
|
try:
|
|
242
|
-
|
|
236
|
+
if force_update:
|
|
237
|
+
get_data_from_api.clear_cache()
|
|
238
|
+
|
|
239
|
+
res = get_data_from_api(endpoint='indConsistency', suffix=f"{self.year}/{gymnast['Gymnast ID']}").json()
|
|
243
240
|
ind_consistency = [{'Meet Date': normalize_date(res['labels'][i][:7] + str(self.year), dt_format='%b-%d-%Y'),
|
|
244
241
|
'VT': round(float(res['vts'][i]), 4) if res['vts'][i] is not None else np.nan,
|
|
245
242
|
'UB': round(float(res['ubs'][i]), 4) if res['ubs'][i] is not None else np.nan,
|
|
@@ -260,27 +257,26 @@ class RtnSingleTeamYear(object):
|
|
|
260
257
|
else:
|
|
261
258
|
self.individual_results = pd.DataFrame(columns=SCHEDULE_COLS + IND_RESULTS_COLS)
|
|
262
259
|
|
|
263
|
-
def get_individual_nqs(self):
|
|
260
|
+
def get_individual_nqs(self, force_update=False):
|
|
264
261
|
if not hasattr(self, '_raw_roster'):
|
|
265
|
-
self._get_raw_roster()
|
|
262
|
+
self._get_raw_roster(force_update=force_update)
|
|
266
263
|
|
|
267
264
|
if not hasattr(self, '_raw_individual_nqs'):
|
|
268
|
-
self._get_raw_individual_nqs()
|
|
265
|
+
self._get_raw_individual_nqs(force_update=force_update)
|
|
269
266
|
|
|
270
267
|
if len(self._raw_individual_nqs) > 0:
|
|
271
268
|
return pd.DataFrame(self._raw_individual_nqs)
|
|
272
269
|
else:
|
|
273
270
|
return pd.DataFrame(columns=ROSTER_COLS + EVENTS) # + ['AA'])
|
|
274
271
|
|
|
275
|
-
def _get_raw_individual_nqs(self):
|
|
276
|
-
if not hasattr(self, 'session'):
|
|
277
|
-
self.connect_session()
|
|
278
|
-
|
|
272
|
+
def _get_raw_individual_nqs(self, force_update=False):
|
|
279
273
|
name_map = {'maxv': 'VT', 'maxub': 'UB', 'maxbb': 'BB', 'maxfx': 'FX',
|
|
280
274
|
# 'maxaa': 'AA',
|
|
281
275
|
'gid': 'Gymnast ID'}
|
|
276
|
+
if force_update:
|
|
277
|
+
get_data_from_api.clear_cache()
|
|
282
278
|
|
|
283
|
-
nqsData = get_data_from_api(
|
|
279
|
+
nqsData = get_data_from_api(endpoint='rostermain', suffix=f'{self.year}/{self.team_id}/4').json()
|
|
284
280
|
ind_nqs = [{name_map[k]: round(float(v), 4) if k != 'gid' and v != '' else (np.nan if k != 'gid' else v)
|
|
285
281
|
for k, v in data.items() if k in name_map.keys()} for data in nqsData['ind']]
|
|
286
282
|
|
|
@@ -291,25 +287,25 @@ class RtnSingleTeamYear(object):
|
|
|
291
287
|
else:
|
|
292
288
|
self._raw_individual_nqs = []
|
|
293
289
|
|
|
294
|
-
def _get_current_week(self):
|
|
295
|
-
if not hasattr(self, 'session'):
|
|
296
|
-
self.connect_session()
|
|
297
|
-
|
|
290
|
+
def _get_current_week(self, force_update=False):
|
|
298
291
|
if not hasattr(self, 'week'):
|
|
299
|
-
|
|
300
|
-
|
|
292
|
+
if force_update:
|
|
293
|
+
get_data_from_api.clear_cache()
|
|
301
294
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
self.connect_session()
|
|
295
|
+
week_data = get_data_from_api(endpoint='currentweek', suffix=str(self.year)).json()
|
|
296
|
+
return min(int(week_data['week']), int(week_data['max']))
|
|
305
297
|
|
|
298
|
+
def _get_raw_rankings(self, team_vs_ind, event, week, force_update=False):
|
|
306
299
|
team_ind_map = {'team': 0, 'ind': 1}
|
|
307
300
|
event_api_map = {'VT': 1, 'UB': 2, 'BB': 3, 'FX': 4, 'AA': 5}
|
|
308
301
|
rename_map = {'rank': 'Rank', 'gid': 'Gymnast ID', 'team': 'Team', 'tid': 'Team ID',
|
|
309
302
|
'rqs': 'NQS', 'reg': 'Region', 'con': 'Conference', 'div': 'Division',
|
|
310
303
|
'usag': 'USAG', 'ave': 'Average', 'high': 'High', 'name': 'Team'}
|
|
311
304
|
|
|
312
|
-
|
|
305
|
+
if force_update:
|
|
306
|
+
get_data_from_api.clear_cache()
|
|
307
|
+
|
|
308
|
+
res = get_data_from_api(endpoint='results', suffix=f'{self.year}/{week}/{team_ind_map[team_vs_ind]}/{event_api_map[event]}').json()
|
|
313
309
|
if team_vs_ind == 'ind':
|
|
314
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},
|
|
315
311
|
**{'Name': data['fname'] + ' ' + data['lname'], 'Event': event}}
|
|
@@ -319,9 +315,9 @@ class RtnSingleTeamYear(object):
|
|
|
319
315
|
**{'Event': event}}
|
|
320
316
|
for data in res['data']]
|
|
321
317
|
|
|
322
|
-
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):
|
|
323
319
|
if not week:
|
|
324
|
-
week = self._get_current_week()
|
|
320
|
+
week = self._get_current_week(force_update=force_update)
|
|
325
321
|
|
|
326
322
|
if not hasattr(self, '_raw_rankings'):
|
|
327
323
|
self._raw_rankings = {'team': {event: None for event in EVENT_MAP.values()},
|
|
@@ -333,7 +329,7 @@ class RtnSingleTeamYear(object):
|
|
|
333
329
|
'Division', 'Conference', 'Region', 'USAG']}
|
|
334
330
|
|
|
335
331
|
if self._raw_rankings[team_vs_ind][event] is None:
|
|
336
|
-
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)
|
|
337
333
|
|
|
338
334
|
return pd.DataFrame(self._raw_rankings[team_vs_ind][event])[col_orders[team_vs_ind]]
|
|
339
335
|
|
|
@@ -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)
|
|
@@ -21,21 +21,18 @@ def validate_input(teams):
|
|
|
21
21
|
return teams
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
@lru_cache(maxsize=1000000)
|
|
25
|
+
def get_data_from_api(endpoint, suffix):
|
|
25
26
|
session = requests.Session()
|
|
26
27
|
retry = Retry(connect=3, backoff_factor=0.5)
|
|
27
28
|
adapter = HTTPAdapter(max_retries=retry)
|
|
28
29
|
session.mount('http://', adapter)
|
|
29
30
|
session.mount('https://', adapter)
|
|
30
31
|
|
|
31
|
-
return session
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@lru_cache(maxsize=1000000)
|
|
35
|
-
def get_data_from_api(session, endpoint, suffix):
|
|
36
32
|
url = 'https://www.roadtonationals.com/api/women/' + endpoint
|
|
37
33
|
if suffix:
|
|
38
34
|
url += '/' + suffix
|
|
35
|
+
|
|
39
36
|
return session.get(url)
|
|
40
37
|
|
|
41
38
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: scraping_rtn
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|