sportsball 0.4.21__tar.gz → 0.5.1__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.
Files changed (263) hide show
  1. {sportsball-0.4.21/sportsball.egg-info → sportsball-0.5.1}/PKG-INFO +29 -1
  2. {sportsball-0.4.21 → sportsball-0.5.1}/README.md +28 -0
  3. {sportsball-0.4.21 → sportsball-0.5.1}/setup.py +1 -1
  4. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/__init__.py +1 -1
  5. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_player_model.py +12 -0
  6. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_player_model.py +12 -0
  7. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +1 -1
  8. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_player_model.py +64 -0
  9. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_game_model.py +3 -1
  10. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_player_model.py +12 -0
  11. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_team_model.py +3 -1
  12. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/google/google_address_model.py +39 -9
  13. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_player_model.py +12 -0
  14. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +12 -0
  15. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/player_model.py +150 -0
  16. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_game_model.py +190 -52
  17. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_player_model.py +87 -0
  18. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_team_model.py +123 -39
  19. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/team_model.py +240 -0
  20. {sportsball-0.4.21 → sportsball-0.5.1/sportsball.egg-info}/PKG-INFO +29 -1
  21. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/combined/combined_player_model_test.py +12 -0
  22. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/combined/combined_team_model_test.py +48 -0
  23. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/player_model_test.py +12 -0
  24. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/sportsreference_player_model_test.py +12 -0
  25. sportsball-0.5.1/tests/data/sportsreference/sportsreference_team_model_test.py +353 -0
  26. sportsball-0.4.21/tests/data/sportsreference/sportsreference_team_model_test.py +0 -245
  27. {sportsball-0.4.21 → sportsball-0.5.1}/LICENSE +0 -0
  28. {sportsball-0.4.21 → sportsball-0.5.1}/MANIFEST.in +0 -0
  29. {sportsball-0.4.21 → sportsball-0.5.1}/requirements.txt +0 -0
  30. {sportsball-0.4.21 → sportsball-0.5.1}/setup.cfg +0 -0
  31. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/__main__.py +0 -0
  32. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/args.py +0 -0
  33. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/cache.py +0 -0
  34. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/__init__.py +0 -0
  35. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/address_model.py +0 -0
  36. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/__init__.py +0 -0
  37. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/__init__.py +0 -0
  38. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
  39. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
  40. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_league_model.py +0 -0
  41. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
  42. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  43. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  44. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/__init__.py +0 -0
  45. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_coach_model.py +0 -0
  46. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  47. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  48. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  49. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  50. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  51. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  52. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/combined/__init__.py +0 -0
  53. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  54. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/espn/__init__.py +0 -0
  55. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  56. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  57. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  58. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/afl/position.py +0 -0
  59. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/__init__.py +0 -0
  60. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  61. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  62. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  63. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  64. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  65. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/bet.py +0 -0
  66. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/bookie_model.py +0 -0
  67. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/coach_model.py +0 -0
  68. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/__init__.py +0 -0
  69. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_address_model.py +0 -0
  70. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_coach_model.py +0 -0
  71. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_game_model.py +0 -0
  72. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_league_model.py +0 -0
  73. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_team_model.py +0 -0
  74. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_venue_model.py +0 -0
  75. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/combined_weather_model.py +0 -0
  76. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/combined/null_check.py +0 -0
  77. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/dividend_model.py +0 -0
  78. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/__init__.py +0 -0
  79. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_bookie_model.py +0 -0
  80. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_coach_model.py +0 -0
  81. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_league_model.py +0 -0
  82. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_odds_model.py +0 -0
  83. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/espn/espn_venue_model.py +0 -0
  84. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/field_type.py +0 -0
  85. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/game_model.py +0 -0
  86. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/google/__init__.py +0 -0
  87. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/google/google_news_model.py +0 -0
  88. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/__init__.py +0 -0
  89. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/__init__.py +0 -0
  90. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_bookie_model.py +0 -0
  91. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_coach_model.py +0 -0
  92. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_dividend_model.py +0 -0
  93. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_game_model.py +0 -0
  94. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_league_model.py +0 -0
  95. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_odds_model.py +0 -0
  96. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_owner_model.py +0 -0
  97. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_team_model.py +0 -0
  98. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_venue_model.py +0 -0
  99. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/hkjc/position.py +0 -0
  100. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/league.py +0 -0
  101. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/league_model.py +0 -0
  102. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/model.py +0 -0
  103. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/__init__.py +0 -0
  104. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/combined/__init__.py +0 -0
  105. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  106. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/espn/__init__.py +0 -0
  107. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  108. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nba/__init__.py +0 -0
  109. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  110. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  111. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  112. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/__init__.py +0 -0
  113. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +0 -0
  114. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +0 -0
  115. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +0 -0
  116. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +0 -0
  117. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  118. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  119. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/position.py +0 -0
  120. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  121. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  122. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  123. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  124. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/__init__.py +0 -0
  125. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/combined/__init__.py +0 -0
  126. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  127. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/espn/__init__.py +0 -0
  128. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  129. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  130. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  131. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  132. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  133. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/__init__.py +0 -0
  134. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  135. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  136. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  137. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  138. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  139. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  140. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/news_model.py +0 -0
  141. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/__init__.py +0 -0
  142. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  143. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  144. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/combined/__init__.py +0 -0
  145. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  146. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/espn/__init__.py +0 -0
  147. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  148. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  149. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  150. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/position.py +0 -0
  151. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  152. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  153. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/odds_model.py +0 -0
  154. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/__init__.py +0 -0
  155. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/decrypt.py +0 -0
  156. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  157. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  158. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  159. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  160. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  161. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  162. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/owner_model.py +0 -0
  163. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/season_type.py +0 -0
  164. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sex.py +0 -0
  165. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/social_model.py +0 -0
  166. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/species.py +0 -0
  167. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsdb/__init__.py +0 -0
  168. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  169. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  170. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  171. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  172. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/__init__.py +0 -0
  173. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_coach_model.py +0 -0
  174. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  175. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  176. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/venue_model.py +0 -0
  177. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/__init__.py +0 -0
  178. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/gribstream/__init__.py +0 -0
  179. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  180. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/multi_weather_model.py +0 -0
  181. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  182. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  183. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/weather_model.py +0 -0
  184. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/wikipedia/__init__.py +0 -0
  185. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  186. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/x/__init__.py +0 -0
  187. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/data/x/x_social_model.py +0 -0
  188. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/logger.py +0 -0
  189. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/loglevel.py +0 -0
  190. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/playwright.py +0 -0
  191. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/proxy_session.py +0 -0
  192. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/session.py +0 -0
  193. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/sportsball.py +0 -0
  194. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/vendor/__init__.py +0 -0
  195. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  196. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/SOURCES.txt +0 -0
  197. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/dependency_links.txt +0 -0
  198. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/entry_points.txt +0 -0
  199. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/not-zip-safe +0 -0
  200. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/requires.txt +0 -0
  201. {sportsball-0.4.21 → sportsball-0.5.1}/sportsball.egg-info/top_level.txt +0 -0
  202. {sportsball-0.4.21 → sportsball-0.5.1}/tests/__init__.py +0 -0
  203. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/__init__.py +0 -0
  204. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/__init__.py +0 -0
  205. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afl/__init__.py +0 -0
  206. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afl/afl_afl_game_model_test.py +0 -0
  207. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
  208. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afltables/__init__.py +0 -0
  209. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afltables/afl_afltables_coach_model_test.py +0 -0
  210. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  211. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  212. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  213. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/aussportsbetting/__init__.py +0 -0
  214. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  215. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/combined/__init__.py +0 -0
  216. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/combined/combined_game_model_test.py +0 -0
  217. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/combined/combined_venue_model_test.py +0 -0
  218. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/espn/__init__.py +0 -0
  219. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/espn/espn_game_model_test.py +0 -0
  220. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/espn/espn_player_model_test.py +0 -0
  221. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/game_model_test.py +0 -0
  222. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/google/__init__.py +0 -0
  223. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/google/google_address_model_test.py +0 -0
  224. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/google/google_news_model_test.py +0 -0
  225. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/hkjc/__init__.py +0 -0
  226. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/hkjc/hkjc/__init__.py +0 -0
  227. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/hkjc/hkjc/hkjc_hkjc_game_model_test.py +0 -0
  228. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/hkjc/hkjc/hkjc_hkjc_player_model_test.py +0 -0
  229. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/__init__.py +0 -0
  230. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/nba/__init__.py +0 -0
  231. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  232. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  233. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  234. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/sportsdb/__init__.py +0 -0
  235. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  236. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/sportsreference/__init__.py +0 -0
  237. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  238. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/ncaab/__init__.py +0 -0
  239. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  240. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  241. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nfl/__init__.py +0 -0
  242. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nfl/sportsdb/__init__.py +0 -0
  243. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  244. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/oddsportal/__init__.py +0 -0
  245. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/oddsportal/decrypt_test.py +0 -0
  246. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  247. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  248. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/social_model_test.py +0 -0
  249. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsdb/__init__.py +0 -0
  250. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  251. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  252. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  253. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  254. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/__init__.py +0 -0
  255. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/sportsreference_coach_model_test.py +0 -0
  256. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  257. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  258. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  259. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/team_model_test.py +0 -0
  260. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/x/__init__.py +0 -0
  261. {sportsball-0.4.21 → sportsball-0.5.1}/tests/data/x/x_social_model_test.py +0 -0
  262. {sportsball-0.4.21 → sportsball-0.5.1}/tests/proxy_session_test.py +0 -0
  263. {sportsball-0.4.21 → sportsball-0.5.1}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.4.21
