sportsball 0.4.20__tar.gz → 0.5.0__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.
- {sportsball-0.4.20/sportsball.egg-info → sportsball-0.5.0}/PKG-INFO +29 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/README.md +28 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/setup.py +1 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/__init__.py +1 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_player_model.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_player_model.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +1 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_game_model.py +4 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_league_model.py +5 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_player_model.py +64 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_game_model.py +3 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_player_model.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_team_model.py +10 -2
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/google/google_address_model.py +65 -9
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_game_model.py +2 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_player_model.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/player_model.py +150 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_game_model.py +190 -52
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_player_model.py +87 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_team_model.py +123 -39
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/team_model.py +240 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/proxy_session.py +1 -0
- {sportsball-0.4.20 → sportsball-0.5.0/sportsball.egg-info}/PKG-INFO +29 -1
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/combined/combined_game_model_test.py +1 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/combined/combined_player_model_test.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/combined/combined_team_model_test.py +48 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/player_model_test.py +12 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/sportsreference_player_model_test.py +12 -0
- sportsball-0.5.0/tests/data/sportsreference/sportsreference_team_model_test.py +353 -0
- sportsball-0.4.20/tests/data/sportsreference/sportsreference_team_model_test.py +0 -245
- {sportsball-0.4.20 → sportsball-0.5.0}/LICENSE +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/MANIFEST.in +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/requirements.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/setup.cfg +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/__main__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/args.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/cache.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/address_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/position.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/bet.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/combined/null_check.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/dividend_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/field_type.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_dividend_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_owner_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/hkjc/hkjc_hkjc_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/hkjc/position.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/league.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/position.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/news_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/position.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/decrypt.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/owner_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/season_type.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sex.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/social_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/species.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_coach_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/logger.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/loglevel.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/playwright.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/session.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/sportsball.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/vendor/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afl/afl_afl_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afltables/afl_afltables_coach_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/combined/combined_venue_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/google/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/hkjc/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/hkjc/hkjc/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/hkjc/hkjc/hkjc_hkjc_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/hkjc/hkjc/hkjc_hkjc_player_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/oddsportal/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/oddsportal/decrypt_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/social_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/sportsreference_coach_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/team_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/x/__init__.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/proxy_session_test.py +0 -0
- {sportsball-0.4.20 → sportsball-0.5.0}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: sportsball
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.5.0
|
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.
|
29
|
+
version='0.5.0',
|
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',
|
@@ -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
|
)
|
{sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/afl/afltables/afl_afltables_player_model.py
RENAMED
@@ -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 +=
|
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:
|
@@ -67,6 +67,7 @@ def create_combined_game_model(
|
|
67
67
|
session: requests.Session,
|
68
68
|
names: dict[str, str],
|
69
69
|
coach_names: dict[str, str],
|
70
|
+
last_game_number: int | None,
|
70
71
|
) -> GameModel:
|
71
72
|
"""Create a game model by combining many game models."""
|
72
73
|
venue_models, full_venue_identity = _venue_models(game_models, venue_identity_map)
|
@@ -127,6 +128,9 @@ def create_combined_game_model(
|
|
127
128
|
if venue_model_identifier is not None:
|
128
129
|
full_venue_identity = venue_model_identifier
|
129
130
|
|
131
|
+
if game_number is None and last_game_number is not None:
|
132
|
+
game_number = last_game_number + 1
|
133
|
+
|
130
134
|
return GameModel(
|
131
135
|
dt=dt,
|
132
136
|
week=week,
|
@@ -91,8 +91,9 @@ class CombinedLeagueModel(LeagueModel):
|
|
91
91
|
games[key] = games.get(key, []) + [game_model]
|
92
92
|
names: dict[str, str] = {}
|
93
93
|
coach_names: dict[str, str] = {}
|
94
|
+
last_game_number = None
|
94
95
|
for game_models in games.values():
|
95
|
-
|
96
|
+
game_model = create_combined_game_model( # type: ignore
|
96
97
|
game_models,
|
97
98
|
self.venue_identity_map(),
|
98
99
|
team_identity_map,
|
@@ -100,4 +101,7 @@ class CombinedLeagueModel(LeagueModel):
|
|
100
101
|
self.session,
|
101
102
|
names,
|
102
103
|
coach_names,
|
104
|
+
last_game_number,
|
103
105
|
)
|
106
|
+
last_game_number = game_model.game_number
|
107
|
+
yield game_model
|
@@ -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
|
|
@@ -3,6 +3,8 @@
|
|
3
3
|
# pylint: disable=too-many-arguments,too-many-locals,duplicate-code
|
4
4
|
|
5
5
|
import datetime
|
6
|
+
import json
|
7
|
+
import logging
|
6
8
|
from typing import Any
|
7
9
|
|
8
10
|
import pytest_is_running
|
@@ -17,6 +19,8 @@ from ..x.x_social_model import create_x_social_model
|
|
17
19
|
from .espn_coach_model import create_espn_coach_model
|
18
20
|
from .espn_player_model import create_espn_player_model
|
19
21
|
|
22
|
+
ID_KEY = "id"
|
23
|
+
|
20
24
|
|
21
25
|
def _create_espn_team_model(
|
22
26
|
session: requests_cache.CachedSession,
|
@@ -28,7 +32,7 @@ def _create_espn_team_model(
|
|
28
32
|
league: League,
|
29
33
|
positions_validator: dict[str, str],
|
30
34
|
) -> TeamModel:
|
31
|
-
identifier = team[
|
35
|
+
identifier = team[ID_KEY]
|
32
36
|
name = team.get("name", team.get("fullName", team.get("displayName")))
|
33
37
|
if name is None:
|
34
38
|
raise ValueError("name is null")
|
@@ -38,7 +42,11 @@ def _create_espn_team_model(
|
|
38
42
|
player = create_espn_player_model(session, entity, dt, positions_validator)
|
39
43
|
players.append(player)
|
40
44
|
points = score_dict["value"]
|
41
|
-
|
45
|
+
try:
|
46
|
+
coaches_response = session.get(team["coaches"]["$ref"])
|
47
|
+
except KeyError:
|
48
|
+
logging.error("coaches missing for team %s", json.dumps(team))
|
49
|
+
raise
|
42
50
|
coaches_response.raise_for_status()
|
43
51
|
coaches_urls = [x["$ref"] for x in coaches_response.json()["items"]]
|
44
52
|
return TeamModel(
|
@@ -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":
|
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",
|
@@ -15618,6 +15619,61 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
15618
15619
|
housenumber="",
|
15619
15620
|
country="Canada",
|
15620
15621
|
),
|
15622
|
+
"Camarillo, CA, USA": SportsballGeocodeTuple(
|
15623
|
+
city="Camarillo",
|
15624
|
+
state="CA",
|
15625
|
+
postal="",
|
15626
|
+
lat=34.233333,
|
15627
|
+
lng=-119.033333,
|
15628
|
+
housenumber="",
|
15629
|
+
country="USA",
|
15630
|
+
),
|
15631
|
+
"GR": SportsballGeocodeTuple(
|
15632
|
+
city="",
|
15633
|
+
state="",
|
15634
|
+
postal="",
|
15635
|
+
lat=39.0,
|
15636
|
+
lng=22.0,
|
15637
|
+
housenumber="",
|
15638
|
+
country="Greece",
|
15639
|
+
),
|
15640
|
+
"Camden, New Jersey, United States": SportsballGeocodeTuple(
|
15641
|
+
city="Camden",
|
15642
|
+
state="NJ",
|
15643
|
+
postal="",
|
15644
|
+
lat=39.94,
|
15645
|
+
lng=-75.105,
|
15646
|
+
housenumber="",
|
15647
|
+
country="USA",
|
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
|
+
),
|
15621
15677
|
}
|
15622
15678
|
|
15623
15679
|
|
@@ -137,6 +137,8 @@ def _create_hkjc_hkjc_game_model(
|
|
137
137
|
lbw = None
|
138
138
|
elif lbw_str == "TO":
|
139
139
|
lbw = 100.0
|
140
|
+
elif lbw_str in {"+NOSE", "+N"}:
|
141
|
+
lbw = 2.4 * 0.07
|
140
142
|
elif lbw_str and lbw_str != "-" and lbw_str != "---":
|
141
143
|
if lbw is not None:
|
142
144
|
if "-" in lbw_str:
|
@@ -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
|
|
{sportsball-0.4.20 → sportsball-0.5.0}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py
RENAMED
@@ -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
|
+
)
|