sportsball 0.5.4__tar.gz → 0.5.6__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.5.4/sportsball.egg-info → sportsball-0.5.6}/PKG-INFO +1 -1
- {sportsball-0.5.4 → sportsball-0.5.6}/setup.py +1 -1
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/__init__.py +1 -1
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/coach_model.py +4 -2
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_coach_model.py +20 -2
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_game_model.py +25 -2
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_league_model.py +14 -8
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_player_model.py +21 -2
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_team_model.py +24 -4
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/field_type.py +1 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/google/google_address_model.py +111 -45
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_game_model.py +33 -13
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/league_model.py +6 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/position.py +1 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/player_model.py +24 -8
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_game_model.py +1 -1
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/team_model.py +10 -2
- {sportsball-0.5.4 → sportsball-0.5.6/sportsball.egg-info}/PKG-INFO +1 -1
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/combined/combined_game_model_test.py +6 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/combined/combined_player_model_test.py +4 -2
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/combined/combined_team_model_test.py +18 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/LICENSE +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/MANIFEST.in +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/README.md +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/requirements.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/setup.cfg +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/__main__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/args.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/cache.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/address_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_coach_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/afl/position.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/bet.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/combined/null_check.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/dividend_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_coach_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_coach_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_dividend_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_owner_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/hkjc/hkjc_hkjc_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/hkjc/position.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/league.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/position.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/news_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/decrypt.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/owner_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/season_type.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sex.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/social_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/species.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_coach_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/logger.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/loglevel.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/playwright.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/proxy_session.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/session.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/sportsball.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/vendor/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afl/afl_afl_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afltables/afl_afltables_coach_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/combined/combined_venue_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/google/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/hkjc/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/hkjc/hkjc/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/hkjc/hkjc/hkjc_hkjc_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/hkjc/hkjc/hkjc_hkjc_player_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/oddsportal/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/oddsportal/decrypt_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/player_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/social_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_coach_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/team_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/x/__init__.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/proxy_session_test.py +0 -0
- {sportsball-0.5.4 → sportsball-0.5.6}/tests/sportsball_test.py +0 -0
@@ -26,7 +26,7 @@ def install_requires() -> typing.List[str]:
|
|
26
26
|
|
27
27
|
setup(
|
28
28
|
name='sportsball',
|
29
|
-
version='0.5.
|
29
|
+
version='0.5.6',
|
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',
|
@@ -5,7 +5,7 @@ from typing import Literal
|
|
5
5
|
|
6
6
|
from pydantic import BaseModel, Field
|
7
7
|
|
8
|
-
from .field_type import TYPE_KEY, FieldType
|
8
|
+
from .field_type import FFILL_KEY, TYPE_KEY, FieldType
|
9
9
|
|
10
10
|
COACH_IDENTIFIER_COLUMN: Literal["identifier"] = "identifier"
|
11
11
|
COACH_NAME_COLUMN: Literal["name"] = "name"
|
@@ -22,5 +22,7 @@ class CoachModel(BaseModel):
|
|
22
22
|
alias=COACH_IDENTIFIER_COLUMN,
|
23
23
|
)
|
24
24
|
name: str = Field(..., alias=COACH_NAME_COLUMN)
|
25
|
-
birth_date: datetime.date | None = Field(
|
25
|
+
birth_date: datetime.date | None = Field(
|
26
|
+
..., json_schema_extra={FFILL_KEY: True}, alias=COACH_BIRTH_DATE_COLUMN
|
27
|
+
)
|
26
28
|
age: int | None = Field(..., alias=COACH_AGE_COLUMN)
|
@@ -1,11 +1,16 @@
|
|
1
1
|
"""Combined coach model."""
|
2
2
|
|
3
|
+
from typing import Any
|
4
|
+
|
3
5
|
from ..coach_model import CoachModel
|
6
|
+
from ..field_type import FFILL_KEY
|
4
7
|
from .null_check import is_null
|
5
8
|
|
6
9
|
|
7
10
|
def create_combined_coach_model(
|
8
|
-
coach_models: list[CoachModel],
|
11
|
+
coach_models: list[CoachModel],
|
12
|
+
identifier: str,
|
13
|
+
coach_ffill: dict[str, dict[str, Any]],
|
9
14
|
) -> CoachModel:
|
10
15
|
"""Create a coach model by combining many coach models."""
|
11
16
|
name = None
|
@@ -23,9 +28,22 @@ def create_combined_coach_model(
|
|
23
28
|
age = coach_model_age
|
24
29
|
if name is None:
|
25
30
|
raise ValueError("name is null.")
|
26
|
-
|
31
|
+
coach_model = CoachModel(
|
27
32
|
identifier=identifier,
|
28
33
|
name=name,
|
29
34
|
birth_date=birth_date,
|
30
35
|
age=age,
|
31
36
|
)
|
37
|
+
|
38
|
+
coach_instance_ffill = coach_ffill.get(identifier, {})
|
39
|
+
for field_name, field in coach_model.model_fields.items():
|
40
|
+
extra = field.json_schema_extra or {}
|
41
|
+
if extra.get(FFILL_KEY, False): # type: ignore
|
42
|
+
current_value = getattr(coach_model, field_name)
|
43
|
+
if current_value is None:
|
44
|
+
setattr(coach_model, field_name, coach_instance_ffill.get(field_name))
|
45
|
+
else:
|
46
|
+
coach_instance_ffill[field_name] = current_value
|
47
|
+
coach_ffill[identifier] = coach_instance_ffill
|
48
|
+
|
49
|
+
return coach_model
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# pylint: disable=too-many-locals,line-too-long,too-many-arguments,too-many-branches,too-many-statements
|
4
4
|
import logging
|
5
|
+
from typing import Any
|
5
6
|
|
6
7
|
import requests
|
7
8
|
|
@@ -38,6 +39,9 @@ def _team_models(
|
|
38
39
|
player_identity_map: dict[str, str],
|
39
40
|
names: dict[str, str],
|
40
41
|
coach_names: dict[str, str],
|
42
|
+
player_ffill: dict[str, dict[str, Any]],
|
43
|
+
team_ffill: dict[str, dict[str, Any]],
|
44
|
+
coach_ffill: dict[str, dict[str, Any]],
|
41
45
|
) -> list[TeamModel]:
|
42
46
|
team_models: dict[str, list[TeamModel]] = {}
|
43
47
|
for game_model in game_models:
|
@@ -54,7 +58,16 @@ def _team_models(
|
|
54
58
|
team_model
|
55
59
|
]
|
56
60
|
return [
|
57
|
-
create_combined_team_model(
|
61
|
+
create_combined_team_model(
|
62
|
+
v,
|
63
|
+
k,
|
64
|
+
player_identity_map,
|
65
|
+
names,
|
66
|
+
coach_names,
|
67
|
+
player_ffill,
|
68
|
+
team_ffill,
|
69
|
+
coach_ffill,
|
70
|
+
) # pyright: ignore
|
58
71
|
for k, v in team_models.items()
|
59
72
|
]
|
60
73
|
|
@@ -68,11 +81,21 @@ def create_combined_game_model(
|
|
68
81
|
names: dict[str, str],
|
69
82
|
coach_names: dict[str, str],
|
70
83
|
last_game_number: int | None,
|
84
|
+
player_ffill: dict[str, dict[str, Any]],
|
85
|
+
team_ffill: dict[str, dict[str, Any]],
|
86
|
+
coach_ffill: dict[str, dict[str, Any]],
|
71
87
|
) -> GameModel:
|
72
88
|
"""Create a game model by combining many game models."""
|
73
89
|
venue_models, full_venue_identity = _venue_models(game_models, venue_identity_map)
|
74
90
|
full_team_models = _team_models(
|
75
|
-
game_models,
|
91
|
+
game_models,
|
92
|
+
team_identity_map,
|
93
|
+
player_identity_map,
|
94
|
+
names,
|
95
|
+
coach_names,
|
96
|
+
player_ffill,
|
97
|
+
team_ffill,
|
98
|
+
coach_ffill,
|
76
99
|
)
|
77
100
|
attendance = None
|
78
101
|
end_dt = None
|
@@ -91,17 +91,23 @@ 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
|
+
player_ffill: dict[str, dict[str, Any]] = {}
|
95
|
+
team_ffill: dict[str, dict[str, Any]] = {}
|
96
|
+
coach_ffill: dict[str, dict[str, Any]] = {}
|
94
97
|
last_game_number = None
|
95
98
|
for game_models in games.values():
|
96
99
|
game_model = create_combined_game_model( # type: ignore
|
97
|
-
game_models,
|
98
|
-
self.venue_identity_map(),
|
99
|
-
team_identity_map,
|
100
|
-
self.player_identity_map(),
|
101
|
-
self.session,
|
102
|
-
names,
|
103
|
-
coach_names,
|
104
|
-
last_game_number,
|
100
|
+
game_models=game_models,
|
101
|
+
venue_identity_map=self.venue_identity_map(),
|
102
|
+
team_identity_map=team_identity_map,
|
103
|
+
player_identity_map=self.player_identity_map(),
|
104
|
+
session=self.session,
|
105
|
+
names=names,
|
106
|
+
coach_names=coach_names,
|
107
|
+
last_game_number=last_game_number,
|
108
|
+
player_ffill=player_ffill,
|
109
|
+
team_ffill=team_ffill,
|
110
|
+
coach_ffill=coach_ffill,
|
105
111
|
)
|
106
112
|
last_game_number = game_model.game_number
|
107
113
|
yield game_model
|
@@ -1,12 +1,17 @@
|
|
1
1
|
"""Combined player model."""
|
2
2
|
|
3
3
|
# pylint: disable=too-many-locals,too-many-branches,too-many-statements,duplicate-code
|
4
|
+
from typing import Any
|
5
|
+
|
6
|
+
from ..field_type import FFILL_KEY
|
4
7
|
from ..player_model import PlayerModel
|
5
8
|
from .null_check import is_null
|
6
9
|
|
7
10
|
|
8
11
|
def create_combined_player_model(
|
9
|
-
player_models: list[PlayerModel],
|
12
|
+
player_models: list[PlayerModel],
|
13
|
+
identifier: str,
|
14
|
+
player_ffill: dict[str, dict[str, Any]],
|
10
15
|
) -> PlayerModel:
|
11
16
|
"""Create a player model by combining many player models."""
|
12
17
|
jersey = None
|
@@ -234,7 +239,8 @@ def create_combined_player_model(
|
|
234
239
|
raise ValueError("name is null")
|
235
240
|
if species is None:
|
236
241
|
raise ValueError("species is null")
|
237
|
-
|
242
|
+
|
243
|
+
player_model = PlayerModel(
|
238
244
|
identifier=identifier,
|
239
245
|
jersey=jersey,
|
240
246
|
kicks=kicks,
|
@@ -291,3 +297,16 @@ def create_combined_player_model(
|
|
291
297
|
game_score=game_score,
|
292
298
|
point_differential=point_differential,
|
293
299
|
)
|
300
|
+
|
301
|
+
player_instance_ffill = player_ffill.get(identifier, {})
|
302
|
+
for field_name, field in player_model.model_fields.items():
|
303
|
+
extra = field.json_schema_extra or {}
|
304
|
+
if extra.get(FFILL_KEY, False): # type: ignore
|
305
|
+
current_value = getattr(player_model, field_name)
|
306
|
+
if current_value is None:
|
307
|
+
setattr(player_model, field_name, player_instance_ffill.get(field_name))
|
308
|
+
else:
|
309
|
+
player_instance_ffill[field_name] = current_value
|
310
|
+
player_ffill[identifier] = player_instance_ffill
|
311
|
+
|
312
|
+
return player_model
|
@@ -1,10 +1,12 @@
|
|
1
1
|
"""Combined team model."""
|
2
2
|
|
3
|
-
# pylint: disable=too-many-locals,too-many-branches,too-many-statements
|
3
|
+
# pylint: disable=too-many-locals,too-many-branches,too-many-statements,too-many-arguments
|
4
4
|
import re
|
5
5
|
import unicodedata
|
6
|
+
from typing import Any
|
6
7
|
|
7
8
|
from ..coach_model import CoachModel
|
9
|
+
from ..field_type import FFILL_KEY
|
8
10
|
from ..news_model import NewsModel
|
9
11
|
from ..odds_model import OddsModel
|
10
12
|
from ..player_model import PlayerModel
|
@@ -30,6 +32,9 @@ def create_combined_team_model(
|
|
30
32
|
player_identity_map: dict[str, str],
|
31
33
|
names: dict[str, str],
|
32
34
|
coach_names: dict[str, str],
|
35
|
+
player_ffill: dict[str, dict[str, Any]],
|
36
|
+
team_ffill: dict[str, dict[str, Any]],
|
37
|
+
coach_ffill: dict[str, dict[str, Any]],
|
33
38
|
) -> TeamModel:
|
34
39
|
"""Create a team model by combining many team models."""
|
35
40
|
location = None
|
@@ -99,12 +104,12 @@ def create_combined_team_model(
|
|
99
104
|
if not is_null(team_model_end_dt):
|
100
105
|
end_dt = team_model_end_dt
|
101
106
|
|
102
|
-
|
107
|
+
team_model = TeamModel(
|
103
108
|
identifier=identifier,
|
104
109
|
name=team_models[0].name,
|
105
110
|
location=location,
|
106
111
|
players=[ # pyright: ignore
|
107
|
-
create_combined_player_model(v, k) for k, v in players.items()
|
112
|
+
create_combined_player_model(v, k, player_ffill) for k, v in players.items()
|
108
113
|
],
|
109
114
|
odds=[x[0] for x in odds.values()],
|
110
115
|
points=points,
|
@@ -112,7 +117,22 @@ def create_combined_team_model(
|
|
112
117
|
news=sorted(news.values(), key=lambda x: x.published),
|
113
118
|
social=sorted(social.values(), key=lambda x: x.published),
|
114
119
|
field_goals=field_goals,
|
115
|
-
coaches=[
|
120
|
+
coaches=[
|
121
|
+
create_combined_coach_model(v, k, coach_ffill) for k, v in coaches.items()
|
122
|
+
],
|
116
123
|
lbw=lbw,
|
117
124
|
end_dt=end_dt,
|
118
125
|
)
|
126
|
+
|
127
|
+
team_instance_ffill = team_ffill.get(identifier, {})
|
128
|
+
for field_name, field in team_model.model_fields.items():
|
129
|
+
extra = field.json_schema_extra or {}
|
130
|
+
if extra.get(FFILL_KEY, False): # type: ignore
|
131
|
+
current_value = getattr(team_model, field_name)
|
132
|
+
if current_value is None:
|
133
|
+
setattr(team_model, field_name, team_instance_ffill.get(field_name))
|
134
|
+
else:
|
135
|
+
team_instance_ffill[field_name] = current_value
|
136
|
+
team_ffill[identifier] = team_instance_ffill
|
137
|
+
|
138
|
+
return team_model
|
@@ -3232,6 +3232,51 @@ MADISON = SportsballGeocodeTuple(
|
|
3232
3232
|
housenumber="",
|
3233
3233
|
country="USA",
|
3234
3234
|
)
|
3235
|
+
SAN_JOSE = SportsballGeocodeTuple(
|
3236
|
+
city="San Jose",
|
3237
|
+
state="CA",
|
3238
|
+
postal="",
|
3239
|
+
lat=37.336111,
|
3240
|
+
lng=-121.890556,
|
3241
|
+
housenumber="",
|
3242
|
+
country="USA",
|
3243
|
+
)
|
3244
|
+
MIAMI_ARENA = SportsballGeocodeTuple(
|
3245
|
+
city="Miami",
|
3246
|
+
state="FL",
|
3247
|
+
postal="",
|
3248
|
+
lat=25.781111,
|
3249
|
+
lng=-80.194722,
|
3250
|
+
housenumber="721",
|
3251
|
+
country="USA",
|
3252
|
+
)
|
3253
|
+
SILVIO_O_CONTE_FORUM = SportsballGeocodeTuple(
|
3254
|
+
city="Chestnut Hill",
|
3255
|
+
state="MA",
|
3256
|
+
postal="",
|
3257
|
+
lat=42.335,
|
3258
|
+
lng=-71.1675,
|
3259
|
+
housenumber="",
|
3260
|
+
country="USA",
|
3261
|
+
)
|
3262
|
+
ROGERS_CENTER = SportsballGeocodeTuple(
|
3263
|
+
city="Toronto",
|
3264
|
+
state="ON",
|
3265
|
+
postal="M5V 1J1",
|
3266
|
+
lat=43.6415757,
|
3267
|
+
lng=-79.3942991,
|
3268
|
+
housenumber="580",
|
3269
|
+
country="Canada",
|
3270
|
+
)
|
3271
|
+
BIRMINGHAM_JEFFERSON_CIVIC_CENTER = SportsballGeocodeTuple(
|
3272
|
+
city="Birmingham",
|
3273
|
+
state="AL",
|
3274
|
+
postal="35203",
|
3275
|
+
lat=33.524,
|
3276
|
+
lng=-86.812,
|
3277
|
+
housenumber="2100",
|
3278
|
+
country="USA",
|
3279
|
+
)
|
3235
3280
|
_CACHED_GEOCODES: dict[str, Any] = {
|
3236
3281
|
"S.C.G. - Australia": SCG,
|
3237
3282
|
"Victoria Park - Australia": SportsballGeocodeTuple(
|
@@ -3502,15 +3547,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
3502
3547
|
housenumber="580",
|
3503
3548
|
country="Australia",
|
3504
3549
|
),
|
3505
|
-
"Rogers Centre - Toronto - ON":
|
3506
|
-
city="Toronto",
|
3507
|
-
state="ON",
|
3508
|
-
postal="M5V 1J1",
|
3509
|
-
lat=43.6415757,
|
3510
|
-
lng=-79.3942991,
|
3511
|
-
housenumber="580",
|
3512
|
-
country="Canada",
|
3513
|
-
),
|
3550
|
+
"Rogers Centre - Toronto - ON": ROGERS_CENTER,
|
3514
3551
|
"Euroa - Australia": SportsballGeocodeTuple(
|
3515
3552
|
city="Euroa",
|
3516
3553
|
state="VIC",
|
@@ -6788,15 +6825,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
6788
6825
|
housenumber="2168",
|
6789
6826
|
country="USA",
|
6790
6827
|
),
|
6791
|
-
"Silvio O. Conte Forum, Chestnut Hill, Massachusetts":
|
6792
|
-
city="Chestnut Hill",
|
6793
|
-
state="MA",
|
6794
|
-
postal="",
|
6795
|
-
lat=42.335,
|
6796
|
-
lng=-71.1675,
|
6797
|
-
housenumber="",
|
6798
|
-
country="USA",
|
6799
|
-
),
|
6828
|
+
"Silvio O. Conte Forum, Chestnut Hill, Massachusetts": SILVIO_O_CONTE_FORUM,
|
6800
6829
|
"Millett Hall, Oxford, Ohio": SportsballGeocodeTuple(
|
6801
6830
|
city="Oxford",
|
6802
6831
|
state="OH",
|
@@ -7987,15 +8016,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
7987
8016
|
"Charlotte Coliseum": CHARLOTTE_COLISEUM,
|
7988
8017
|
"Toyota Center, Houston, Texas": TOYOTA_CENTRE,
|
7989
8018
|
"American Airlines Center, Dallas, Texas": AMERICAN_AIRLINES_ARENA,
|
7990
|
-
"Miami Arena":
|
7991
|
-
city="Miami",
|
7992
|
-
state="FL",
|
7993
|
-
postal="",
|
7994
|
-
lat=25.781111,
|
7995
|
-
lng=-80.194722,
|
7996
|
-
housenumber="721",
|
7997
|
-
country="USA",
|
7998
|
-
),
|
8019
|
+
"Miami Arena": MIAMI_ARENA,
|
7999
8020
|
"Al McGuire Center, Milwaukee, Wisconsin": SportsballGeocodeTuple(
|
8000
8021
|
city="Milwaukee",
|
8001
8022
|
state="WI",
|
@@ -10350,15 +10371,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
10350
10371
|
housenumber="",
|
10351
10372
|
country="USA",
|
10352
10373
|
),
|
10353
|
-
"San Jose, California":
|
10354
|
-
city="San Jose",
|
10355
|
-
state="CA",
|
10356
|
-
postal="",
|
10357
|
-
lat=37.336111,
|
10358
|
-
lng=-121.890556,
|
10359
|
-
housenumber="",
|
10360
|
-
country="USA",
|
10361
|
-
),
|
10374
|
+
"San Jose, California": SAN_JOSE,
|
10362
10375
|
"Columbia, South Carolina": SportsballGeocodeTuple(
|
10363
10376
|
city="Columbia",
|
10364
10377
|
state="SC",
|
@@ -13497,15 +13510,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
13497
13510
|
housenumber="6400",
|
13498
13511
|
country="USA",
|
13499
13512
|
),
|
13500
|
-
"Birmingham-Jefferson Civic Center, Birmingham, Alabama":
|
13501
|
-
city="Birmingham",
|
13502
|
-
state="AL",
|
13503
|
-
postal="35203",
|
13504
|
-
lat=33.524,
|
13505
|
-
lng=-86.812,
|
13506
|
-
housenumber="2100",
|
13507
|
-
country="USA",
|
13508
|
-
),
|
13513
|
+
"Birmingham-Jefferson Civic Center, Birmingham, Alabama": BIRMINGHAM_JEFFERSON_CIVIC_CENTER,
|
13509
13514
|
"War Memorial Gymnasium, Maui, Hawaii": SportsballGeocodeTuple(
|
13510
13515
|
city="Maui",
|
13511
13516
|
state="HI",
|
@@ -15693,12 +15698,73 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
15693
15698
|
housenumber="",
|
15694
15699
|
country="USA",
|
15695
15700
|
),
|
15701
|
+
"Danville, Virginia, United States": SportsballGeocodeTuple(
|
15702
|
+
city="Danville",
|
15703
|
+
state="VA",
|
15704
|
+
postal="",
|
15705
|
+
lat=36.587222,
|
15706
|
+
lng=-79.404444,
|
15707
|
+
housenumber="",
|
15708
|
+
country="USA",
|
15709
|
+
),
|
15710
|
+
"Antioch, CA, USA": SportsballGeocodeTuple(
|
15711
|
+
city="Antioch",
|
15712
|
+
state="CA",
|
15713
|
+
postal="",
|
15714
|
+
lat=38.005,
|
15715
|
+
lng=-121.805833,
|
15716
|
+
housenumber="",
|
15717
|
+
country="USA",
|
15718
|
+
),
|
15719
|
+
"San Jose, CA, USA": SAN_JOSE,
|
15720
|
+
"Miami Arena, Miami, Florida": MIAMI_ARENA,
|
15721
|
+
"Silvio O. Conte Forum, Boston, Massachusetts": SILVIO_O_CONTE_FORUM,
|
15722
|
+
"IND": SportsballGeocodeTuple(
|
15723
|
+
city="",
|
15724
|
+
state="",
|
15725
|
+
postal="",
|
15726
|
+
lat=21.0,
|
15727
|
+
lng=78.0,
|
15728
|
+
housenumber="",
|
15729
|
+
country="India",
|
15730
|
+
),
|
15731
|
+
"Tokyo Dome, Tokyo, Japan": SportsballGeocodeTuple(
|
15732
|
+
city="Tokyo",
|
15733
|
+
state="",
|
15734
|
+
postal="",
|
15735
|
+
lat=35.705556,
|
15736
|
+
lng=139.751944,
|
15737
|
+
housenumber="3",
|
15738
|
+
country="Japan",
|
15739
|
+
),
|
15740
|
+
"NH": SportsballGeocodeTuple(
|
15741
|
+
city="",
|
15742
|
+
state="",
|
15743
|
+
postal="",
|
15744
|
+
lat=52.0,
|
15745
|
+
lng=6.0,
|
15746
|
+
housenumber="",
|
15747
|
+
country="Netherlands",
|
15748
|
+
),
|
15749
|
+
"Federal Way, WA, USA": SportsballGeocodeTuple(
|
15750
|
+
city="Federal Way",
|
15751
|
+
state="WA",
|
15752
|
+
postal="",
|
15753
|
+
lat=47.313333,
|
15754
|
+
lng=-122.372222,
|
15755
|
+
housenumber="",
|
15756
|
+
country="USA",
|
15757
|
+
),
|
15758
|
+
"SkyDome, Toronto, Canada": ROGERS_CENTER,
|
15759
|
+
"CoreStates Center, Philadelphia, Pennsylvania": SPECTRUM,
|
15760
|
+
"BJCC Arena, Birmingham, Alabama": BIRMINGHAM_JEFFERSON_CIVIC_CENTER,
|
15696
15761
|
}
|
15697
15762
|
|
15698
15763
|
|
15699
15764
|
def _create_google_address_model(
|
15700
15765
|
query: str, session: requests_cache.CachedSession, dt: datetime.datetime | None
|
15701
15766
|
) -> AddressModel:
|
15767
|
+
query = query.replace("\n", "")
|
15702
15768
|
g = _CACHED_GEOCODES.get(query)
|
15703
15769
|
if g is None:
|
15704
15770
|
logging.warning("Failed to find query: %s", query)
|
@@ -52,7 +52,11 @@ def _create_hkjc_hkjc_game_model(
|
|
52
52
|
|
53
53
|
o = urlparse(url)
|
54
54
|
query = urllib.parse.parse_qs(o.query)
|
55
|
-
|
55
|
+
try:
|
56
|
+
dt = parse(query[RACE_DATE_QUERY_KEY][0])
|
57
|
+
except KeyError:
|
58
|
+
logging.error(url)
|
59
|
+
return None
|
56
60
|
game_number = int(query[RACE_NUMBER_QUERY_KEY][0])
|
57
61
|
venue_code = query[RACE_COURSE_QUERY_KEY][0]
|
58
62
|
|
@@ -69,7 +73,7 @@ def _create_hkjc_hkjc_game_model(
|
|
69
73
|
if count == 1:
|
70
74
|
race_track = ""
|
71
75
|
try:
|
72
|
-
race_track = df.iat[2, 2].split("-")[0].strip()
|
76
|
+
race_track = str(df.iat[2, 2]).split("-", maxsplit=1)[0].strip()
|
73
77
|
except IndexError:
|
74
78
|
logging.error(url)
|
75
79
|
raise
|
@@ -86,7 +90,7 @@ def _create_hkjc_hkjc_game_model(
|
|
86
90
|
for _, row in df.iterrows():
|
87
91
|
horse_name = None
|
88
92
|
try:
|
89
|
-
horse_name = row["Horse"].split("(")[
|
93
|
+
horse_name = "(".join(row["Horse"].split("(")[:-1]).strip()
|
90
94
|
except KeyError:
|
91
95
|
logging.error(url)
|
92
96
|
continue
|
@@ -141,6 +145,8 @@ def _create_hkjc_hkjc_game_model(
|
|
141
145
|
lbw = 2.4 * 0.07
|
142
146
|
elif lbw_str == "+SH":
|
143
147
|
lbw = 2.4 * 0.2 * 0.5
|
148
|
+
elif lbw_str in {"HD+", "+HD"}:
|
149
|
+
lbw = 2.4 * 0.2 * 1.5
|
144
150
|
elif lbw_str and lbw_str != "-" and lbw_str != "---":
|
145
151
|
if lbw is not None:
|
146
152
|
if "-" in lbw_str:
|
@@ -190,6 +196,8 @@ def _create_hkjc_hkjc_game_model(
|
|
190
196
|
if place is None:
|
191
197
|
continue
|
192
198
|
if horse_url is None:
|
199
|
+
logging.error(url)
|
200
|
+
logging.error(row)
|
193
201
|
raise ValueError("horse_url is null")
|
194
202
|
|
195
203
|
team_model = create_hkjc_hkjc_team_model(
|
@@ -210,18 +218,30 @@ def _create_hkjc_hkjc_game_model(
|
|
210
218
|
elif count == 3:
|
211
219
|
for _, row in df.iterrows():
|
212
220
|
row_df = row.to_frame()
|
213
|
-
pool = row_df.iat[0, 0].strip()
|
221
|
+
pool = str(row_df.iat[0, 0]).strip()
|
214
222
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
+
try:
|
224
|
+
dividend_str = str(row_df.iat[2, 0]).strip().lower()
|
225
|
+
if dividend_str == "details":
|
226
|
+
continue
|
227
|
+
if dividend_str == "refund":
|
228
|
+
continue
|
229
|
+
if dividend_str == "not win":
|
230
|
+
continue
|
231
|
+
if dividend_str == "detail":
|
232
|
+
continue
|
233
|
+
dividend_str = (
|
234
|
+
dividend_str.split("/", maxsplit=1)[0]
|
235
|
+
.replace(",", "")
|
236
|
+
.replace("$", "")
|
237
|
+
.replace("(", "")
|
238
|
+
.replace(")", "")
|
239
|
+
)
|
240
|
+
if dividend_str == "win":
|
241
|
+
continue
|
242
|
+
except IndexError:
|
243
|
+
logging.error(url)
|
223
244
|
continue
|
224
|
-
dividend_str = dividend_str.split("/", maxsplit=1)[0].replace(",", "")
|
225
245
|
dividend = float(dividend_str)
|
226
246
|
|
227
247
|
combination = None
|
@@ -41,6 +41,8 @@ def _normalize_tz(df: pd.DataFrame) -> pd.DataFrame:
|
|
41
41
|
tqdm.tqdm.pandas(desc="Timezone Conversions")
|
42
42
|
|
43
43
|
# Check each row to see if they have the correct timezone
|
44
|
+
dt_cols = set()
|
45
|
+
|
44
46
|
def apply_tz(row: pd.Series) -> pd.Series:
|
45
47
|
if tz_column not in row:
|
46
48
|
return row
|
@@ -53,6 +55,7 @@ def _normalize_tz(df: pd.DataFrame) -> pd.DataFrame:
|
|
53
55
|
}
|
54
56
|
datetime_cols.add(GAME_DT_COLUMN)
|
55
57
|
for col in datetime_cols:
|
58
|
+
dt_cols.add(col)
|
56
59
|
dt = row[col] # type: ignore
|
57
60
|
if isinstance(dt, (datetime.date, datetime.datetime)):
|
58
61
|
dt = pd.to_datetime(dt)
|
@@ -65,6 +68,9 @@ def _normalize_tz(df: pd.DataFrame) -> pd.DataFrame:
|
|
65
68
|
|
66
69
|
return row
|
67
70
|
|
71
|
+
for dt_col in dt_cols:
|
72
|
+
df[dt_col] = pd.to_datetime(df[dt_col])
|
73
|
+
|
68
74
|
return df.progress_apply(apply_tz, axis=1) # type: ignore
|
69
75
|
|
70
76
|
|