3
+ Version: 0.5.1
4
4
  Summary: A library for pulling in and normalising sports stats.
5
5
  Home-page: https://github.com/8W9aG/sportsball
6
6
  Author: Will Sackfield
@@ -210,6 +210,18 @@ A representation of a team within a game.
210
210
  * **coaches**: The coaches on the team during the game.
211
211
  * **lbw**: Length behind winner, expressed in metres.
212
212
  * **dividends**: The dividends the game pays out.
213
+ * **field_goals_percentage**: The ratio of field goals scored by field goals attempted by the players on the team in the game.
214
+ * **three_point_field_goals**: The number of three point field goals scored by the players on the team in the game.
215
+ * **three_point_field_goals_attempted**: The number of three point field goals attempted by the players on the team in the game.
216
+ * **three_point_field_goals_percentage**: The ratio of three point field goals scored by the three point field goals attempted by the players on the team in the game.
217
+ * **free_throws**: The number of free throws scored by the players on the team in the game.
218
+ * **free_throws_attempted**: The number of free throws attempted by the players on the team in the game.
219
+ * **free_throws_percentage**: The ratio of free throws scored by the free throws attempted by the players on the team in the game.
220
+ * **defensive_rebounds**: The number of defensive rebounds made by the players on the team in the game.
221
+ * **total_rebounds**: The number of offensive and defensive rebounds made by the players on the team in the game.
222
+ * **steals**: The number of steals made by the players on the team in the game.
223
+ * **blocks**: The number of blocks made by the players on the team in the game.
224
+ * **personal_fouls**: The number of personal fouls made by the players on the team in the game.
213
225
 
