wsba-hockey 1.0.4__py3-none-any.whl → 1.0.6__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.
wsba_hockey/__init__.py CHANGED
@@ -1 +1 @@
1
- from .wsba_main import nhl_scrape_game,nhl_scrape_schedule,nhl_scrape_season,nhl_scrape_seasons_info,nhl_scrape_standings,nhl_scrape_roster,nhl_scrape_draft_rankings,nhl_scrape_prospects,nhl_calculate_stats,nhl_shooting_impacts,nhl_plot_skaters_shots,nhl_plot_games,repo_load_rosters,repo_load_schedule,repo_load_teaminfo,repo_load_pbp,repo_load_seasons
1
+ from wsba_hockey.wsba_main import nhl_scrape_game,nhl_scrape_schedule,nhl_scrape_season,nhl_scrape_seasons_info,nhl_scrape_standings,nhl_scrape_roster,nhl_scrape_draft_rankings,nhl_scrape_prospects,nhl_calculate_stats,nhl_shooting_impacts,nhl_apply_xG,nhl_plot_skaters_shots,nhl_plot_games,repo_load_rosters,repo_load_schedule,repo_load_teaminfo,repo_load_pbp,repo_load_seasons
@@ -1,6 +1,5 @@
1
1
  import pandas as pd
2
2
  import numpy as np
3
- import wsba_hockey as wsba
4
3
  from urllib.parse import *
5
4
  from shiny import *
6
5
  from shinywidgets import output_widget, render_widget
wsba_hockey/tools/agg.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import numpy as np
3
- from .xg_model import *
3
+ from wsba_hockey.tools.xg_model import *
4
4
 
5
5
  ## AGGREGATE FUNCTIONS ##
6
6
 
@@ -1,14 +1,16 @@
1
1
  import matplotlib.pyplot as plt
2
- import matplotlib.image as mpimg
3
2
  import numpy as np
4
3
  import pandas as pd
5
- from scipy.interpolate import griddata
6
- from scipy.ndimage import gaussian_filter
7
- import urllib.request
8
- import PIL
9
- from .xg_model import *
10
4
  from hockey_rink import NHLRink
11
5
  from hockey_rink import CircularImage
6
+ from scipy.interpolate import griddata
7
+ from scipy.ndimage import gaussian_filter
8
+ from wsba_hockey.tools.xg_model import *
9
+
10
+ ### PLOTTING FUNCTIONS ###
11
+ # Provided in this file are basic plotting functions for the WSBA Hockey Python package. #
12
+
13
+ ## GLOBAL VARIABLES ##
12
14
 
13
15
  event_markers = {
14
16
  'faceoff':'X',
@@ -21,6 +23,10 @@ event_markers = {
21
23
  'takeaway':'2',
22
24
  }
23
25
 
26
+ dir = os.path.dirname(os.path.realpath(__file__))
27
+ info_path = os.path.join(dir,'teaminfo\\nhl_teaminfo.csv')
28
+ img_path = os.path.join(dir,'utils\\wsba.png')
29
+
24
30
  def wsba_rink(display_range='offense',rotation = 0):
25
31
  img = 'tools/utils/wsba.png'
26
32
  rink = NHLRink(center_logo={
@@ -81,7 +87,7 @@ def plot_skater_shots(pbp, player, season, team, strengths, title = None, marker
81
87
  pbp = prep_plot_data(pbp,shots,strengths,marker_dict)
82
88
  pbp = pbp.loc[(pbp['season'].astype(str)==season)&((pbp['away_team_abbr']==team)|(pbp['home_team_abbr']==team))]
83
89
 
84
- team_data = pd.read_csv('teaminfo/nhl_teaminfo.csv')
90
+ team_data = pd.read_csv(info_path)
85
91
  team_color = list(team_data.loc[team_data['WSBA']==f'{team}{season}','Primary Color'])[0]
86
92
  team_color_2nd = list(team_data.loc[team_data['WSBA']==f'{team}{season}','Secondary Color'])[0]
87
93
 
@@ -115,7 +121,7 @@ def plot_game_events(pbp,game_id,events,strengths,marker_dict=event_markers,team
115
121
  date = list(pbp['game_date'])[0]
116
122
  season = list(pbp['season'])[0]
117
123
 
118
- team_data = pd.read_csv('teaminfo/nhl_teaminfo.csv')
124
+ team_data = pd.read_csv(info_path)
119
125
  team_info ={
120
126
  'away_color':'#000000' if list(team_data.loc[team_data['WSBA']==f'{away_abbr}{season}','Secondary Color'])[0]=='#FFFFFF' else list(team_data.loc[team_data['WSBA']==f'{away_abbr}{season}',f'{team_colors['away'].capitalize()} Color'])[0],
121
127
  'home_color': list(team_data.loc[team_data['WSBA']==f'{home_abbr}{season}',f'{team_colors['home'].capitalize()} Color'])[0],
@@ -1,12 +1,12 @@
1
1
  import re
2
- from bs4 import BeautifulSoup
3
- import requests as rs
4
- import json as json_lib
5
- from .utils.shared import *
6
- import numpy as np
7
- import pandas as pd
8
2
  import warnings
9
3
  import os
4
+ import numpy as np
5
+ import pandas as pd
6
+ import requests as rs
7
+ import json as json_lib
8
+ from bs4 import BeautifulSoup
9
+ from wsba_hockey.tools.utils.shared import *
10
10
  warnings.filterwarnings('ignore')
11
11
 
12
12
  ### SCRAPING FUNCTIONS ###
@@ -1,13 +1,14 @@
1
+ import joblib
2
+ import os
1
3
  import pandas as pd
2
4
  import numpy as np
3
5
  import xgboost as xgb
4
6
  import scipy.sparse as sp
5
- import joblib
6
- import wsba_main as wsba
7
- import tools.scraping as scraping
7
+ import wsba_hockey.wsba_main as wsba
8
+ import wsba_hockey.tools.scraping as scraping
9
+ import matplotlib.pyplot as plt
8
10
  from sklearn.calibration import calibration_curve
9
11
  from sklearn.metrics import roc_curve, auc
10
- import matplotlib.pyplot as plt
11
12
 
12
13
  ### XG_MODEL FUNCTIONS ###
13
14
  # Provided in this file are functions vital to the goal prediction model in the WSBA Hockey Python package. #
@@ -78,12 +79,18 @@ strengths = ['3v3',
78
79
  '6v4',
79
80
  '6v5']
80
81
 
82
+ dir = os.path.dirname(os.path.realpath(__file__))
83
+ roster_path = os.path.join(dir,'rosters\\nhl_rosters.csv')
84
+ xg_model_path = os.path.join(dir,'xg_model\\wsba_xg.joblib')
85
+ test_path = os.path.join(dir,'xg_model\\testing\\xg_model_training_runs.csv')
86
+ cv_path = os.path.join(dir,'xg_model\\testing\\xg_model_cv_runs.csv')
87
+
81
88
  def fix_players(pbp):
82
89
  #Add/fix player info for shooters and goaltenders
83
90
  print('Adding player info to pbp...')
84
91
 
85
92
  #Load roster and all players
86
- roster = pd.read_csv('rosters/nhl_rosters.csv').drop_duplicates(['id'])[['fullName','id','shootsCatches']]
93
+ roster = pd.read_csv(roster_path).drop_duplicates(['id'])[['fullName','id','shootsCatches']]
87
94
 
88
95
  #Some players are missing from the roster file (generally in newer seasons); add these manually
89
96
  miss = list(pbp.loc[~(pbp['event_player_1_id'].isin(list(roster['id'])))&(pbp['event_player_1_id'].notna()),'event_player_1_id'].drop_duplicates())
@@ -111,6 +118,7 @@ def fix_players(pbp):
111
118
 
112
119
  def prep_xG_data(data):
113
120
  #Prep data for xG training and calculation
121
+ data = fix_players(data)
114
122
 
115
123
  #Informal groupby
116
124
  data = data.sort_values(by=['season','game_id','period','seconds_elapsed','event_num'])
@@ -168,7 +176,7 @@ def prep_xG_data(data):
168
176
  #Return: pbp data prepared to train and calculate the xG model
169
177
  return data
170
178
 
171
- def wsba_xG(pbp, hypertune = False, train = False, model_path = "tools/xg_model/wsba_xg.joblib", train_runs = 20, cv_runs = 20):
179
+ def wsba_xG(pbp, hypertune = False, train = False, model_path = xg_model_path, train_runs = 20, cv_runs = 20):
172
180
  #Train and calculate the WSBA Expected Goals model
173
181
 
174
182
  #Add index for future merging
@@ -258,7 +266,7 @@ def wsba_xG(pbp, hypertune = False, train = False, model_path = "tools/xg_model/
258
266
  # Arrange to get best run
259
267
  best_all = best_all.sort_values(by="auc", ascending=False)
260
268
 
261
- best_all.to_csv("tools/xg_model/testing/xg_model_training_runs.csv",index=False)
269
+ best_all.to_csv(test_path,index=False)
262
270
 
263
271
  # Final parameters
264
272
  param_7_EV = {
@@ -303,11 +311,11 @@ def wsba_xG(pbp, hypertune = False, train = False, model_path = "tools/xg_model/
303
311
 
304
312
  # Clean results and sort to find the number of rounds to use and seed
305
313
  cv_final = cv_test.sort_values(by="AUC", ascending=False)
306
- cv_final.to_csv("tools/xg_model/testing/xg_model_cv_runs.csv",index=False)
314
+ cv_final.to_csv(cv_path,index=False)
307
315
  else:
308
316
  # Load previous parameters
309
- best_all = pd.read_csv('tools/xg_model/testing/xg_model_training_runs.csv')
310
- cv_final = pd.read_csv("tools/xg_model/testing/xg_model_cv_runs.csv")
317
+ best_all = pd.read_csv(test_path)
318
+ cv_final = pd.read_csv(cv_path)
311
319
 
312
320
  print('Loaded hyperparameters...')
313
321
  # Final parameters
wsba_hockey/wsba_main.py CHANGED
@@ -1,12 +1,13 @@
1
+ import random
2
+ import os
1
3
  import requests as rs
2
4
  import pandas as pd
3
5
  import time
4
- import random
5
6
  from datetime import datetime, timedelta, date
6
- from tools.scraping import *
7
- from tools.xg_model import *
8
- from tools.agg import *
9
- from tools.plotting import *
7
+ from .tools.scraping import *
8
+ from .tools.xg_model import *
9
+ from .tools.agg import *
10
+ from .tools.plotting import *
10
11
 
11
12
  ### WSBA HOCKEY ###
12
13
  ## Provided below are all integral functions in the WSBA Hockey Python package. ##
@@ -62,7 +63,7 @@ per_sixty = ['Fi','xGi','Gi','A1','A2','P1','P','OZF','NZF','DZF','FF','FA','xGF
62
63
 
63
64
  #Some games in the API are specifically known to cause errors in scraping.
64
65
  #This list is updated as frequently as necessary
65
- known_probs ={
66
+ known_probs = {
66
67
  '2007020011':'Missing shifts data for game between Chicago and Minnesota.',
67
68
  '2007021178':'Game between the Bruins and Sabres is missing data after the second period, for some reason.',
68
69
  '2008020259':'HTML data is completely missing for this game.',
@@ -105,6 +106,11 @@ standings_end = {
105
106
 
106
107
  events = ['faceoff','hit','giveaway','takeaway','blocked-shot','missed-shot','shot-on-goal','goal','penalty']
107
108
 
109
+ dir = os.path.dirname(os.path.realpath(__file__))
110
+ schedule_path = os.path.join(dir,'tools\\schedule\\schedule.csv')
111
+ info_path = os.path.join(dir,'tools\\teaminfo\\nhl_teaminfo.csv')
112
+ default_roster = os.path.join(dir,'tools\\rosters\\nhl_rosters.csv')
113
+
108
114
  ## SCRAPE FUNCTIONS ##
109
115
  def nhl_scrape_game(game_ids,split_shifts = False, remove = ['period-start','period-end','challenge','stoppage','shootout-complete','game-end'],verbose = False, sources = False, errors = False):
110
116
  #Given a set of game_ids (NHL API), return complete play-by-play information as requested
@@ -296,7 +302,7 @@ def nhl_scrape_schedule(season,start = "09-01", end = "08-01"):
296
302
  #Return: specificed schedule data
297
303
  return df
298
304
 
299
- def nhl_scrape_season(season,split_shifts = False, season_types = [2,3], remove = ['period-start','period-end','game-end','challenge','stoppage'], start = "09-01", end = "08-01", local=False, local_path = "schedule/schedule.csv", verbose = False, sources = False, errors = False):
305
+ def nhl_scrape_season(season,split_shifts = False, season_types = [2,3], remove = ['period-start','period-end','game-end','challenge','stoppage'], start = "09-01", end = "08-01", local=False, local_path = schedule_path, verbose = False, sources = False, errors = False):
300
306
  #Given season, scrape all play-by-play occuring within the season
301
307
  # param 'season' - NHL season to scrape
302
308
  # param 'split_shifts' - boolean which splits pbp and shift events if true
@@ -402,7 +408,7 @@ def nhl_scrape_roster(season):
402
408
  #Given a nhl season, return rosters for all participating teams
403
409
  # param 'season' - NHL season to scrape
404
410
  print("Scrpaing rosters for the "+ season + "season...")
405
- teaminfo = pd.read_csv("teaminfo/nhl_teaminfo.csv")
411
+ teaminfo = pd.read_csv(info_path)
406
412
 
407
413
  rosts = []
408
414
  for team in list(teaminfo['Team']):
@@ -503,8 +509,6 @@ def nhl_apply_xG(pbp):
503
509
  #param 'pbp' - play-by-play data
504
510
 
505
511
  print(f'Applying WSBA xG to model with seasons: {pbp['season'].drop_duplicates().to_list()}')
506
- #Fix player data
507
- #pbp = fix_players(pbp)
508
512
 
509
513
  #Apply xG model
510
514
  pbp = wsba_xG(pbp)
@@ -861,7 +865,7 @@ def nhl_shooting_impacts(agg,type):
861
865
  #Return: skater stats with shooting impacts
862
866
  return df
863
867
 
864
- def nhl_calculate_stats(pbp,type,season_types,game_strength,split_game=False,roster_path="rosters/nhl_rosters.csv",shot_impact=False):
868
+ def nhl_calculate_stats(pbp,type,season_types,game_strength,split_game=False,roster_path=default_roster,shot_impact=False):
865
869
  #Given play-by-play, seasonal information, game_strength, rosters, and xG model, return aggregated stats
866
870
  # param 'pbp' - play-by-play dataframe
867
871
  # param 'type' - type of stats to calculate ('skater', 'goalie', or 'team')
@@ -1179,7 +1183,7 @@ def repo_load_rosters(seasons = []):
1179
1183
  #Returns roster data from repository
1180
1184
  # param 'seasons' - list of seasons to include
1181
1185
 
1182
- data = pd.read_csv("rosters/nhl_rosters.csv")
1186
+ data = pd.read_csv(default_roster)
1183
1187
  if len(seasons)>0:
1184
1188
  data = data.loc[data['season'].isin(seasons)]
1185
1189
 
@@ -1189,7 +1193,7 @@ def repo_load_schedule(seasons = []):
1189
1193
  #Returns schedule data from repository
1190
1194
  # param 'seasons' - list of seasons to include
1191
1195
 
1192
- data = pd.read_csv("schedule/schedule.csv")
1196
+ data = pd.read_csv(schedule_path)
1193
1197
  if len(seasons)>0:
1194
1198
  data = data.loc[data['season'].isin(seasons)]
1195
1199
 
@@ -1198,7 +1202,7 @@ def repo_load_schedule(seasons = []):
1198
1202
  def repo_load_teaminfo():
1199
1203
  #Returns team data from repository
1200
1204
 
1201
- return pd.read_csv("teaminfo/nhl_teaminfo.csv")
1205
+ return pd.read_csv(info_path)
1202
1206
 
1203
1207
  def repo_load_pbp(seasons = []):
1204
1208
  #Returns play-by-play data from repository
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wsba_hockey
3
- Version: 1.0.4
3
+ Version: 1.0.6
4
4
  Summary: WeakSide Breakout's complete Python package of access to hockey data, primairly including the scraping of National Hockey League schedule, play-by-play, and shifts information.
5
5
  Author-email: Owen Singh <owenbksingh@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/owensingh38/wsba_hockey/
@@ -1,7 +1,7 @@
1
- wsba_hockey/__init__.py,sha256=QXyc8FFlCDWQuECyyEbj80ASHEbTFj4R13DOFOY9nJg,353
1
+ wsba_hockey/__init__.py,sha256=yfr8z5PA503iaIQv30ngancwT_WnsuK-tZETKlHcI0M,377
2
2
  wsba_hockey/data_pipelines.py,sha256=tqAnUL8xf-K2jYG1zeuau5GzRlgTiaHkXwER481Jkb4,7952
3
3
  wsba_hockey/workspace.py,sha256=B--BrXrY5BL3AXQYnsy4pHQGv2LG_82VtqZT0ANab30,1088
4
- wsba_hockey/wsba_main.py,sha256=DOFS1isNEDGUU-kehoH56ieVOmd7yNCTv2M8I5GBu5o,54103
4
+ wsba_hockey/wsba_main.py,sha256=NPZvcL3VTi3pMq2jd9rlgyfVgXetrwSpRJehbvldWr8,54247
5
5
  wsba_hockey/evidence/weakside-breakout/node_modules/duckdb/vendor.py,sha256=lmu0TB0rIYkAuV9-csFJgW-1hJojso_-EZpEoorUUKM,4949
6
6
  wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/flatted.py,sha256=ke8FuEflns-WlphCcQ9CC0qJqWqX3zEEuak74o6rgE8,3879
7
7
  wsba_hockey/evidence/weakside-breakout/node_modules/flatted/python/test.py,sha256=uTOn6HJd7KeY_PTRvvufv60dmvON3KWp3nnqACj8IlA,2129
@@ -104,7 +104,7 @@ wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gy
104
104
  wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_sln.py,sha256=b_Fxm-SXUCPL3Tix4EyNwZNmQ-zkeRIFFmuL0R5wFhw,5482
105
105
  wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/gyp/tools/pretty_vcproj.py,sha256=AwQrxK1F-jhjsbbT35XQjrvWNbc3IBFaKXoJogqMh_o,10633
106
106
  wsba_hockey/evidence/weakside-breakout/node_modules/sqlite3/node_modules/node-gyp/test/fixtures/test-charmap.py,sha256=5raXzaQnO2eJnrlFtlDtWftryhZX7Fj0amFW3hdSnhE,547
107
- wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/app.py,sha256=YTXM8XzpUVf5N6X5XBcNSU2cK7zp_vs1ZczVufhLe3I,12647
107
+ wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/app.py,sha256=ay8NzjfC_2bZ38tOlXKDNpF35_KPGsl6Adx13ls6yWg,12619
108
108
  wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/game_stats/name_fix.py,sha256=v7IN4JWrudeFuIsBdjLLlHsr9wU65jYi9-34pI_ZpoM,1488
109
109
  wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/app.py,sha256=53jaUv8LOerKHWD-0d-EoxogEb83YFVm6KiRdbSLlVA,4254
110
110
  wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/heatmaps/plot.py,sha256=nTVk41u8l6M3czVeyJ-3edmiIAzXY-By7meGfl5C_kE,4505
@@ -119,17 +119,17 @@ wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/app.py
119
119
  wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/plot.py,sha256=xDHLM_jcXSi5NBcQ7tWeF9yzcjNiOrHYD7C8sBfynFo,1860
120
120
  wsba_hockey/evidence/weakside-breakout/wsba_nhl_apps/wsba_nhl_apps/skater/rink_plot.py,sha256=bvU7enxqxGwo2QThNabSo1qB2vltS_0HjF95ZOYZ98I,11993
121
121
  wsba_hockey/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- wsba_hockey/tools/agg.py,sha256=SqYExI1OJGQKxKizsM6I9GhBzee7OQDz144FDbSXuFI,21392
123
- wsba_hockey/tools/plotting.py,sha256=1hyf3uyjPFOVmexolWcHJpYk6dNbRnHfdcTM0-v1oxk,5826
124
- wsba_hockey/tools/scraping.py,sha256=dmT4RymMq-TXKhcp_I8U6P8lnqRbB5R8UNw2d3RkkRk,45244
125
- wsba_hockey/tools/xg_model.py,sha256=eWEX8d_8Vj1SGyPwzQj0TDAPXrwSOwpymkon0EwBW5Q,18144
122
+ wsba_hockey/tools/agg.py,sha256=SYZDykUQFygDfRaazlBMKcfs_1eYP7GTJNpUnNKHH-8,21409
123
+ wsba_hockey/tools/plotting.py,sha256=LJ62FvqCmY2C_tbNR3NedVWy37tN_FaWmWSZ2xmhjiM,6047
124
+ wsba_hockey/tools/scraping.py,sha256=rmypleknqfS9gU-JuB5VQn5yDVwnNastoDL3YDeUCVk,45261
125
+ wsba_hockey/tools/xg_model.py,sha256=nOr_2RBijLgPmJ0TTs4wbSsORYmRqWCKRjLKDm7sAhI,18342
126
126
  wsba_hockey/tools/archive/old_scraping.py,sha256=hEjMI1RtfeZnf0RBiJFI38oXkLZ3WofeH5xqcF4pzgM,49585
127
127
  wsba_hockey/tools/utils/__init__.py,sha256=vccXhOtzARoR99fmEWU1OEI3qCIdQ9Z42AlRA_BUhrs,114
128
128
  wsba_hockey/tools/utils/config.py,sha256=D3Uk05-YTyrhfReMTTLfNI3HN_rON2uo_CDE9oER3Lg,351
129
129
  wsba_hockey/tools/utils/save_pages.py,sha256=CsyL_0n-b-4pJoUauwU3HpnCO6n69-RlBMJQBd_qGDc,4979
130
130
  wsba_hockey/tools/utils/shared.py,sha256=dH_JwZfia5fib8rksy5sW-mBp0pluBPvw37Vdr8Kap0,14211
131
- wsba_hockey-1.0.4.dist-info/licenses/LICENSE,sha256=Nr_Um1Pd5FQJTWWgm7maZArdtYMbDhzXYSwyJIZDGik,1114
132
- wsba_hockey-1.0.4.dist-info/METADATA,sha256=5oQ7ledqHC51MxvTjENNFus_etzB2NwkDCz5XvpxMhI,3542
133
- wsba_hockey-1.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
- wsba_hockey-1.0.4.dist-info/top_level.txt,sha256=acU7s3x-RZC1zGiqCOmO0g267iqCg34lzIfdmYxxGmQ,12
135
- wsba_hockey-1.0.4.dist-info/RECORD,,
131
+ wsba_hockey-1.0.6.dist-info/licenses/LICENSE,sha256=Nr_Um1Pd5FQJTWWgm7maZArdtYMbDhzXYSwyJIZDGik,1114
132
+ wsba_hockey-1.0.6.dist-info/METADATA,sha256=NHJh3evFLJ5IFGbm44LhWZ3DkqvwNLsxTNuhOi9ZzTU,3542
133
+ wsba_hockey-1.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
+ wsba_hockey-1.0.6.dist-info/top_level.txt,sha256=acU7s3x-RZC1zGiqCOmO0g267iqCg34lzIfdmYxxGmQ,12
135
+ wsba_hockey-1.0.6.dist-info/RECORD,,