214
226
  #### Player
215
227
 
@@ -257,6 +269,22 @@ A representation of a player within a team within a game.
257
269
  * **starting_position**: The starting position of the player.
258
270
  * **weight**: The weight of the player in (in KGs).
259
271
  * **birth_address**: The address model for the players birth location.
272
+ * **seconds_played**: The amount of seconds the player played the game for.
273
+ * **field_goals_percentage**: The ratio of field goals scored by field goals attempted for the player during the game.
274
+ * **three_point_field_goals**: The number of three point field goals scored by the player during the game.
275
+ * **three_point_field_goals_attempted**: The number of three point field goals attempted by the player during the game.
276
+ * **three_point_field_goals_percentage**: The ratio of three point field goals scored by three point field goals attempted by the player during the game.
277
+ * **free_throws**: The number of free throws scored by the player during the game.
278
+ * **free_throws_attempted**: The number of free throws attempted by the player during the game.
279
+ * **free_throws_percentage**: The ratio of free throws scored by free throws attempted by the player during the game.
280
+ * **defensive_rebounds**: The number of defensive rebounds made by the player during the game.
281
+ * **total_rebounds**: The number of rebounds (both offensive and defensive) made by the player during the game.
282
+ * **steals**: The number of steals made by the player during the game.
283
+ * **blocks**: The number of blocks made by the player during the game.
284
+ * **personal_fouls**: The number of personal fouls made by the player during the game.
285
+ * **points**: The points made by the player during the game.
286
+ * **game_score**: The [John Hollinger game score](https://www.nbastuffer.com/analytics101/game-score/) of the player during the game.
287
+ * **point_differential**: The points scored by the players team while the player was on the court minus the points scored by the opposing team when the player is off the court.
260
288
 
261
289
  #### Odds
262
290
 
@@ -150,6 +150,18 @@ A representation of a team within a game.
150
150
  * **coaches**: The coaches on the team during the game.
151
151
  * **lbw**: Length behind winner, expressed in metres.
152
152
  * **dividends**: The dividends the game pays out.
153
+ * **field_goals_percentage**: The ratio of field goals scored by field goals attempted by the players on the team in the game.
154
+ * **three_point_field_goals**: The number of three point field goals scored by the players on the team in the game.
155
+ * **three_point_field_goals_attempted**: The number of three point field goals attempted by the players on the team in the game.
156
+ * **three_point_field_goals_percentage**: The ratio of three point field goals scored by the three point field goals attempted by the players on the team in the game.
157
+ * **free_throws**: The number of free throws scored by the players on the team in the game.
158
+ * **free_throws_attempted**: The number of free throws attempted by the players on the team in the game.
159
+ * **free_throws_percentage**: The ratio of free throws scored by the free throws attempted by the players on the team in the game.
160
+ * **defensive_rebounds**: The number of defensive rebounds made by the players on the team in the game.
161
+ * **total_rebounds**: The number of offensive and defensive rebounds made by the players on the team in the game.
162
+ * **steals**: The number of steals made by the players on the team in the game.
163
+ * **blocks**: The number of blocks made by the players on the team in the game.
164
+ * **personal_fouls**: The number of personal fouls made by the players on the team in the game.
153
165
 
154
166
  #### Player
155
167
 
@@ -197,6 +209,22 @@ A representation of a player within a team within a game.
197
209
  * **starting_position**: The starting position of the player.
198
210
  * **weight**: The weight of the player in (in KGs).
199
211
  * **birth_address**: The address model for the players birth location.
212
+ * **seconds_played**: The amount of seconds the player played the game for.
213
+ * **field_goals_percentage**: The ratio of field goals scored by field goals attempted for the player during the game.
214
+ * **three_point_field_goals**: The number of three point field goals scored by the player during the game.
215
+ * **three_point_field_goals_attempted**: The number of three point field goals attempted by the player during the game.
216
+ * **three_point_field_goals_percentage**: The ratio of three point field goals scored by three point field goals attempted by the player during the game.
217
+ * **free_throws**: The number of free throws scored by the player during the game.
218
+ * **free_throws_attempted**: The number of free throws attempted by the player during the game.
219
+ * **free_throws_percentage**: The ratio of free throws scored by free throws attempted by the player during the game.
220
+ * **defensive_rebounds**: The number of defensive rebounds made by the player during the game.
221
+ * **total_rebounds**: The number of rebounds (both offensive and defensive) made by the player during the game.
222
+ * **steals**: The number of steals made by the player during the game.
223
+ * **blocks**: The number of blocks made by the player during the game.
224
+ * **personal_fouls**: The number of personal fouls made by the player during the game.
225
+ * **points**: The points made by the player during the game.
226
+ * **game_score**: The [John Hollinger game score](https://www.nbastuffer.com/analytics101/game-score/) of the player during the game.
227
+ * **point_differential**: The points scored by the players team while the player was on the court minus the points scored by the opposing team when the player is off the court.
200
228
 
201
229
  #### Odds
202
230
 
@@ -26,7 +26,7 @@ def install_requires() -> typing.List[str]:
26
26
 
27
27
  setup(
28
28
  name='sportsball',
29
- version='0.4.21',
29
+ version='0.5.1',
30
30
  description='A library for pulling in and normalising sports stats.',
31
31
  long_description=long_description,
32
32
  long_description_content_type='text/markdown',
@@ -4,4 +4,4 @@
4
4
  import cchardet # type: ignore
5
5
  import lxml # noqa: ignore
6
6
 
7
- __VERSION__ = "0.4.21"
7
+ __VERSION__ = "0.5.1"
@@ -58,4 +58,16 @@ def create_afl_afl_player_model(
58
58
  weight=None,
59
59
  birth_address=None,
60
60
  owner=None,
61
+ seconds_played=None,
62
+ three_point_field_goals=None,
63
+ three_point_field_goals_attempted=None,
64
+ free_throws=None,
65
+ free_throws_attempted=None,
66
+ defensive_rebounds=None,
67
+ steals=None,
68
+ blocks=None,
69
+ personal_fouls=None,
70
+ points=None,
71
+ game_score=None,
72
+ point_differential=None,
61
73
  )
@@ -116,6 +116,18 @@ def _create_afl_afltables_player_model(
116
116
  weight=weight,
117
117
  birth_address=None,
118
118
  owner=None,
119
+ seconds_played=None,
120
+ three_point_field_goals=None,
121
+ three_point_field_goals_attempted=None,
122
+ free_throws=None,
123
+ free_throws_attempted=None,
124
+ defensive_rebounds=None,
125
+ steals=None,
126
+ blocks=None,
127
+ personal_fouls=None,
128
+ points=None,
129
+ game_score=None,
130
+ point_differential=None,
119
131
  )
120
132
 
121
133
 
@@ -75,7 +75,7 @@ class AusSportsBettingLeagueModel(LeagueModel):
75
75
  if self.league == League.NFL:
76
76
  current_cell_idx += 2
77
77
  else:
78
- current_cell_idx += 4
78
+ current_cell_idx += 5
79
79
  home_odds = float(row[current_cell_idx].value) # type: ignore
80
80
  current_cell_idx += 1
81
81
  if self.league == League.NFL:
@@ -51,6 +51,18 @@ def create_combined_player_model(
51
51
  weight = None
52
52
  birth_address = None
53
53
  owner = None
54
+ seconds_played = None
55
+ three_point_field_goals = None
56
+ three_point_field_goals_attempted = None
57
+ free_throws = None
58
+ free_throws_attempted = None
59
+ defensive_rebounds = None
60
+ steals = None
61
+ blocks = None
62
+ personal_fouls = None
63
+ points = None
64
+ game_score = None
65
+ point_differential = None
54
66
  for player_model in player_models:
55
67
  player_model_jersey = player_model.jersey
56
68
  if not is_null(player_model_jersey):
@@ -178,6 +190,46 @@ def create_combined_player_model(
178
190
  player_model_owner = player_model.owner
179
191
  if not is_null(player_model_owner):
180
192
  owner = player_model_owner
193
+ player_model_seconds_played = player_model.seconds_played
194
+ if not is_null(player_model_seconds_played):
195
+ seconds_played = player_model_seconds_played
196
+ player_model_three_point_field_goals = player_model.three_point_field_goals
197
+ if not is_null(player_model_three_point_field_goals):
198
+ three_point_field_goals = player_model_three_point_field_goals
199
+ player_model_three_point_field_goals_attempted = (
200
+ player_model.three_point_field_goals_attempted
201
+ )
202
+ if not is_null(player_model_three_point_field_goals_attempted):
203
+ three_point_field_goals_attempted = (
204
+ player_model_three_point_field_goals_attempted
205
+ )
206
+ player_model_free_throws = player_model.free_throws
207
+ if not is_null(player_model_free_throws):
208
+ free_throws = player_model_free_throws
209
+ player_model_free_throws_attempted = player_model.free_throws_attempted
210
+ if not is_null(player_model_free_throws_attempted):
211
+ free_throws_attempted = player_model_free_throws_attempted
212
+ player_model_defensive_rebounds = player_model.defensive_rebounds
213
+ if not is_null(player_model_defensive_rebounds):
214
+ defensive_rebounds = player_model_defensive_rebounds
215
+ player_model_steals = player_model.steals
216
+ if not is_null(player_model_steals):
217
+ steals = player_model_steals
218
+ player_model_blocks = player_model.blocks
219
+ if not is_null(player_model_blocks):
220
+ blocks = player_model_blocks
221
+ player_model_personal_fouls = player_model.personal_fouls
222
+ if not is_null(player_model_personal_fouls):
223
+ personal_fouls = player_model_personal_fouls
224
+ player_model_points = player_model.points
225
+ if not is_null(player_model_points):
226
+ points = player_model_points
227
+ player_model_game_score = player_model.game_score
228
+ if not is_null(player_model_game_score):
229
+ game_score = player_model_game_score
230
+ player_model_point_differential = player_model.point_differential
231
+ if not is_null(player_model_point_differential):
232
+ point_differential = player_model_point_differential
181
233
  if name is None:
182
234
  raise ValueError("name is null")
183
235
  if species is None:
@@ -226,4 +278,16 @@ def create_combined_player_model(
226
278
  weight=weight,
227
279
  birth_address=birth_address,
228
280
  owner=owner,
281
+ seconds_played=seconds_played,
282
+ three_point_field_goals=three_point_field_goals,
283
+ three_point_field_goals_attempted=three_point_field_goals_attempted,
284
+ free_throws=free_throws,
285
+ free_throws_attempted=free_throws_attempted,
286
+ defensive_rebounds=defensive_rebounds,
287
+ steals=steals,
288
+ blocks=blocks,
289
+ personal_fouls=personal_fouls,
290
+ points=points,
291
+ game_score=game_score,
292
+ point_differential=point_differential,
229
293
  )
@@ -17,7 +17,7 @@ from ..team_model import TeamModel
17
17
  from ..venue_model import VenueModel
18
18
  from .espn_bookie_model import create_espn_bookie_model
19
19
  from .espn_odds_model import MONEYLINE_KEY, create_espn_odds_model
20
- from .espn_team_model import create_espn_team_model
20
+ from .espn_team_model import ID_KEY, create_espn_team_model
21
21
  from .espn_venue_model import create_espn_venue_model
22
22
 
23
23
 
@@ -103,6 +103,8 @@ def _create_teams(
103
103
  odds_dict = odds_response.json()
104
104
 
105
105
  for competitor in competition["competitors"]:
106
+ if competitor[ID_KEY] == "-1":
107
+ continue
106
108
  teams.append(
107
109
  _create_espn_team(
108
110
  competitor, odds_dict, session, dt, league, positions_validator
@@ -103,6 +103,18 @@ def _create_espn_player_model(
103
103
  dt=None,
104
104
  ),
105
105
  owner=None,
106
+ seconds_played=None,
107
+ three_point_field_goals=None,
108
+ three_point_field_goals_attempted=None,
109
+ free_throws=None,
110
+ free_throws_attempted=None,
111
+ defensive_rebounds=None,
112
+ steals=None,
113
+ blocks=None,
114
+ personal_fouls=None,
115
+ points=None,
116
+ game_score=None,
117
+ point_differential=None,
106
118
  )
107
119
 
108
120
 
@@ -19,6 +19,8 @@ from ..x.x_social_model import create_x_social_model
19
19
  from .espn_coach_model import create_espn_coach_model
20
20
  from .espn_player_model import create_espn_player_model
21
21
 
22
+ ID_KEY = "id"
23
+
22
24
 
23
25
  def _create_espn_team_model(
24
26
  session: requests_cache.CachedSession,
@@ -30,7 +32,7 @@ def _create_espn_team_model(
30
32
  league: League,
31
33
  positions_validator: dict[str, str],
32
34
  ) -> TeamModel:
33
- identifier = team["id"]
35
+ identifier = team[ID_KEY]
34
36
  name = team.get("name", team.get("fullName", team.get("displayName")))
35
37
  if name is None:
36
38
  raise ValueError("name is null")
@@ -3223,6 +3223,15 @@ CROKE_PARK = SportsballGeocodeTuple(
3223
3223
  housenumber="",
3224
3224
  country="Ireland",
3225
3225
  )
3226
+ MADISON = SportsballGeocodeTuple(
3227
+ city="Madison",
3228
+ state="WI",
3229
+ postal="",
3230
+ lat=43.074722,
3231
+ lng=-89.384167,
3232
+ housenumber="",
3233
+ country="USA",
3234
+ )
3226
3235
  _CACHED_GEOCODES: dict[str, Any] = {
3227
3236
  "S.C.G. - Australia": SCG,
3228
3237
  "Victoria Park - Australia": SportsballGeocodeTuple(
@@ -11169,15 +11178,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
11169
11178
  housenumber="",
11170
11179
  country="USA",
11171
11180
  ),
11172
- "Madison, Wisconsin": SportsballGeocodeTuple(
11173
- city="Madison",
11174
- state="WI",
11175
- postal="",
11176
- lat=43.074722,
11177
- lng=-89.384167,
11178
- housenumber="",
11179
- country="USA",
11180
- ),
11181
+ "Madison, Wisconsin": MADISON,
11181
11182
  "College Park, Maryland": SportsballGeocodeTuple(
11182
11183
  city="College Park",
11183
11184
  state="MD",
@@ -15645,6 +15646,35 @@ _CACHED_GEOCODES: dict[str, Any] = {
15645
15646
  housenumber="",
15646
15647
  country="USA",
15647
15648
  ),
15649
+ "Madison, Wisconsin, United States": MADISON,
15650
+ "Schenectady, New York, United States": SportsballGeocodeTuple(
15651
+ city="Schenectady",
15652
+ state="NY",
15653
+ postal="",
15654
+ lat=42.814167,
15655
+ lng=-73.937222,
15656
+ housenumber="",
15657
+ country="USA",
15658
+ ),
15659
+ "Bellevue, WA, USA": SportsballGeocodeTuple(
15660
+ city="Bellevue",
15661
+ state="WA",
15662
+ postal="",
15663
+ lat=47.614444,
15664
+ lng=-122.153611,
15665
+ housenumber="",
15666
+ country="USA",
15667
+ ),
15668
+ "ZIM": SportsballGeocodeTuple(
15669
+ city="",
15670
+ state="",
15671
+ postal="",
15672
+ lat=-19.0,
15673
+ lng=30.0,
15674
+ housenumber="",
15675
+ country="Zimbabwe",
15676
+ ),
15677
+ "Corroboree Group Oval Manuka, Canberra": MANUKA_OVAL,
15648
15678
  }
15649
15679
 
15650
15680
 
@@ -173,6 +173,18 @@ def _create_hkjc_hkjc_player_model(
173
173
  weight=weight,
174
174
  birth_address=birth_address,
175
175
  owner=owner,
176
+ seconds_played=None,
177
+ three_point_field_goals=None,
178
+ three_point_field_goals_attempted=None,
179
+ free_throws=None,
180
+ free_throws_attempted=None,
181
+ defensive_rebounds=None,
182
+ steals=None,
183
+ blocks=None,
184
+ personal_fouls=None,
185
+ points=None,
186
+ game_score=None,
187
+ point_differential=None,
176
188
  )
177
189
 
178
190
 
@@ -55,4 +55,16 @@ def create_nba_nbacom_player_model(player_dict: dict[str, Any]) -> PlayerModel:
55
55
  weight=None,
56
56
  birth_address=None,
57
57
  owner=None,
58
+ seconds_played=None,
59
+ three_point_field_goals=None,
60
+ three_point_field_goals_attempted=None,
61
+ free_throws=None,
62
+ free_throws_attempted=None,
63
+ defensive_rebounds=None,
64
+ steals=None,
65
+ blocks=None,
66
+ personal_fouls=None,
67
+ points=None,
68
+ game_score=None,
69
+ point_differential=None,
58
70
  )
@@ -59,6 +59,34 @@ PLAYER_STARTING_POSITION_COLUMN: Literal["starting_position"] = "starting_positi
59
59
  PLAYER_WEIGHT_COLUMN: Literal["weight"] = "weight"
60
60
  PLAYER_BIRTH_ADDRESS_COLUMN: Literal["birth_address"] = "birth_address"
61
61
  PLAYER_OWNER_COLUMN: Literal["owner"] = "owner"
62
+ PLAYER_SECONDS_PLAYED_COLUMN: Literal["seconds_played"] = "seconds_played"
63
+ PLAYER_FIELD_GOALS_PERCENTAGE_COLUMN: Literal["field_goals_percentage"] = (
64
+ "field_goals_percentage"
65
+ )
66
+ PLAYER_THREE_POINT_FIELD_GOALS_COLUMN: Literal["three_point_field_goals"] = (
67
+ "three_point_field_goals"
68
+ )
69
+ PLAYER_THREE_POINT_FIELD_GOALS_ATTEMPTED_COLUMN: Literal[
70
+ "three_point_field_goals_attempted"
71
+ ] = "three_point_field_goals_attempted"
72
+ PLAYER_THREE_POINT_FIELD_GOALS_PERCENTAGE_COLUMN: Literal[
73
+ "three_point_field_goals_percentage"
74
+ ] = "three_point_field_goals_percentage"
75
+ PLAYER_FREE_THROWS_COLUMN: Literal["free_throws"] = "free_throws"
76
+ PLAYER_FREE_THROWS_ATTEMPTED_COLUMN: Literal["free_throws_attempted"] = (
77
+ "free_throws_attempted"
78
+ )
79
+ PLAYER_FREE_THROWS_PERCENTAGE_COLUMN: Literal["free_throws_percentage"] = (
80
+ "free_throws_percentage"
81
+ )
82
+ PLAYER_DEFENSIVE_REBOUNDS_COLUMN: Literal["defensive_rebounds"] = "defensive_rebounds"
83
+ PLAYER_TOTAL_REBOUNDS_COLUMN: Literal["total_rebounds"] = "total_rebounds"
84
+ PLAYER_STEALS_COLUMN: Literal["steals"] = "steals"
85
+ PLAYER_BLOCKS_COLUMN: Literal["blocks"] = "blocks"
86
+ PLAYER_PERSONAL_FOULS_COLUMN: Literal["personal_fouls"] = "personal_fouls"
87
+ PLAYER_POINTS_COLUMN: Literal["points"] = "points"
88
+ PLAYER_GAME_SCORE_COLUMN: Literal["game_score"] = "game_score"
89
+ PLAYER_POINT_DIFFERENTIAL_COLUMN: Literal["point_differential"] = "point_differential"
62
90
 
63
91
  _GENDER_DETECTOR = gender.Detector()
64
92
  _MALE_GENDERS = {"male", "mostly_male"}
@@ -78,6 +106,48 @@ def _guess_sex(data: dict[str, Any]) -> str | None:
78
106
  return None
79
107
 
80
108
 
109
+ def _calculate_field_goals_percentage(data: dict[str, Any]) -> float | None:
110
+ field_goals = data.get(FIELD_GOALS_COLUMN)
111
+ if field_goals is None:
112
+ return None
113
+ field_goals_attempted = data.get(FIELD_GOALS_ATTEMPTED_COLUMN)
114
+ if field_goals_attempted is None:
115
+ return None
116
+ return float(field_goals) / float(field_goals_attempted) # type: ignore
117
+
118
+
119
+ def _calculate_three_point_field_goals_percentage(data: dict[str, Any]) -> float | None:
120
+ three_point_field_goals = data.get(PLAYER_THREE_POINT_FIELD_GOALS_COLUMN)
121
+ if three_point_field_goals is None:
122
+ return None
123
+ three_point_field_goals_attempted = data.get(
124
+ PLAYER_THREE_POINT_FIELD_GOALS_ATTEMPTED_COLUMN
125
+ )
126
+ if three_point_field_goals_attempted is None:
127
+ return None
128
+ return float(three_point_field_goals) / float(three_point_field_goals_attempted) # type: ignore
129
+
130
+
131
+ def _calculate_free_throws_percentage(data: dict[str, Any]) -> float | None:
132
+ free_throws = data.get(PLAYER_FREE_THROWS_COLUMN)
133
+ if free_throws is None:
134
+ return None
135
+ free_throws_attempted = data.get(PLAYER_FREE_THROWS_ATTEMPTED_COLUMN)
136
+ if free_throws_attempted is None:
137
+ return None
138
+ return float(free_throws) / float(free_throws_attempted) # type: ignore
139
+
140
+
141
+ def _calculate_total_rebounds(data: dict[str, Any]) -> int | None:
142
+ offensive_rebounds = data.get(OFFENSIVE_REBOUNDS_COLUMN)
143
+ if offensive_rebounds is None:
144
+ return None
145
+ defensive_rebounds = data.get(PLAYER_DEFENSIVE_REBOUNDS_COLUMN)
146
+ if defensive_rebounds:
147
+ return None
148
+ return offensive_rebounds + defensive_rebounds
149
+
150
+
81
151
  class PlayerModel(BaseModel):
82
152
  """The serialisable player class."""
83
153
 
@@ -260,3 +330,83 @@ class PlayerModel(BaseModel):
260
330
  weight: float | None = Field(..., alias=PLAYER_WEIGHT_COLUMN)
261
331
  birth_address: AddressModel | None = Field(..., alias=PLAYER_BIRTH_ADDRESS_COLUMN)
262
332
  owner: OwnerModel | None = Field(..., alias=PLAYER_OWNER_COLUMN)
333
+ seconds_played: int | None = Field(
334
+ ...,
335
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
336
+ alias=PLAYER_SECONDS_PLAYED_COLUMN,
337
+ )
338
+ field_goals_percentage: float | None = Field(
339
+ default_factory=_calculate_field_goals_percentage,
340
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
341
+ alias=PLAYER_FIELD_GOALS_PERCENTAGE_COLUMN,
342
+ )
343
+ three_point_field_goals: int | None = Field(
344
+ ...,
345
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
346
+ alias=PLAYER_THREE_POINT_FIELD_GOALS_COLUMN,
347
+ )
348
+ three_point_field_goals_attempted: int | None = Field(
349
+ ...,
350
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
351
+ alias=PLAYER_THREE_POINT_FIELD_GOALS_ATTEMPTED_COLUMN,
352
+ )
353
+ three_point_field_goals_percentage: float | None = Field(
354
+ default_factory=_calculate_three_point_field_goals_percentage,
355
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
356
+ alias=PLAYER_THREE_POINT_FIELD_GOALS_PERCENTAGE_COLUMN,
357
+ )
358
+ free_throws: int | None = Field(
359
+ ...,
360
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
361
+ alias=PLAYER_FREE_THROWS_COLUMN,
362
+ )
363
+ free_throws_attempted: int | None = Field(
364
+ ...,
365
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
366
+ alias=PLAYER_FREE_THROWS_ATTEMPTED_COLUMN,
367
+ )
368
+ free_throws_percentage: float | None = Field(
369
+ default_factory=_calculate_free_throws_percentage,
370
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
371
+ alias=PLAYER_FREE_THROWS_PERCENTAGE_COLUMN,
372
+ )
373
+ defensive_rebounds: int | None = Field(
374
+ ...,
375
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
376
+ alias=PLAYER_DEFENSIVE_REBOUNDS_COLUMN,
377
+ )
378
+ total_rebounds: int | None = Field(
379
+ default_factory=_calculate_total_rebounds,
380
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
381
+ alias=PLAYER_TOTAL_REBOUNDS_COLUMN,
382
+ )
383
+ steals: int | None = Field(
384
+ ...,
385
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
386
+ alias=PLAYER_STEALS_COLUMN,
387
+ )
388
+ blocks: int | None = Field(
389
+ ...,
390
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
391
+ alias=PLAYER_BLOCKS_COLUMN,
392
+ )
393
+ personal_fouls: int | None = Field(
394
+ ...,
395
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
396
+ alias=PLAYER_PERSONAL_FOULS_COLUMN,
397
+ )
398
+ points: int | None = Field(
399
+ ...,
400
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
401
+ alias=PLAYER_POINTS_COLUMN,
402
+ )
403
+ game_score: float | None = Field(
404
+ ...,
405
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
406
+ alias=PLAYER_GAME_SCORE_COLUMN,
407
+ )
408
+ point_differential: int | None = Field(
409
+ ...,
410
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
411
+ alias=PLAYER_POINT_DIFFERENTIAL_COLUMN,
412
+ )