Remove CFB/NASCAR/PGA and streamline to 8 supported sports
- Remove College Football, NASCAR, and PGA from scraper and app - Clean all data files (stadiums, games, pipeline reports) - Update Sport.swift enum and all UI components - Add sportstime.py CLI tool for pipeline management - Add DATA_SCRAPING.md documentation - Add WNBA/MLS/NWSL implementation documentation - Scraper now supports: NBA, MLB, NHL, NFL, WNBA, MLS, NWSL, CBB Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
+141
-31
@@ -7,24 +7,43 @@ Imports canonical JSON data into CloudKit. Run after canonicalization pipeline.
|
||||
Expected input files (from canonicalization pipeline):
|
||||
- stadiums_canonical.json
|
||||
- teams_canonical.json
|
||||
- games_canonical.json
|
||||
- games_canonical.json OR canonical/games/*.json (new structure)
|
||||
- stadium_aliases.json
|
||||
- league_structure.json
|
||||
- team_aliases.json
|
||||
|
||||
File Structure (Option B - by sport/season):
|
||||
data/
|
||||
games/ # Raw scraped games
|
||||
mlb_2025.json
|
||||
nba_2025.json
|
||||
...
|
||||
canonical/ # Canonicalized data
|
||||
games/
|
||||
mlb_2025.json
|
||||
nba_2025.json
|
||||
...
|
||||
stadiums.json
|
||||
games_canonical.json # Combined (backward compatibility)
|
||||
stadiums_canonical.json
|
||||
teams_canonical.json
|
||||
|
||||
Setup:
|
||||
1. CloudKit Dashboard > Tokens & Keys > Server-to-Server Keys
|
||||
2. Create key with Read/Write access to public database
|
||||
3. Download .p8 file and note Key ID
|
||||
|
||||
Usage:
|
||||
python cloudkit_import.py --dry-run # Preview first
|
||||
python cloudkit_import.py --key-id XX --key-file key.p8 # Import all
|
||||
python cloudkit_import.py --stadiums-only ... # Stadiums first
|
||||
python cloudkit_import.py --games-only ... # Games after
|
||||
python cloudkit_import.py --stadium-aliases-only ... # Stadium aliases only
|
||||
python cloudkit_import.py --delete-all ... # Delete then import
|
||||
python cloudkit_import.py --delete-only ... # Delete only (no import)
|
||||
python cloudkit_import.py # Interactive menu
|
||||
python cloudkit_import.py --dry-run # Preview first
|
||||
python cloudkit_import.py --key-id XX --key-file key.p8 # Import all
|
||||
python cloudkit_import.py --stadiums-only # Stadiums first
|
||||
python cloudkit_import.py --games-only # All games
|
||||
python cloudkit_import.py --games-files mlb_2025.json # Specific game file
|
||||
python cloudkit_import.py --games-files mlb_2025.json,nba_2025.json # Multiple files
|
||||
python cloudkit_import.py --stadium-aliases-only # Stadium aliases only
|
||||
python cloudkit_import.py --delete-all # Delete then import
|
||||
python cloudkit_import.py --delete-only # Delete only (no import)
|
||||
"""
|
||||
|
||||
import argparse, json, time, os, sys, hashlib, base64, requests
|
||||
@@ -48,6 +67,58 @@ DEFAULT_KEY_ID = "152be0715e0276e31aaea5cbfe79dc872f298861a55c70fae14e5fe3e026cf
|
||||
DEFAULT_KEY_FILE = "eckey.pem"
|
||||
|
||||
|
||||
def show_game_files_menu(data_dir: Path) -> list[str]:
|
||||
"""Show available game files and let user select which to import."""
|
||||
canonical_games_dir = data_dir / 'canonical' / 'games'
|
||||
|
||||
if not canonical_games_dir.exists():
|
||||
print("\n No canonical/games/ directory found.")
|
||||
return []
|
||||
|
||||
game_files = sorted(canonical_games_dir.glob('*.json'))
|
||||
if not game_files:
|
||||
print("\n No game files found in canonical/games/")
|
||||
return []
|
||||
|
||||
print("\n" + "="*50)
|
||||
print("Select Game Files to Import")
|
||||
print("="*50)
|
||||
print("\n Available files:")
|
||||
for i, f in enumerate(game_files, 1):
|
||||
# Count games in file
|
||||
with open(f) as fp:
|
||||
games = json.load(fp)
|
||||
print(f" {i}. {f.name} ({len(games):,} games)")
|
||||
|
||||
print(f"\n a. All files")
|
||||
print(f" 0. Cancel")
|
||||
print()
|
||||
|
||||
while True:
|
||||
try:
|
||||
choice = input("Enter file numbers (comma-separated), 'a' for all, or 0 to cancel: ").strip().lower()
|
||||
if choice == '0':
|
||||
return []
|
||||
if choice == 'a':
|
||||
return [f.name for f in game_files]
|
||||
|
||||
# Parse comma-separated numbers
|
||||
indices = [int(x.strip()) for x in choice.split(',')]
|
||||
selected = []
|
||||
for idx in indices:
|
||||
if 1 <= idx <= len(game_files):
|
||||
selected.append(game_files[idx-1].name)
|
||||
else:
|
||||
print(f"Invalid selection: {idx}")
|
||||
continue
|
||||
if selected:
|
||||
return selected
|
||||
print("No valid selections. Try again.")
|
||||
except (ValueError, EOFError, KeyboardInterrupt):
|
||||
print("\nCancelled.")
|
||||
return []
|
||||
|
||||
|
||||
def show_menu():
|
||||
"""Show interactive menu and return selected action."""
|
||||
print("\n" + "="*50)
|
||||
@@ -55,25 +126,26 @@ def show_menu():
|
||||
print("="*50)
|
||||
print("\n 1. Import all (stadiums, teams, games, league structure, team aliases, stadium aliases)")
|
||||
print(" 2. Stadiums only")
|
||||
print(" 3. Games only")
|
||||
print(" 4. League structure only")
|
||||
print(" 5. Team aliases only")
|
||||
print(" 6. Stadium aliases only")
|
||||
print(" 7. Canonical only (league structure + team aliases + stadium aliases)")
|
||||
print(" 8. Delete all then import")
|
||||
print(" 9. Delete only (no import)")
|
||||
print(" 10. Dry run (preview only)")
|
||||
print(" 3. Games only (all files)")
|
||||
print(" 4. Games - select specific files")
|
||||
print(" 5. League structure only")
|
||||
print(" 6. Team aliases only")
|
||||
print(" 7. Stadium aliases only")
|
||||
print(" 8. Canonical only (league structure + team aliases + stadium aliases)")
|
||||
print(" 9. Delete all then import")
|
||||
print(" 10. Delete only (no import)")
|
||||
print(" 11. Dry run (preview only)")
|
||||
print(" 0. Exit")
|
||||
print()
|
||||
|
||||
while True:
|
||||
try:
|
||||
choice = input("Enter choice [1-10, 0 to exit]: ").strip()
|
||||
choice = input("Enter choice [1-11, 0 to exit]: ").strip()
|
||||
if choice == '0':
|
||||
return None
|
||||
if choice in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']:
|
||||
if choice in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11']:
|
||||
return int(choice)
|
||||
print("Invalid choice. Please enter 1-10 or 0.")
|
||||
print("Invalid choice. Please enter 1-11 or 0.")
|
||||
except (EOFError, KeyboardInterrupt):
|
||||
print("\nExiting.")
|
||||
return None
|
||||
@@ -265,6 +337,7 @@ def main():
|
||||
p.add_argument('--data-dir', default='./data')
|
||||
p.add_argument('--stadiums-only', action='store_true')
|
||||
p.add_argument('--games-only', action='store_true')
|
||||
p.add_argument('--games-files', type=str, help='Comma-separated list of game files to import (e.g., mlb_2025.json,nba_2025.json)')
|
||||
p.add_argument('--league-structure-only', action='store_true', help='Import only league structure')
|
||||
p.add_argument('--team-aliases-only', action='store_true', help='Import only team aliases')
|
||||
p.add_argument('--stadium-aliases-only', action='store_true', help='Import only stadium aliases')
|
||||
@@ -278,11 +351,18 @@ def main():
|
||||
|
||||
# Show interactive menu if no action flags provided or --interactive
|
||||
has_action_flag = any([
|
||||
args.stadiums_only, args.games_only, args.league_structure_only,
|
||||
args.stadiums_only, args.games_only, args.games_files, args.league_structure_only,
|
||||
args.team_aliases_only, args.stadium_aliases_only, args.canonical_only,
|
||||
args.delete_all, args.delete_only, args.dry_run
|
||||
])
|
||||
|
||||
# Track selected game files (for option 4 or --games-files)
|
||||
selected_game_files = None
|
||||
if args.games_files:
|
||||
# Parse comma-separated list from command line
|
||||
selected_game_files = [f.strip() for f in args.games_files.split(',')]
|
||||
args.games_only = True # Imply --games-only
|
||||
|
||||
if args.interactive or not has_action_flag:
|
||||
choice = show_menu()
|
||||
if choice is None:
|
||||
@@ -293,21 +373,27 @@ def main():
|
||||
pass # Default behavior
|
||||
elif choice == 2: # Stadiums only
|
||||
args.stadiums_only = True
|
||||
elif choice == 3: # Games only
|
||||
elif choice == 3: # Games only (all files)
|
||||
args.games_only = True
|
||||
elif choice == 4: # League structure only
|
||||
elif choice == 4: # Games - select specific files
|
||||
args.games_only = True
|
||||
selected_game_files = show_game_files_menu(Path(args.data_dir))
|
||||
if not selected_game_files:
|
||||
print("No files selected. Exiting.")
|
||||
return
|
||||
elif choice == 5: # League structure only
|
||||
args.league_structure_only = True
|
||||
elif choice == 5: # Team aliases only
|
||||
elif choice == 6: # Team aliases only
|
||||
args.team_aliases_only = True
|
||||
elif choice == 6: # Stadium aliases only
|
||||
elif choice == 7: # Stadium aliases only
|
||||
args.stadium_aliases_only = True
|
||||
elif choice == 7: # Canonical only
|
||||
elif choice == 8: # Canonical only
|
||||
args.canonical_only = True
|
||||
elif choice == 8: # Delete all then import
|
||||
elif choice == 9: # Delete all then import
|
||||
args.delete_all = True
|
||||
elif choice == 9: # Delete only
|
||||
elif choice == 10: # Delete only
|
||||
args.delete_only = True
|
||||
elif choice == 10: # Dry run
|
||||
elif choice == 11: # Dry run
|
||||
args.dry_run = True
|
||||
|
||||
print(f"\n{'='*50}")
|
||||
@@ -332,12 +418,34 @@ def main():
|
||||
else:
|
||||
teams = [] # Legacy: extracted from stadiums
|
||||
|
||||
if (data_dir / 'games_canonical.json').exists():
|
||||
# Load games: try new structure first (canonical/games/*.json), then fallback
|
||||
canonical_games_dir = data_dir / 'canonical' / 'games'
|
||||
games = []
|
||||
games_source = None
|
||||
|
||||
if selected_game_files:
|
||||
# Load only the selected files
|
||||
for filename in selected_game_files:
|
||||
filepath = canonical_games_dir / filename
|
||||
if filepath.exists():
|
||||
with open(filepath) as f:
|
||||
file_games = json.load(f)
|
||||
games.extend(file_games)
|
||||
print(f" Loading {filename}: {len(file_games):,} games")
|
||||
games_source = f"selected files: {', '.join(selected_game_files)}"
|
||||
elif canonical_games_dir.exists() and any(canonical_games_dir.glob('*.json')):
|
||||
# New structure: load all sport/season files
|
||||
for games_file in sorted(canonical_games_dir.glob('*.json')):
|
||||
with open(games_file) as f:
|
||||
file_games = json.load(f)
|
||||
games.extend(file_games)
|
||||
games_source = "canonical/games/*.json"
|
||||
elif (data_dir / 'games_canonical.json').exists():
|
||||
games = json.load(open(data_dir / 'games_canonical.json'))
|
||||
games_source = "games_canonical.json"
|
||||
elif (data_dir / 'games.json').exists():
|
||||
games = json.load(open(data_dir / 'games.json'))
|
||||
else:
|
||||
games = []
|
||||
games_source = "games.json (legacy)"
|
||||
|
||||
league_structure = json.load(open(data_dir / 'league_structure.json')) if (data_dir / 'league_structure.json').exists() else []
|
||||
team_aliases = json.load(open(data_dir / 'team_aliases.json')) if (data_dir / 'team_aliases.json').exists() else []
|
||||
@@ -345,6 +453,8 @@ def main():
|
||||
|
||||
print(f"Using {'canonical' if use_canonical else 'legacy'} format")
|
||||
print(f"Loaded {len(stadiums)} stadiums, {len(teams)} teams, {len(games)} games")
|
||||
if games_source:
|
||||
print(f" Games loaded from: {games_source}")
|
||||
print(f"Loaded {len(league_structure)} league structures, {len(team_aliases)} team aliases, {len(stadium_aliases)} stadium aliases\n")
|
||||
|
||||
ck = None
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,10 +3,10 @@
|
||||
"error_count": 0,
|
||||
"warning_count": 0,
|
||||
"summary": {
|
||||
"stadiums": 92,
|
||||
"stadiums": 148,
|
||||
"teams": 92,
|
||||
"games": 4972,
|
||||
"aliases": 130,
|
||||
"games": 0,
|
||||
"aliases": 194,
|
||||
"by_category": {}
|
||||
},
|
||||
"errors": []
|
||||
|
||||
+5769
-4973
File diff suppressed because it is too large
Load Diff
+12624
-684
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+1
-59666
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,205 @@
|
||||
{
|
||||
"generated_at": "2026-01-09T19:16:47.175229",
|
||||
"season": 2026,
|
||||
"sport": "all",
|
||||
"summary": {
|
||||
"games_scraped": 5768,
|
||||
"stadiums_scraped": 180,
|
||||
"games_by_sport": {
|
||||
"NBA": 1230,
|
||||
"MLB": 2430,
|
||||
"NHL": 1312,
|
||||
"NFL": 286,
|
||||
"WNBA": 0,
|
||||
"MLS": 510,
|
||||
"NWSL": 0,
|
||||
"CBB": 0
|
||||
},
|
||||
"high_severity": 0,
|
||||
"medium_severity": 0,
|
||||
"low_severity": 30
|
||||
},
|
||||
"game_validations": [],
|
||||
"stadium_issues": [
|
||||
{
|
||||
"stadium": "State Farm Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "TD Garden",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Barclays Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Spectrum Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "United Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Rocket Mortgage FieldHouse",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "American Airlines Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Ball Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Little Caesars Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Chase Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Toyota Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Gainbridge Fieldhouse",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Intuit Dome",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Crypto.com Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "FedExForum",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Kaseya Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Fiserv Forum",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Target Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Smoothie King Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Madison Square Garden",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Paycom Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Kia Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Wells Fargo Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Footprint Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Moda Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Golden 1 Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Frost Bank Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Scotiabank Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Delta Center",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"stadium": "Capital One Arena",
|
||||
"sport": "NBA",
|
||||
"issue": "Missing capacity",
|
||||
"severity": "low"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -575,6 +575,390 @@
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "gateway center arena",
|
||||
"stadium_canonical_id": "stadium_wnba_gateway_center_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "wintrust arena",
|
||||
"stadium_canonical_id": "stadium_wnba_wintrust_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "mohegan sun arena",
|
||||
"stadium_canonical_id": "stadium_wnba_mohegan_sun_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "college park center",
|
||||
"stadium_canonical_id": "stadium_wnba_college_park_center",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "chase center",
|
||||
"stadium_canonical_id": "stadium_wnba_chase_center",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "gainbridge fieldhouse",
|
||||
"stadium_canonical_id": "stadium_wnba_gainbridge_fieldhouse",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "michelob ultra arena",
|
||||
"stadium_canonical_id": "stadium_wnba_michelob_ultra_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "crypto.com arena",
|
||||
"stadium_canonical_id": "stadium_wnba_cryptocom_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "cryptocom arena",
|
||||
"stadium_canonical_id": "stadium_wnba_cryptocom_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "target center",
|
||||
"stadium_canonical_id": "stadium_wnba_target_center",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "barclays center",
|
||||
"stadium_canonical_id": "stadium_wnba_barclays_center",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "footprint center",
|
||||
"stadium_canonical_id": "stadium_wnba_footprint_center",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "climate pledge arena",
|
||||
"stadium_canonical_id": "stadium_wnba_climate_pledge_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "entertainment & sports arena",
|
||||
"stadium_canonical_id": "stadium_wnba_entertainment_sports_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "entertainment sports arena",
|
||||
"stadium_canonical_id": "stadium_wnba_entertainment_sports_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "mercedes-benz stadium",
|
||||
"stadium_canonical_id": "stadium_mls_mercedesbenz_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "mercedesbenz stadium",
|
||||
"stadium_canonical_id": "stadium_mls_mercedesbenz_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "q2 stadium",
|
||||
"stadium_canonical_id": "stadium_mls_q2_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "bank of america stadium",
|
||||
"stadium_canonical_id": "stadium_mls_bank_of_america_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "soldier field",
|
||||
"stadium_canonical_id": "stadium_mls_soldier_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "tql stadium",
|
||||
"stadium_canonical_id": "stadium_mls_tql_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "dick's sporting goods park",
|
||||
"stadium_canonical_id": "stadium_mls_dicks_sporting_goods_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "dicks sporting goods park",
|
||||
"stadium_canonical_id": "stadium_mls_dicks_sporting_goods_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "lower.com field",
|
||||
"stadium_canonical_id": "stadium_mls_lowercom_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "lowercom field",
|
||||
"stadium_canonical_id": "stadium_mls_lowercom_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "toyota stadium",
|
||||
"stadium_canonical_id": "stadium_mls_toyota_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "audi field",
|
||||
"stadium_canonical_id": "stadium_mls_audi_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "shell energy stadium",
|
||||
"stadium_canonical_id": "stadium_mls_shell_energy_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "dignity health sports park",
|
||||
"stadium_canonical_id": "stadium_mls_dignity_health_sports_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "bmo stadium",
|
||||
"stadium_canonical_id": "stadium_mls_bmo_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "chase stadium",
|
||||
"stadium_canonical_id": "stadium_mls_chase_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "allianz field",
|
||||
"stadium_canonical_id": "stadium_mls_allianz_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "stade saputo",
|
||||
"stadium_canonical_id": "stadium_mls_stade_saputo",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "geodis park",
|
||||
"stadium_canonical_id": "stadium_mls_geodis_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "gillette stadium",
|
||||
"stadium_canonical_id": "stadium_mls_gillette_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "yankee stadium",
|
||||
"stadium_canonical_id": "stadium_mls_yankee_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "red bull arena",
|
||||
"stadium_canonical_id": "stadium_mls_red_bull_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "inter&co stadium",
|
||||
"stadium_canonical_id": "stadium_mls_interco_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "interco stadium",
|
||||
"stadium_canonical_id": "stadium_mls_interco_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "subaru park",
|
||||
"stadium_canonical_id": "stadium_mls_subaru_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "providence park",
|
||||
"stadium_canonical_id": "stadium_mls_providence_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "america first field",
|
||||
"stadium_canonical_id": "stadium_mls_america_first_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "paypal park",
|
||||
"stadium_canonical_id": "stadium_mls_paypal_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "lumen field",
|
||||
"stadium_canonical_id": "stadium_mls_lumen_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "children's mercy park",
|
||||
"stadium_canonical_id": "stadium_mls_childrens_mercy_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "childrens mercy park",
|
||||
"stadium_canonical_id": "stadium_mls_childrens_mercy_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "citypark",
|
||||
"stadium_canonical_id": "stadium_mls_citypark",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "bmo field",
|
||||
"stadium_canonical_id": "stadium_mls_bmo_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "bc place",
|
||||
"stadium_canonical_id": "stadium_mls_bc_place",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "snapdragon stadium",
|
||||
"stadium_canonical_id": "stadium_mls_snapdragon_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "bmo stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_bmo_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "paypal park",
|
||||
"stadium_canonical_id": "stadium_nwsl_paypal_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "seatgeek stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_seatgeek_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "shell energy stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_shell_energy_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "cpkc stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_cpkc_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "red bull arena",
|
||||
"stadium_canonical_id": "stadium_nwsl_red_bull_arena",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "wakemed soccer park",
|
||||
"stadium_canonical_id": "stadium_nwsl_wakemed_soccer_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "inter&co stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_interco_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "interco stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_interco_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "providence park",
|
||||
"stadium_canonical_id": "stadium_nwsl_providence_park",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "lumen field",
|
||||
"stadium_canonical_id": "stadium_nwsl_lumen_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "snapdragon stadium",
|
||||
"stadium_canonical_id": "stadium_nwsl_snapdragon_stadium",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "america first field",
|
||||
"stadium_canonical_id": "stadium_nwsl_america_first_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "audi field",
|
||||
"stadium_canonical_id": "stadium_nwsl_audi_field",
|
||||
"valid_from": null,
|
||||
"valid_until": null
|
||||
},
|
||||
{
|
||||
"alias_name": "daikin park",
|
||||
"stadium_canonical_id": "stadium_mlb_minute_maid_park",
|
||||
|
||||
+181
-93
@@ -1,93 +1,181 @@
|
||||
id,name,city,state,latitude,longitude,capacity,sport,team_abbrevs,source,year_opened
|
||||
manual_nba_atl,State Farm Arena,Atlanta,,33.7573,-84.3963,0,NBA,['ATL'],manual,
|
||||
manual_nba_bos,TD Garden,Boston,,42.3662,-71.0621,0,NBA,['BOS'],manual,
|
||||
manual_nba_brk,Barclays Center,Brooklyn,,40.6826,-73.9754,0,NBA,['BRK'],manual,
|
||||
manual_nba_cho,Spectrum Center,Charlotte,,35.2251,-80.8392,0,NBA,['CHO'],manual,
|
||||
manual_nba_chi,United Center,Chicago,,41.8807,-87.6742,0,NBA,['CHI'],manual,
|
||||
manual_nba_cle,Rocket Mortgage FieldHouse,Cleveland,,41.4965,-81.6882,0,NBA,['CLE'],manual,
|
||||
manual_nba_dal,American Airlines Center,Dallas,,32.7905,-96.8103,0,NBA,['DAL'],manual,
|
||||
manual_nba_den,Ball Arena,Denver,,39.7487,-105.0077,0,NBA,['DEN'],manual,
|
||||
manual_nba_det,Little Caesars Arena,Detroit,,42.3411,-83.0553,0,NBA,['DET'],manual,
|
||||
manual_nba_gsw,Chase Center,San Francisco,,37.768,-122.3879,0,NBA,['GSW'],manual,
|
||||
manual_nba_hou,Toyota Center,Houston,,29.7508,-95.3621,0,NBA,['HOU'],manual,
|
||||
manual_nba_ind,Gainbridge Fieldhouse,Indianapolis,,39.764,-86.1555,0,NBA,['IND'],manual,
|
||||
manual_nba_lac,Intuit Dome,Inglewood,,33.9425,-118.3419,0,NBA,['LAC'],manual,
|
||||
manual_nba_lal,Crypto.com Arena,Los Angeles,,34.043,-118.2673,0,NBA,['LAL'],manual,
|
||||
manual_nba_mem,FedExForum,Memphis,,35.1382,-90.0506,0,NBA,['MEM'],manual,
|
||||
manual_nba_mia,Kaseya Center,Miami,,25.7814,-80.187,0,NBA,['MIA'],manual,
|
||||
manual_nba_mil,Fiserv Forum,Milwaukee,,43.0451,-87.9174,0,NBA,['MIL'],manual,
|
||||
manual_nba_min,Target Center,Minneapolis,,44.9795,-93.2761,0,NBA,['MIN'],manual,
|
||||
manual_nba_nop,Smoothie King Center,New Orleans,,29.949,-90.0821,0,NBA,['NOP'],manual,
|
||||
manual_nba_nyk,Madison Square Garden,New York,,40.7505,-73.9934,0,NBA,['NYK'],manual,
|
||||
manual_nba_okc,Paycom Center,Oklahoma City,,35.4634,-97.5151,0,NBA,['OKC'],manual,
|
||||
manual_nba_orl,Kia Center,Orlando,,28.5392,-81.3839,0,NBA,['ORL'],manual,
|
||||
manual_nba_phi,Wells Fargo Center,Philadelphia,,39.9012,-75.172,0,NBA,['PHI'],manual,
|
||||
manual_nba_pho,Footprint Center,Phoenix,,33.4457,-112.0712,0,NBA,['PHO'],manual,
|
||||
manual_nba_por,Moda Center,Portland,,45.5316,-122.6668,0,NBA,['POR'],manual,
|
||||
manual_nba_sac,Golden 1 Center,Sacramento,,38.5802,-121.4997,0,NBA,['SAC'],manual,
|
||||
manual_nba_sas,Frost Bank Center,San Antonio,,29.427,-98.4375,0,NBA,['SAS'],manual,
|
||||
manual_nba_tor,Scotiabank Arena,Toronto,,43.6435,-79.3791,0,NBA,['TOR'],manual,
|
||||
manual_nba_uta,Delta Center,Salt Lake City,,40.7683,-111.9011,0,NBA,['UTA'],manual,
|
||||
manual_nba_was,Capital One Arena,Washington,,38.8982,-77.0209,0,NBA,['WAS'],manual,
|
||||
manual_mlb_ari,Chase Field,Phoenix,AZ,33.4453,-112.0667,48686,MLB,['ARI'],manual,
|
||||
manual_mlb_atl,Truist Park,Atlanta,GA,33.8907,-84.4678,41084,MLB,['ATL'],manual,
|
||||
manual_mlb_bal,Oriole Park at Camden Yards,Baltimore,MD,39.2838,-76.6218,45971,MLB,['BAL'],manual,
|
||||
manual_mlb_bos,Fenway Park,Boston,MA,42.3467,-71.0972,37755,MLB,['BOS'],manual,
|
||||
manual_mlb_chc,Wrigley Field,Chicago,IL,41.9484,-87.6553,41649,MLB,['CHC'],manual,
|
||||
manual_mlb_chw,Guaranteed Rate Field,Chicago,IL,41.8299,-87.6338,40615,MLB,['CHW'],manual,
|
||||
manual_mlb_cin,Great American Ball Park,Cincinnati,OH,39.0979,-84.5082,42319,MLB,['CIN'],manual,
|
||||
manual_mlb_cle,Progressive Field,Cleveland,OH,41.4962,-81.6852,34830,MLB,['CLE'],manual,
|
||||
manual_mlb_col,Coors Field,Denver,CO,39.7559,-104.9942,50144,MLB,['COL'],manual,
|
||||
manual_mlb_det,Comerica Park,Detroit,MI,42.339,-83.0485,41083,MLB,['DET'],manual,
|
||||
manual_mlb_hou,Minute Maid Park,Houston,TX,29.7573,-95.3555,41168,MLB,['HOU'],manual,
|
||||
manual_mlb_kcr,Kauffman Stadium,Kansas City,MO,39.0517,-94.4803,37903,MLB,['KCR'],manual,
|
||||
manual_mlb_laa,Angel Stadium,Anaheim,CA,33.8003,-117.8827,45517,MLB,['LAA'],manual,
|
||||
manual_mlb_lad,Dodger Stadium,Los Angeles,CA,34.0739,-118.24,56000,MLB,['LAD'],manual,
|
||||
manual_mlb_mia,LoanDepot Park,Miami,FL,25.7781,-80.2196,36742,MLB,['MIA'],manual,
|
||||
manual_mlb_mil,American Family Field,Milwaukee,WI,43.028,-87.9712,41900,MLB,['MIL'],manual,
|
||||
manual_mlb_min,Target Field,Minneapolis,MN,44.9817,-93.2776,38544,MLB,['MIN'],manual,
|
||||
manual_mlb_nym,Citi Field,New York,NY,40.7571,-73.8458,41922,MLB,['NYM'],manual,
|
||||
manual_mlb_nyy,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLB,['NYY'],manual,
|
||||
manual_mlb_oak,Sutter Health Park,Sacramento,CA,38.5802,-121.5097,14014,MLB,['OAK'],manual,
|
||||
manual_mlb_phi,Citizens Bank Park,Philadelphia,PA,39.9061,-75.1665,42792,MLB,['PHI'],manual,
|
||||
manual_mlb_pit,PNC Park,Pittsburgh,PA,40.4469,-80.0057,38362,MLB,['PIT'],manual,
|
||||
manual_mlb_sdp,Petco Park,San Diego,CA,32.7076,-117.157,40209,MLB,['SDP'],manual,
|
||||
manual_mlb_sfg,Oracle Park,San Francisco,CA,37.7786,-122.3893,41265,MLB,['SFG'],manual,
|
||||
manual_mlb_sea,T-Mobile Park,Seattle,WA,47.5914,-122.3325,47929,MLB,['SEA'],manual,
|
||||
manual_mlb_stl,Busch Stadium,St. Louis,MO,38.6226,-90.1928,45494,MLB,['STL'],manual,
|
||||
manual_mlb_tbr,Tropicana Field,St. Petersburg,FL,27.7682,-82.6534,25000,MLB,['TBR'],manual,
|
||||
manual_mlb_tex,Globe Life Field,Arlington,TX,32.7473,-97.0845,40300,MLB,['TEX'],manual,
|
||||
manual_mlb_tor,Rogers Centre,Toronto,ON,43.6414,-79.3894,49282,MLB,['TOR'],manual,
|
||||
manual_mlb_wsn,Nationals Park,Washington,DC,38.873,-77.0074,41339,MLB,['WSN'],manual,
|
||||
manual_nhl_ana,Honda Center,Anaheim,CA,33.8078,-117.8765,17174,NHL,['ANA'],manual,
|
||||
manual_nhl_ari,Delta Center,Salt Lake City,UT,40.7683,-111.9011,18306,NHL,['ARI'],manual,
|
||||
manual_nhl_bos,TD Garden,Boston,MA,42.3662,-71.0621,17565,NHL,['BOS'],manual,
|
||||
manual_nhl_buf,KeyBank Center,Buffalo,NY,42.875,-78.8764,19070,NHL,['BUF'],manual,
|
||||
manual_nhl_cgy,Scotiabank Saddledome,Calgary,AB,51.0374,-114.0519,19289,NHL,['CGY'],manual,
|
||||
manual_nhl_car,PNC Arena,Raleigh,NC,35.8034,-78.722,18680,NHL,['CAR'],manual,
|
||||
manual_nhl_chi,United Center,Chicago,IL,41.8807,-87.6742,19717,NHL,['CHI'],manual,
|
||||
manual_nhl_col,Ball Arena,Denver,CO,39.7487,-105.0077,18007,NHL,['COL'],manual,
|
||||
manual_nhl_cbj,Nationwide Arena,Columbus,OH,39.9693,-83.0061,18500,NHL,['CBJ'],manual,
|
||||
manual_nhl_dal,American Airlines Center,Dallas,TX,32.7905,-96.8103,18532,NHL,['DAL'],manual,
|
||||
manual_nhl_det,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,19515,NHL,['DET'],manual,
|
||||
manual_nhl_edm,Rogers Place,Edmonton,AB,53.5469,-113.4978,18347,NHL,['EDM'],manual,
|
||||
manual_nhl_fla,Amerant Bank Arena,Sunrise,FL,26.1584,-80.3256,19250,NHL,['FLA'],manual,
|
||||
manual_nhl_lak,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18230,NHL,['LAK'],manual,
|
||||
manual_nhl_min,Xcel Energy Center,St. Paul,MN,44.9448,-93.101,17954,NHL,['MIN'],manual,
|
||||
manual_nhl_mtl,Bell Centre,Montreal,QC,45.4961,-73.5693,21302,NHL,['MTL'],manual,
|
||||
manual_nhl_nsh,Bridgestone Arena,Nashville,TN,36.1592,-86.7785,17159,NHL,['NSH'],manual,
|
||||
manual_nhl_njd,Prudential Center,Newark,NJ,40.7334,-74.1712,16514,NHL,['NJD'],manual,
|
||||
manual_nhl_nyi,UBS Arena,Elmont,NY,40.7161,-73.7246,17255,NHL,['NYI'],manual,
|
||||
manual_nhl_nyr,Madison Square Garden,New York,NY,40.7505,-73.9934,18006,NHL,['NYR'],manual,
|
||||
manual_nhl_ott,Canadian Tire Centre,Ottawa,ON,45.2969,-75.9272,18652,NHL,['OTT'],manual,
|
||||
manual_nhl_phi,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,19543,NHL,['PHI'],manual,
|
||||
manual_nhl_pit,PPG Paints Arena,Pittsburgh,PA,40.4395,-79.9892,18387,NHL,['PIT'],manual,
|
||||
manual_nhl_sjs,SAP Center,San Jose,CA,37.3327,-121.901,17562,NHL,['SJS'],manual,
|
||||
manual_nhl_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,NHL,['SEA'],manual,
|
||||
manual_nhl_stl,Enterprise Center,St. Louis,MO,38.6268,-90.2025,18096,NHL,['STL'],manual,
|
||||
manual_nhl_tbl,Amalie Arena,Tampa,FL,27.9426,-82.4519,19092,NHL,['TBL'],manual,
|
||||
manual_nhl_tor,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,18819,NHL,['TOR'],manual,
|
||||
manual_nhl_van,Rogers Arena,Vancouver,BC,49.2778,-123.1089,18910,NHL,['VAN'],manual,
|
||||
manual_nhl_vgk,T-Mobile Arena,Las Vegas,NV,36.1028,-115.1784,17500,NHL,['VGK'],manual,
|
||||
manual_nhl_wsh,Capital One Arena,Washington,DC,38.8982,-77.0209,18573,NHL,['WSH'],manual,
|
||||
manual_nhl_wpg,Canada Life Centre,Winnipeg,MB,49.8928,-97.1436,15321,NHL,['WPG'],manual,
|
||||
id,name,city,state,latitude,longitude,capacity,sport,team_abbrevs,source,year_opened
|
||||
manual_nba_atl,State Farm Arena,Atlanta,,33.7573,-84.3963,0,NBA,['ATL'],manual,
|
||||
manual_nba_bos,TD Garden,Boston,,42.3662,-71.0621,0,NBA,['BOS'],manual,
|
||||
manual_nba_brk,Barclays Center,Brooklyn,,40.6826,-73.9754,0,NBA,['BRK'],manual,
|
||||
manual_nba_cho,Spectrum Center,Charlotte,,35.2251,-80.8392,0,NBA,['CHO'],manual,
|
||||
manual_nba_chi,United Center,Chicago,,41.8807,-87.6742,0,NBA,['CHI'],manual,
|
||||
manual_nba_cle,Rocket Mortgage FieldHouse,Cleveland,,41.4965,-81.6882,0,NBA,['CLE'],manual,
|
||||
manual_nba_dal,American Airlines Center,Dallas,,32.7905,-96.8103,0,NBA,['DAL'],manual,
|
||||
manual_nba_den,Ball Arena,Denver,,39.7487,-105.0077,0,NBA,['DEN'],manual,
|
||||
manual_nba_det,Little Caesars Arena,Detroit,,42.3411,-83.0553,0,NBA,['DET'],manual,
|
||||
manual_nba_gsw,Chase Center,San Francisco,,37.768,-122.3879,0,NBA,['GSW'],manual,
|
||||
manual_nba_hou,Toyota Center,Houston,,29.7508,-95.3621,0,NBA,['HOU'],manual,
|
||||
manual_nba_ind,Gainbridge Fieldhouse,Indianapolis,,39.764,-86.1555,0,NBA,['IND'],manual,
|
||||
manual_nba_lac,Intuit Dome,Inglewood,,33.9425,-118.3419,0,NBA,['LAC'],manual,
|
||||
manual_nba_lal,Crypto.com Arena,Los Angeles,,34.043,-118.2673,0,NBA,['LAL'],manual,
|
||||
manual_nba_mem,FedExForum,Memphis,,35.1382,-90.0506,0,NBA,['MEM'],manual,
|
||||
manual_nba_mia,Kaseya Center,Miami,,25.7814,-80.187,0,NBA,['MIA'],manual,
|
||||
manual_nba_mil,Fiserv Forum,Milwaukee,,43.0451,-87.9174,0,NBA,['MIL'],manual,
|
||||
manual_nba_min,Target Center,Minneapolis,,44.9795,-93.2761,0,NBA,['MIN'],manual,
|
||||
manual_nba_nop,Smoothie King Center,New Orleans,,29.949,-90.0821,0,NBA,['NOP'],manual,
|
||||
manual_nba_nyk,Madison Square Garden,New York,,40.7505,-73.9934,0,NBA,['NYK'],manual,
|
||||
manual_nba_okc,Paycom Center,Oklahoma City,,35.4634,-97.5151,0,NBA,['OKC'],manual,
|
||||
manual_nba_orl,Kia Center,Orlando,,28.5392,-81.3839,0,NBA,['ORL'],manual,
|
||||
manual_nba_phi,Wells Fargo Center,Philadelphia,,39.9012,-75.172,0,NBA,['PHI'],manual,
|
||||
manual_nba_pho,Footprint Center,Phoenix,,33.4457,-112.0712,0,NBA,['PHO'],manual,
|
||||
manual_nba_por,Moda Center,Portland,,45.5316,-122.6668,0,NBA,['POR'],manual,
|
||||
manual_nba_sac,Golden 1 Center,Sacramento,,38.5802,-121.4997,0,NBA,['SAC'],manual,
|
||||
manual_nba_sas,Frost Bank Center,San Antonio,,29.427,-98.4375,0,NBA,['SAS'],manual,
|
||||
manual_nba_tor,Scotiabank Arena,Toronto,,43.6435,-79.3791,0,NBA,['TOR'],manual,
|
||||
manual_nba_uta,Delta Center,Salt Lake City,,40.7683,-111.9011,0,NBA,['UTA'],manual,
|
||||
manual_nba_was,Capital One Arena,Washington,,38.8982,-77.0209,0,NBA,['WAS'],manual,
|
||||
manual_mlb_ari,Chase Field,Phoenix,AZ,33.4453,-112.0667,48686,MLB,['ARI'],manual,
|
||||
manual_mlb_atl,Truist Park,Atlanta,GA,33.8907,-84.4678,41084,MLB,['ATL'],manual,
|
||||
manual_mlb_bal,Oriole Park at Camden Yards,Baltimore,MD,39.2838,-76.6218,45971,MLB,['BAL'],manual,
|
||||
manual_mlb_bos,Fenway Park,Boston,MA,42.3467,-71.0972,37755,MLB,['BOS'],manual,
|
||||
manual_mlb_chc,Wrigley Field,Chicago,IL,41.9484,-87.6553,41649,MLB,['CHC'],manual,
|
||||
manual_mlb_chw,Guaranteed Rate Field,Chicago,IL,41.8299,-87.6338,40615,MLB,['CHW'],manual,
|
||||
manual_mlb_cin,Great American Ball Park,Cincinnati,OH,39.0979,-84.5082,42319,MLB,['CIN'],manual,
|
||||
manual_mlb_cle,Progressive Field,Cleveland,OH,41.4962,-81.6852,34830,MLB,['CLE'],manual,
|
||||
manual_mlb_col,Coors Field,Denver,CO,39.7559,-104.9942,50144,MLB,['COL'],manual,
|
||||
manual_mlb_det,Comerica Park,Detroit,MI,42.339,-83.0485,41083,MLB,['DET'],manual,
|
||||
manual_mlb_hou,Minute Maid Park,Houston,TX,29.7573,-95.3555,41168,MLB,['HOU'],manual,
|
||||
manual_mlb_kcr,Kauffman Stadium,Kansas City,MO,39.0517,-94.4803,37903,MLB,['KCR'],manual,
|
||||
manual_mlb_laa,Angel Stadium,Anaheim,CA,33.8003,-117.8827,45517,MLB,['LAA'],manual,
|
||||
manual_mlb_lad,Dodger Stadium,Los Angeles,CA,34.0739,-118.24,56000,MLB,['LAD'],manual,
|
||||
manual_mlb_mia,LoanDepot Park,Miami,FL,25.7781,-80.2196,36742,MLB,['MIA'],manual,
|
||||
manual_mlb_mil,American Family Field,Milwaukee,WI,43.028,-87.9712,41900,MLB,['MIL'],manual,
|
||||
manual_mlb_min,Target Field,Minneapolis,MN,44.9817,-93.2776,38544,MLB,['MIN'],manual,
|
||||
manual_mlb_nym,Citi Field,New York,NY,40.7571,-73.8458,41922,MLB,['NYM'],manual,
|
||||
manual_mlb_nyy,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLB,['NYY'],manual,
|
||||
manual_mlb_oak,Sutter Health Park,Sacramento,CA,38.5802,-121.5097,14014,MLB,['OAK'],manual,
|
||||
manual_mlb_phi,Citizens Bank Park,Philadelphia,PA,39.9061,-75.1665,42792,MLB,['PHI'],manual,
|
||||
manual_mlb_pit,PNC Park,Pittsburgh,PA,40.4469,-80.0057,38362,MLB,['PIT'],manual,
|
||||
manual_mlb_sdp,Petco Park,San Diego,CA,32.7076,-117.157,40209,MLB,['SDP'],manual,
|
||||
manual_mlb_sfg,Oracle Park,San Francisco,CA,37.7786,-122.3893,41265,MLB,['SFG'],manual,
|
||||
manual_mlb_sea,T-Mobile Park,Seattle,WA,47.5914,-122.3325,47929,MLB,['SEA'],manual,
|
||||
manual_mlb_stl,Busch Stadium,St. Louis,MO,38.6226,-90.1928,45494,MLB,['STL'],manual,
|
||||
manual_mlb_tbr,Tropicana Field,St. Petersburg,FL,27.7682,-82.6534,25000,MLB,['TBR'],manual,
|
||||
manual_mlb_tex,Globe Life Field,Arlington,TX,32.7473,-97.0845,40300,MLB,['TEX'],manual,
|
||||
manual_mlb_tor,Rogers Centre,Toronto,ON,43.6414,-79.3894,49282,MLB,['TOR'],manual,
|
||||
manual_mlb_wsn,Nationals Park,Washington,DC,38.873,-77.0074,41339,MLB,['WSN'],manual,
|
||||
manual_nhl_ana,Honda Center,Anaheim,CA,33.8078,-117.8765,17174,NHL,['ANA'],manual,
|
||||
manual_nhl_ari,Delta Center,Salt Lake City,UT,40.7683,-111.9011,18306,NHL,['ARI'],manual,
|
||||
manual_nhl_bos,TD Garden,Boston,MA,42.3662,-71.0621,17565,NHL,['BOS'],manual,
|
||||
manual_nhl_buf,KeyBank Center,Buffalo,NY,42.875,-78.8764,19070,NHL,['BUF'],manual,
|
||||
manual_nhl_cgy,Scotiabank Saddledome,Calgary,AB,51.0374,-114.0519,19289,NHL,['CGY'],manual,
|
||||
manual_nhl_car,PNC Arena,Raleigh,NC,35.8034,-78.722,18680,NHL,['CAR'],manual,
|
||||
manual_nhl_chi,United Center,Chicago,IL,41.8807,-87.6742,19717,NHL,['CHI'],manual,
|
||||
manual_nhl_col,Ball Arena,Denver,CO,39.7487,-105.0077,18007,NHL,['COL'],manual,
|
||||
manual_nhl_cbj,Nationwide Arena,Columbus,OH,39.9693,-83.0061,18500,NHL,['CBJ'],manual,
|
||||
manual_nhl_dal,American Airlines Center,Dallas,TX,32.7905,-96.8103,18532,NHL,['DAL'],manual,
|
||||
manual_nhl_det,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,19515,NHL,['DET'],manual,
|
||||
manual_nhl_edm,Rogers Place,Edmonton,AB,53.5469,-113.4978,18347,NHL,['EDM'],manual,
|
||||
manual_nhl_fla,Amerant Bank Arena,Sunrise,FL,26.1584,-80.3256,19250,NHL,['FLA'],manual,
|
||||
manual_nhl_lak,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18230,NHL,['LAK'],manual,
|
||||
manual_nhl_min,Xcel Energy Center,St. Paul,MN,44.9448,-93.101,17954,NHL,['MIN'],manual,
|
||||
manual_nhl_mtl,Bell Centre,Montreal,QC,45.4961,-73.5693,21302,NHL,['MTL'],manual,
|
||||
manual_nhl_nsh,Bridgestone Arena,Nashville,TN,36.1592,-86.7785,17159,NHL,['NSH'],manual,
|
||||
manual_nhl_njd,Prudential Center,Newark,NJ,40.7334,-74.1712,16514,NHL,['NJD'],manual,
|
||||
manual_nhl_nyi,UBS Arena,Elmont,NY,40.7161,-73.7246,17255,NHL,['NYI'],manual,
|
||||
manual_nhl_nyr,Madison Square Garden,New York,NY,40.7505,-73.9934,18006,NHL,['NYR'],manual,
|
||||
manual_nhl_ott,Canadian Tire Centre,Ottawa,ON,45.2969,-75.9272,18652,NHL,['OTT'],manual,
|
||||
manual_nhl_phi,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,19543,NHL,['PHI'],manual,
|
||||
manual_nhl_pit,PPG Paints Arena,Pittsburgh,PA,40.4395,-79.9892,18387,NHL,['PIT'],manual,
|
||||
manual_nhl_sjs,SAP Center,San Jose,CA,37.3327,-121.901,17562,NHL,['SJS'],manual,
|
||||
manual_nhl_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,NHL,['SEA'],manual,
|
||||
manual_nhl_stl,Enterprise Center,St. Louis,MO,38.6268,-90.2025,18096,NHL,['STL'],manual,
|
||||
manual_nhl_tbl,Amalie Arena,Tampa,FL,27.9426,-82.4519,19092,NHL,['TBL'],manual,
|
||||
manual_nhl_tor,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,18819,NHL,['TOR'],manual,
|
||||
manual_nhl_van,Rogers Arena,Vancouver,BC,49.2778,-123.1089,18910,NHL,['VAN'],manual,
|
||||
manual_nhl_vgk,T-Mobile Arena,Las Vegas,NV,36.1028,-115.1784,17500,NHL,['VGK'],manual,
|
||||
manual_nhl_wsh,Capital One Arena,Washington,DC,38.8982,-77.0209,18573,NHL,['WSH'],manual,
|
||||
manual_nhl_wpg,Canada Life Centre,Winnipeg,MB,49.8928,-97.1436,15321,NHL,['WPG'],manual,
|
||||
manual_wnba_atl,Gateway Center Arena,College Park,GA,33.6534,-84.448,3500,WNBA,['ATL'],manual,
|
||||
manual_wnba_chi,Wintrust Arena,Chicago,IL,41.8622,-87.6164,10387,WNBA,['CHI'],manual,
|
||||
manual_wnba_con,Mohegan Sun Arena,Uncasville,CT,41.4946,-72.0874,10000,WNBA,['CON'],manual,
|
||||
manual_wnba_dal,College Park Center,Arlington,TX,32.7298,-97.1137,7000,WNBA,['DAL'],manual,
|
||||
manual_wnba_gsv,Chase Center,San Francisco,CA,37.768,-122.3879,18064,WNBA,['GSV'],manual,
|
||||
manual_wnba_ind,Gainbridge Fieldhouse,Indianapolis,IN,39.764,-86.1555,17274,WNBA,['IND'],manual,
|
||||
manual_wnba_lva,Michelob Ultra Arena,Las Vegas,NV,36.0929,-115.1757,12000,WNBA,['LVA'],manual,
|
||||
manual_wnba_las,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,19068,WNBA,['LAS'],manual,
|
||||
manual_wnba_min,Target Center,Minneapolis,MN,44.9795,-93.2761,17500,WNBA,['MIN'],manual,
|
||||
manual_wnba_nyl,Barclays Center,Brooklyn,NY,40.6826,-73.9754,17732,WNBA,['NYL'],manual,
|
||||
manual_wnba_phx,Footprint Center,Phoenix,AZ,33.4457,-112.0712,17000,WNBA,['PHX'],manual,
|
||||
manual_wnba_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,WNBA,['SEA'],manual,
|
||||
manual_wnba_was,Entertainment & Sports Arena,Washington,DC,38.8701,-76.9728,4200,WNBA,['WAS'],manual,
|
||||
manual_mls_atl,Mercedes-Benz Stadium,Atlanta,GA,33.7553,-84.4006,71000,MLS,['ATL'],manual,
|
||||
manual_mls_atx,Q2 Stadium,Austin,TX,30.3876,-97.72,20738,MLS,['ATX'],manual,
|
||||
manual_mls_clt,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,74867,MLS,['CLT'],manual,
|
||||
manual_mls_chi,Soldier Field,Chicago,IL,41.8623,-87.6167,61500,MLS,['CHI'],manual,
|
||||
manual_mls_cin,TQL Stadium,Cincinnati,OH,39.1113,-84.5212,26000,MLS,['CIN'],manual,
|
||||
manual_mls_col,Dick's Sporting Goods Park,Commerce City,CO,39.8056,-104.8919,18061,MLS,['COL'],manual,
|
||||
manual_mls_clb,Lower.com Field,Columbus,OH,39.9689,-83.0173,20371,MLS,['CLB'],manual,
|
||||
manual_mls_dal,Toyota Stadium,Frisco,TX,33.1546,-96.8353,20500,MLS,['DAL'],manual,
|
||||
manual_mls_dcu,Audi Field,Washington,DC,38.8686,-77.0128,20000,MLS,['DCU'],manual,
|
||||
manual_mls_hou,Shell Energy Stadium,Houston,TX,29.7523,-95.3522,22039,MLS,['HOU'],manual,
|
||||
manual_mls_lag,Dignity Health Sports Park,Carson,CA,33.8644,-118.2611,27000,MLS,['LAG'],manual,
|
||||
manual_mls_lafc,BMO Stadium,Los Angeles,CA,34.0128,-118.2841,22000,MLS,['LAFC'],manual,
|
||||
manual_mls_mia,Chase Stadium,Fort Lauderdale,FL,26.1902,-80.163,21550,MLS,['MIA'],manual,
|
||||
manual_mls_min,Allianz Field,St. Paul,MN,44.9532,-93.1653,19400,MLS,['MIN'],manual,
|
||||
manual_mls_mtl,Stade Saputo,Montreal,QC,45.5628,-73.553,19619,MLS,['MTL'],manual,
|
||||
manual_mls_nsh,Geodis Park,Nashville,TN,36.1303,-86.7663,30000,MLS,['NSH'],manual,
|
||||
manual_mls_ner,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,65878,MLS,['NER'],manual,
|
||||
manual_mls_nyc,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLS,['NYC'],manual,
|
||||
manual_mls_rbny,Red Bull Arena,Harrison,NJ,40.7368,-74.1503,25000,MLS,['RBNY'],manual,
|
||||
manual_mls_orl,Inter&Co Stadium,Orlando,FL,28.5411,-81.3899,25500,MLS,['ORL'],manual,
|
||||
manual_mls_phi,Subaru Park,Chester,PA,39.8328,-75.3789,18500,MLS,['PHI'],manual,
|
||||
manual_mls_por,Providence Park,Portland,OR,45.5217,-122.6917,25218,MLS,['POR'],manual,
|
||||
manual_mls_rsl,America First Field,Sandy,UT,40.5828,-111.8933,20213,MLS,['RSL'],manual,
|
||||
manual_mls_sje,PayPal Park,San Jose,CA,37.3513,-121.9253,18000,MLS,['SJE'],manual,
|
||||
manual_mls_sea,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,MLS,['SEA'],manual,
|
||||
manual_mls_skc,Children's Mercy Park,Kansas City,KS,39.1218,-94.8234,18467,MLS,['SKC'],manual,
|
||||
manual_mls_stl,CityPark,St. Louis,MO,38.6322,-90.2094,22500,MLS,['STL'],manual,
|
||||
manual_mls_tor,BMO Field,Toronto,ON,43.6332,-79.4186,30000,MLS,['TOR'],manual,
|
||||
manual_mls_van,BC Place,Vancouver,BC,49.2768,-123.1118,54320,MLS,['VAN'],manual,
|
||||
manual_mls_sdg,Snapdragon Stadium,San Diego,CA,32.7839,-117.1224,35000,MLS,['SDG'],manual,
|
||||
manual_nwsl_ang,BMO Stadium,Los Angeles,CA,34.0128,-118.2841,22000,NWSL,['ANG'],manual,
|
||||
manual_nwsl_bay,PayPal Park,San Jose,CA,37.3513,-121.9253,18000,NWSL,['BAY'],manual,
|
||||
manual_nwsl_chi,SeatGeek Stadium,Chicago,IL,41.6462,-87.7304,20000,NWSL,['CHI'],manual,
|
||||
manual_nwsl_hou,Shell Energy Stadium,Houston,TX,29.7523,-95.3522,22039,NWSL,['HOU'],manual,
|
||||
manual_nwsl_kcc,CPKC Stadium,Kansas City,KS,39.0851,-94.5582,11500,NWSL,['KCC'],manual,
|
||||
manual_nwsl_njy,Red Bull Arena,Harrison,NJ,40.7368,-74.1503,25000,NWSL,['NJY'],manual,
|
||||
manual_nwsl_ncc,WakeMed Soccer Park,Cary,NC,35.8589,-78.7989,10000,NWSL,['NCC'],manual,
|
||||
manual_nwsl_orl,Inter&Co Stadium,Orlando,FL,28.5411,-81.3899,25500,NWSL,['ORL'],manual,
|
||||
manual_nwsl_por,Providence Park,Portland,OR,45.5217,-122.6917,25218,NWSL,['POR'],manual,
|
||||
manual_nwsl_rgn,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,NWSL,['RGN'],manual,
|
||||
manual_nwsl_sdw,Snapdragon Stadium,San Diego,CA,32.7839,-117.1224,35000,NWSL,['SDW'],manual,
|
||||
manual_nwsl_uta,America First Field,Sandy,UT,40.5828,-111.8933,20213,NWSL,['UTA'],manual,
|
||||
manual_nwsl_wsh,Audi Field,Washington,DC,38.8686,-77.0128,20000,NWSL,['WSH'],manual,
|
||||
manual_nfl_ari,State Farm Stadium,Glendale,AZ,33.5276,-112.2626,63400,NFL,['ARI'],manual,
|
||||
manual_nfl_atl,Mercedes-Benz Stadium,Atlanta,GA,33.7553,-84.4006,71000,NFL,['ATL'],manual,
|
||||
manual_nfl_bal,M&T Bank Stadium,Baltimore,MD,39.278,-76.6227,71008,NFL,['BAL'],manual,
|
||||
manual_nfl_buf,Highmark Stadium,Orchard Park,NY,42.7738,-78.787,71608,NFL,['BUF'],manual,
|
||||
manual_nfl_car,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,74867,NFL,['CAR'],manual,
|
||||
manual_nfl_chi,Soldier Field,Chicago,IL,41.8623,-87.6167,61500,NFL,['CHI'],manual,
|
||||
manual_nfl_cin,Paycor Stadium,Cincinnati,OH,39.0954,-84.516,65515,NFL,['CIN'],manual,
|
||||
manual_nfl_cle,Cleveland Browns Stadium,Cleveland,OH,41.5061,-81.6995,67431,NFL,['CLE'],manual,
|
||||
manual_nfl_dal,AT&T Stadium,Arlington,TX,32.748,-97.0928,80000,NFL,['DAL'],manual,
|
||||
manual_nfl_den,Empower Field at Mile High,Denver,CO,39.7439,-105.0201,76125,NFL,['DEN'],manual,
|
||||
manual_nfl_det,Ford Field,Detroit,MI,42.34,-83.0456,65000,NFL,['DET'],manual,
|
||||
manual_nfl_gb,Lambeau Field,Green Bay,WI,44.5013,-88.0622,81435,NFL,['GB'],manual,
|
||||
manual_nfl_hou,NRG Stadium,Houston,TX,29.6847,-95.4107,72220,NFL,['HOU'],manual,
|
||||
manual_nfl_ind,Lucas Oil Stadium,Indianapolis,IN,39.7601,-86.1639,67000,NFL,['IND'],manual,
|
||||
manual_nfl_jax,EverBank Stadium,Jacksonville,FL,30.3239,-81.6373,67814,NFL,['JAX'],manual,
|
||||
manual_nfl_kc,GEHA Field at Arrowhead Stadium,Kansas City,MO,39.0489,-94.4839,76416,NFL,['KC'],manual,
|
||||
manual_nfl_lv,Allegiant Stadium,Las Vegas,NV,36.0909,-115.1833,65000,NFL,['LV'],manual,
|
||||
manual_nfl_lac,SoFi Stadium,Inglewood,CA,33.9535,-118.3392,70240,NFL,['LAC'],manual,
|
||||
manual_nfl_lar,SoFi Stadium,Inglewood,CA,33.9535,-118.3392,70240,NFL,['LAR'],manual,
|
||||
manual_nfl_mia,Hard Rock Stadium,Miami Gardens,FL,25.958,-80.2389,65326,NFL,['MIA'],manual,
|
||||
manual_nfl_min,U.S. Bank Stadium,Minneapolis,MN,44.9737,-93.2577,66655,NFL,['MIN'],manual,
|
||||
manual_nfl_ne,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,65878,NFL,['NE'],manual,
|
||||
manual_nfl_no,Caesars Superdome,New Orleans,LA,29.9511,-90.0812,73208,NFL,['NO'],manual,
|
||||
manual_nfl_nyg,MetLife Stadium,East Rutherford,NJ,40.8128,-74.0742,82500,NFL,['NYG'],manual,
|
||||
manual_nfl_nyj,MetLife Stadium,East Rutherford,NJ,40.8128,-74.0742,82500,NFL,['NYJ'],manual,
|
||||
manual_nfl_phi,Lincoln Financial Field,Philadelphia,PA,39.9008,-75.1674,69176,NFL,['PHI'],manual,
|
||||
manual_nfl_pit,Acrisure Stadium,Pittsburgh,PA,40.4468,-80.0158,68400,NFL,['PIT'],manual,
|
||||
manual_nfl_sf,Levi's Stadium,Santa Clara,CA,37.4032,-121.9698,68500,NFL,['SF'],manual,
|
||||
manual_nfl_sea,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,NFL,['SEA'],manual,
|
||||
manual_nfl_tb,Raymond James Stadium,Tampa,FL,27.9759,-82.5033,65618,NFL,['TB'],manual,
|
||||
manual_nfl_ten,Nissan Stadium,Nashville,TN,36.1665,-86.7713,69143,NFL,['TEN'],manual,
|
||||
manual_nfl_was,Northwest Stadium,Landover,MD,38.9076,-76.8645,67617,NFL,['WAS'],manual,
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1286,5 +1286,789 @@
|
||||
"WPG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_gateway_center_arena",
|
||||
"name": "Gateway Center Arena",
|
||||
"city": "College Park",
|
||||
"state": "GA",
|
||||
"latitude": 33.6534,
|
||||
"longitude": -84.448,
|
||||
"capacity": 3500,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"ATL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_wintrust_arena",
|
||||
"name": "Wintrust Arena",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.8622,
|
||||
"longitude": -87.6164,
|
||||
"capacity": 10387,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_mohegan_sun_arena",
|
||||
"name": "Mohegan Sun Arena",
|
||||
"city": "Uncasville",
|
||||
"state": "CT",
|
||||
"latitude": 41.4946,
|
||||
"longitude": -72.0874,
|
||||
"capacity": 10000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"CON"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_college_park_center",
|
||||
"name": "College Park Center",
|
||||
"city": "Arlington",
|
||||
"state": "TX",
|
||||
"latitude": 32.7298,
|
||||
"longitude": -97.1137,
|
||||
"capacity": 7000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"DAL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_chase_center",
|
||||
"name": "Chase Center",
|
||||
"city": "San Francisco",
|
||||
"state": "CA",
|
||||
"latitude": 37.768,
|
||||
"longitude": -122.3879,
|
||||
"capacity": 18064,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"GSV"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_gainbridge_fieldhouse",
|
||||
"name": "Gainbridge Fieldhouse",
|
||||
"city": "Indianapolis",
|
||||
"state": "IN",
|
||||
"latitude": 39.764,
|
||||
"longitude": -86.1555,
|
||||
"capacity": 17274,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"IND"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_michelob_ultra_arena",
|
||||
"name": "Michelob Ultra Arena",
|
||||
"city": "Las Vegas",
|
||||
"state": "NV",
|
||||
"latitude": 36.0929,
|
||||
"longitude": -115.1757,
|
||||
"capacity": 12000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"LVA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_cryptocom_arena",
|
||||
"name": "Crypto.com Arena",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.043,
|
||||
"longitude": -118.2673,
|
||||
"capacity": 19068,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"LAS"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_target_center",
|
||||
"name": "Target Center",
|
||||
"city": "Minneapolis",
|
||||
"state": "MN",
|
||||
"latitude": 44.9795,
|
||||
"longitude": -93.2761,
|
||||
"capacity": 17500,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"MIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_barclays_center",
|
||||
"name": "Barclays Center",
|
||||
"city": "Brooklyn",
|
||||
"state": "NY",
|
||||
"latitude": 40.6826,
|
||||
"longitude": -73.9754,
|
||||
"capacity": 17732,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"NYL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_footprint_center",
|
||||
"name": "Footprint Center",
|
||||
"city": "Phoenix",
|
||||
"state": "AZ",
|
||||
"latitude": 33.4457,
|
||||
"longitude": -112.0712,
|
||||
"capacity": 17000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"PHX"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_climate_pledge_arena",
|
||||
"name": "Climate Pledge Arena",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.6221,
|
||||
"longitude": -122.354,
|
||||
"capacity": 17100,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"SEA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_entertainment_sports_arena",
|
||||
"name": "Entertainment & Sports Arena",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8701,
|
||||
"longitude": -76.9728,
|
||||
"capacity": 4200,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"WAS"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_mercedesbenz_stadium",
|
||||
"name": "Mercedes-Benz Stadium",
|
||||
"city": "Atlanta",
|
||||
"state": "GA",
|
||||
"latitude": 33.7553,
|
||||
"longitude": -84.4006,
|
||||
"capacity": 71000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ATL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_q2_stadium",
|
||||
"name": "Q2 Stadium",
|
||||
"city": "Austin",
|
||||
"state": "TX",
|
||||
"latitude": 30.3876,
|
||||
"longitude": -97.72,
|
||||
"capacity": 20738,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ATX"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bank_of_america_stadium",
|
||||
"name": "Bank of America Stadium",
|
||||
"city": "Charlotte",
|
||||
"state": "NC",
|
||||
"latitude": 35.2258,
|
||||
"longitude": -80.8528,
|
||||
"capacity": 74867,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CLT"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_soldier_field",
|
||||
"name": "Soldier Field",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.8623,
|
||||
"longitude": -87.6167,
|
||||
"capacity": 61500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_tql_stadium",
|
||||
"name": "TQL Stadium",
|
||||
"city": "Cincinnati",
|
||||
"state": "OH",
|
||||
"latitude": 39.1113,
|
||||
"longitude": -84.5212,
|
||||
"capacity": 26000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_dicks_sporting_goods_park",
|
||||
"name": "Dick's Sporting Goods Park",
|
||||
"city": "Commerce City",
|
||||
"state": "CO",
|
||||
"latitude": 39.8056,
|
||||
"longitude": -104.8919,
|
||||
"capacity": 18061,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"COL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_lowercom_field",
|
||||
"name": "Lower.com Field",
|
||||
"city": "Columbus",
|
||||
"state": "OH",
|
||||
"latitude": 39.9689,
|
||||
"longitude": -83.0173,
|
||||
"capacity": 20371,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CLB"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_toyota_stadium",
|
||||
"name": "Toyota Stadium",
|
||||
"city": "Frisco",
|
||||
"state": "TX",
|
||||
"latitude": 33.1546,
|
||||
"longitude": -96.8353,
|
||||
"capacity": 20500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"DAL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_audi_field",
|
||||
"name": "Audi Field",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8686,
|
||||
"longitude": -77.0128,
|
||||
"capacity": 20000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"DCU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_shell_energy_stadium",
|
||||
"name": "Shell Energy Stadium",
|
||||
"city": "Houston",
|
||||
"state": "TX",
|
||||
"latitude": 29.7523,
|
||||
"longitude": -95.3522,
|
||||
"capacity": 22039,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"HOU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_dignity_health_sports_park",
|
||||
"name": "Dignity Health Sports Park",
|
||||
"city": "Carson",
|
||||
"state": "CA",
|
||||
"latitude": 33.8644,
|
||||
"longitude": -118.2611,
|
||||
"capacity": 27000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"LAG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bmo_stadium",
|
||||
"name": "BMO Stadium",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.0128,
|
||||
"longitude": -118.2841,
|
||||
"capacity": 22000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"LAFC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_chase_stadium",
|
||||
"name": "Chase Stadium",
|
||||
"city": "Fort Lauderdale",
|
||||
"state": "FL",
|
||||
"latitude": 26.1902,
|
||||
"longitude": -80.163,
|
||||
"capacity": 21550,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MIA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_allianz_field",
|
||||
"name": "Allianz Field",
|
||||
"city": "St. Paul",
|
||||
"state": "MN",
|
||||
"latitude": 44.9532,
|
||||
"longitude": -93.1653,
|
||||
"capacity": 19400,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_stade_saputo",
|
||||
"name": "Stade Saputo",
|
||||
"city": "Montreal",
|
||||
"state": "QC",
|
||||
"latitude": 45.5628,
|
||||
"longitude": -73.553,
|
||||
"capacity": 19619,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MTL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_geodis_park",
|
||||
"name": "Geodis Park",
|
||||
"city": "Nashville",
|
||||
"state": "TN",
|
||||
"latitude": 36.1303,
|
||||
"longitude": -86.7663,
|
||||
"capacity": 30000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NSH"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_gillette_stadium",
|
||||
"name": "Gillette Stadium",
|
||||
"city": "Foxborough",
|
||||
"state": "MA",
|
||||
"latitude": 42.0909,
|
||||
"longitude": -71.2643,
|
||||
"capacity": 65878,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NER"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_yankee_stadium",
|
||||
"name": "Yankee Stadium",
|
||||
"city": "New York",
|
||||
"state": "NY",
|
||||
"latitude": 40.8296,
|
||||
"longitude": -73.9262,
|
||||
"capacity": 46537,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NYC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_red_bull_arena",
|
||||
"name": "Red Bull Arena",
|
||||
"city": "Harrison",
|
||||
"state": "NJ",
|
||||
"latitude": 40.7368,
|
||||
"longitude": -74.1503,
|
||||
"capacity": 25000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"RBNY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_interco_stadium",
|
||||
"name": "Inter&Co Stadium",
|
||||
"city": "Orlando",
|
||||
"state": "FL",
|
||||
"latitude": 28.5411,
|
||||
"longitude": -81.3899,
|
||||
"capacity": 25500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ORL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_subaru_park",
|
||||
"name": "Subaru Park",
|
||||
"city": "Chester",
|
||||
"state": "PA",
|
||||
"latitude": 39.8328,
|
||||
"longitude": -75.3789,
|
||||
"capacity": 18500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"PHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_providence_park",
|
||||
"name": "Providence Park",
|
||||
"city": "Portland",
|
||||
"state": "OR",
|
||||
"latitude": 45.5217,
|
||||
"longitude": -122.6917,
|
||||
"capacity": 25218,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"POR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_america_first_field",
|
||||
"name": "America First Field",
|
||||
"city": "Sandy",
|
||||
"state": "UT",
|
||||
"latitude": 40.5828,
|
||||
"longitude": -111.8933,
|
||||
"capacity": 20213,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"RSL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_paypal_park",
|
||||
"name": "PayPal Park",
|
||||
"city": "San Jose",
|
||||
"state": "CA",
|
||||
"latitude": 37.3513,
|
||||
"longitude": -121.9253,
|
||||
"capacity": 18000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SJE"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_lumen_field",
|
||||
"name": "Lumen Field",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.5952,
|
||||
"longitude": -122.3316,
|
||||
"capacity": 68740,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SEA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_childrens_mercy_park",
|
||||
"name": "Children's Mercy Park",
|
||||
"city": "Kansas City",
|
||||
"state": "KS",
|
||||
"latitude": 39.1218,
|
||||
"longitude": -94.8234,
|
||||
"capacity": 18467,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SKC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_citypark",
|
||||
"name": "CityPark",
|
||||
"city": "St. Louis",
|
||||
"state": "MO",
|
||||
"latitude": 38.6322,
|
||||
"longitude": -90.2094,
|
||||
"capacity": 22500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"STL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bmo_field",
|
||||
"name": "BMO Field",
|
||||
"city": "Toronto",
|
||||
"state": "ON",
|
||||
"latitude": 43.6332,
|
||||
"longitude": -79.4186,
|
||||
"capacity": 30000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"TOR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bc_place",
|
||||
"name": "BC Place",
|
||||
"city": "Vancouver",
|
||||
"state": "BC",
|
||||
"latitude": 49.2768,
|
||||
"longitude": -123.1118,
|
||||
"capacity": 54320,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"VAN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_snapdragon_stadium",
|
||||
"name": "Snapdragon Stadium",
|
||||
"city": "San Diego",
|
||||
"state": "CA",
|
||||
"latitude": 32.7839,
|
||||
"longitude": -117.1224,
|
||||
"capacity": 35000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SDG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_bmo_stadium",
|
||||
"name": "BMO Stadium",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.0128,
|
||||
"longitude": -118.2841,
|
||||
"capacity": 22000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"ANG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_paypal_park",
|
||||
"name": "PayPal Park",
|
||||
"city": "San Jose",
|
||||
"state": "CA",
|
||||
"latitude": 37.3513,
|
||||
"longitude": -121.9253,
|
||||
"capacity": 18000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"BAY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_seatgeek_stadium",
|
||||
"name": "SeatGeek Stadium",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.6462,
|
||||
"longitude": -87.7304,
|
||||
"capacity": 20000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_shell_energy_stadium",
|
||||
"name": "Shell Energy Stadium",
|
||||
"city": "Houston",
|
||||
"state": "TX",
|
||||
"latitude": 29.7523,
|
||||
"longitude": -95.3522,
|
||||
"capacity": 22039,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"HOU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_cpkc_stadium",
|
||||
"name": "CPKC Stadium",
|
||||
"city": "Kansas City",
|
||||
"state": "KS",
|
||||
"latitude": 39.0851,
|
||||
"longitude": -94.5582,
|
||||
"capacity": 11500,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"KCC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_red_bull_arena",
|
||||
"name": "Red Bull Arena",
|
||||
"city": "Harrison",
|
||||
"state": "NJ",
|
||||
"latitude": 40.7368,
|
||||
"longitude": -74.1503,
|
||||
"capacity": 25000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"NJY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_wakemed_soccer_park",
|
||||
"name": "WakeMed Soccer Park",
|
||||
"city": "Cary",
|
||||
"state": "NC",
|
||||
"latitude": 35.8589,
|
||||
"longitude": -78.7989,
|
||||
"capacity": 10000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"NCC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_interco_stadium",
|
||||
"name": "Inter&Co Stadium",
|
||||
"city": "Orlando",
|
||||
"state": "FL",
|
||||
"latitude": 28.5411,
|
||||
"longitude": -81.3899,
|
||||
"capacity": 25500,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"ORL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_providence_park",
|
||||
"name": "Providence Park",
|
||||
"city": "Portland",
|
||||
"state": "OR",
|
||||
"latitude": 45.5217,
|
||||
"longitude": -122.6917,
|
||||
"capacity": 25218,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"POR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_lumen_field",
|
||||
"name": "Lumen Field",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.5952,
|
||||
"longitude": -122.3316,
|
||||
"capacity": 68740,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"RGN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_snapdragon_stadium",
|
||||
"name": "Snapdragon Stadium",
|
||||
"city": "San Diego",
|
||||
"state": "CA",
|
||||
"latitude": 32.7839,
|
||||
"longitude": -117.1224,
|
||||
"capacity": 35000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"SDW"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_america_first_field",
|
||||
"name": "America First Field",
|
||||
"city": "Sandy",
|
||||
"state": "UT",
|
||||
"latitude": 40.5828,
|
||||
"longitude": -111.8933,
|
||||
"capacity": 20213,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"UTA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_audi_field",
|
||||
"name": "Audi Field",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8686,
|
||||
"longitude": -77.0128,
|
||||
"capacity": 20000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"WSH"
|
||||
],
|
||||
"year_opened": null
|
||||
}
|
||||
]
|
||||
@@ -31,9 +31,24 @@ from dataclasses import dataclass, asdict
|
||||
|
||||
# Import pipeline components
|
||||
from scrape_schedules import (
|
||||
scrape_nba_basketball_reference,
|
||||
scrape_mlb_statsapi,
|
||||
scrape_nhl_hockey_reference,
|
||||
ScraperSource, scrape_with_fallback,
|
||||
# NBA sources
|
||||
scrape_nba_basketball_reference, scrape_nba_espn, scrape_nba_cbssports,
|
||||
# MLB sources
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference, scrape_mlb_espn,
|
||||
# NHL sources
|
||||
scrape_nhl_hockey_reference, scrape_nhl_espn, scrape_nhl_api,
|
||||
# NFL sources
|
||||
scrape_nfl_espn, scrape_nfl_pro_football_reference, scrape_nfl_cbssports,
|
||||
# WNBA sources
|
||||
scrape_wnba_espn, scrape_wnba_basketball_reference, scrape_wnba_cbssports,
|
||||
# MLS sources
|
||||
scrape_mls_espn, scrape_mls_fbref, scrape_mls_mlssoccer,
|
||||
# NWSL sources
|
||||
scrape_nwsl_espn, scrape_nwsl_fbref, scrape_nwsl_nwslsoccer,
|
||||
# CBB sources
|
||||
scrape_cbb_espn, scrape_cbb_sports_reference, scrape_cbb_cbssports,
|
||||
# Utilities
|
||||
generate_stadiums_from_teams,
|
||||
assign_stable_ids,
|
||||
export_to_json,
|
||||
@@ -114,28 +129,90 @@ def run_pipeline(
|
||||
all_stadiums = generate_stadiums_from_teams()
|
||||
print(f" Generated {len(all_stadiums)} stadiums from team data")
|
||||
|
||||
# Scrape NBA
|
||||
# Scrape all sports with multi-source fallback
|
||||
print_section(f"NBA {season}")
|
||||
nba_games = scrape_nba_basketball_reference(season)
|
||||
nba_sources = [
|
||||
ScraperSource('Basketball-Reference', scrape_nba_basketball_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nba_espn, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_nba_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nba_games = scrape_with_fallback('NBA', season, nba_sources)
|
||||
nba_season = f"{season-1}-{str(season)[2:]}"
|
||||
nba_games = assign_stable_ids(nba_games, 'NBA', nba_season)
|
||||
all_games.extend(nba_games)
|
||||
print(f" Scraped {len(nba_games)} NBA games")
|
||||
|
||||
# Scrape MLB
|
||||
print_section(f"MLB {season}")
|
||||
mlb_games = scrape_mlb_statsapi(season)
|
||||
mlb_sources = [
|
||||
ScraperSource('MLB Stats API', scrape_mlb_statsapi, priority=1, min_games=1000),
|
||||
ScraperSource('Baseball-Reference', scrape_mlb_baseball_reference, priority=2, min_games=500),
|
||||
ScraperSource('ESPN', scrape_mlb_espn, priority=3, min_games=500),
|
||||
]
|
||||
mlb_games = scrape_with_fallback('MLB', season, mlb_sources)
|
||||
mlb_games = assign_stable_ids(mlb_games, 'MLB', str(season))
|
||||
all_games.extend(mlb_games)
|
||||
print(f" Scraped {len(mlb_games)} MLB games")
|
||||
|
||||
# Scrape NHL
|
||||
print_section(f"NHL {season}")
|
||||
nhl_games = scrape_nhl_hockey_reference(season)
|
||||
nhl_sources = [
|
||||
ScraperSource('Hockey-Reference', scrape_nhl_hockey_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nhl_espn, priority=2, min_games=500),
|
||||
ScraperSource('NHL API', scrape_nhl_api, priority=3, min_games=100),
|
||||
]
|
||||
nhl_games = scrape_with_fallback('NHL', season, nhl_sources)
|
||||
nhl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nhl_games = assign_stable_ids(nhl_games, 'NHL', nhl_season)
|
||||
all_games.extend(nhl_games)
|
||||
print(f" Scraped {len(nhl_games)} NHL games")
|
||||
|
||||
print_section(f"NFL {season}")
|
||||
nfl_sources = [
|
||||
ScraperSource('ESPN', scrape_nfl_espn, priority=1, min_games=200),
|
||||
ScraperSource('Pro-Football-Reference', scrape_nfl_pro_football_reference, priority=2, min_games=200),
|
||||
ScraperSource('CBS Sports', scrape_nfl_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nfl_games = scrape_with_fallback('NFL', season, nfl_sources)
|
||||
nfl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nfl_games = assign_stable_ids(nfl_games, 'NFL', nfl_season)
|
||||
all_games.extend(nfl_games)
|
||||
|
||||
print_section(f"WNBA {season}")
|
||||
wnba_sources = [
|
||||
ScraperSource('ESPN', scrape_wnba_espn, priority=1, min_games=100),
|
||||
ScraperSource('Basketball-Reference', scrape_wnba_basketball_reference, priority=2, min_games=100),
|
||||
ScraperSource('CBS Sports', scrape_wnba_cbssports, priority=3, min_games=50),
|
||||
]
|
||||
wnba_games = scrape_with_fallback('WNBA', season, wnba_sources)
|
||||
wnba_games = assign_stable_ids(wnba_games, 'WNBA', str(season))
|
||||
all_games.extend(wnba_games)
|
||||
|
||||
print_section(f"MLS {season}")
|
||||
mls_sources = [
|
||||
ScraperSource('ESPN', scrape_mls_espn, priority=1, min_games=200),
|
||||
ScraperSource('FBref', scrape_mls_fbref, priority=2, min_games=100),
|
||||
ScraperSource('MLSSoccer.com', scrape_mls_mlssoccer, priority=3, min_games=100),
|
||||
]
|
||||
mls_games = scrape_with_fallback('MLS', season, mls_sources)
|
||||
mls_games = assign_stable_ids(mls_games, 'MLS', str(season))
|
||||
all_games.extend(mls_games)
|
||||
|
||||
print_section(f"NWSL {season}")
|
||||
nwsl_sources = [
|
||||
ScraperSource('ESPN', scrape_nwsl_espn, priority=1, min_games=100),
|
||||
ScraperSource('FBref', scrape_nwsl_fbref, priority=2, min_games=50),
|
||||
ScraperSource('NWSL.com', scrape_nwsl_nwslsoccer, priority=3, min_games=50),
|
||||
]
|
||||
nwsl_games = scrape_with_fallback('NWSL', season, nwsl_sources)
|
||||
nwsl_games = assign_stable_ids(nwsl_games, 'NWSL', str(season))
|
||||
all_games.extend(nwsl_games)
|
||||
|
||||
print_section(f"CBB {season}")
|
||||
cbb_sources = [
|
||||
ScraperSource('ESPN', scrape_cbb_espn, priority=1, min_games=1000),
|
||||
ScraperSource('Sports-Reference', scrape_cbb_sports_reference, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_cbb_cbssports, priority=3, min_games=300),
|
||||
]
|
||||
cbb_games = scrape_with_fallback('CBB', season, cbb_sources)
|
||||
cbb_season = f"{season-1}-{str(season)[2:]}"
|
||||
cbb_games = assign_stable_ids(cbb_games, 'CBB', cbb_season)
|
||||
all_games.extend(cbb_games)
|
||||
|
||||
# Export raw data
|
||||
print_section("Exporting Raw Data")
|
||||
@@ -148,16 +225,36 @@ def run_pipeline(
|
||||
else:
|
||||
print_header("LOADING EXISTING RAW DATA")
|
||||
|
||||
games_file = output_dir / 'games.json'
|
||||
stadiums_file = output_dir / 'stadiums.json'
|
||||
# Try loading from new structure first (games/*.json)
|
||||
games_dir = output_dir / 'games'
|
||||
raw_games = []
|
||||
|
||||
with open(games_file) as f:
|
||||
raw_games = json.load(f)
|
||||
print(f" Loaded {len(raw_games)} raw games")
|
||||
if games_dir.exists() and any(games_dir.glob('*.json')):
|
||||
print_section("Loading from games/ directory")
|
||||
for games_file in sorted(games_dir.glob('*.json')):
|
||||
with open(games_file) as f:
|
||||
file_games = json.load(f)
|
||||
raw_games.extend(file_games)
|
||||
print(f" Loaded {len(file_games):,} games from {games_file.name}")
|
||||
else:
|
||||
# Fallback to legacy games.json
|
||||
print_section("Loading from legacy games.json")
|
||||
games_file = output_dir / 'games.json'
|
||||
with open(games_file) as f:
|
||||
raw_games = json.load(f)
|
||||
|
||||
with open(stadiums_file) as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums")
|
||||
print(f" Total: {len(raw_games):,} raw games")
|
||||
|
||||
# Try loading stadiums from canonical/ first, then legacy
|
||||
canonical_dir = output_dir / 'canonical'
|
||||
if (canonical_dir / 'stadiums.json').exists():
|
||||
with open(canonical_dir / 'stadiums.json') as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums from canonical/stadiums.json")
|
||||
else:
|
||||
with open(output_dir / 'stadiums.json') as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums from stadiums.json")
|
||||
|
||||
# =========================================================================
|
||||
# STAGE 2: CANONICALIZE STADIUMS
|
||||
@@ -242,13 +339,32 @@ def run_pipeline(
|
||||
for issue, count in by_issue.items():
|
||||
print(f" - {issue}: {count}")
|
||||
|
||||
# Export
|
||||
games_canonical_path = output_dir / 'games_canonical.json'
|
||||
# Export games to new structure: canonical/games/{sport}_{season}.json
|
||||
canonical_games_dir = output_dir / 'canonical' / 'games'
|
||||
canonical_games_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Group games by sport and season
|
||||
games_by_sport_season = {}
|
||||
for game in canonical_games_list:
|
||||
sport = game.sport.lower()
|
||||
season = game.season
|
||||
key = f"{sport}_{season}"
|
||||
if key not in games_by_sport_season:
|
||||
games_by_sport_season[key] = []
|
||||
games_by_sport_season[key].append(game)
|
||||
|
||||
# Export each sport/season file
|
||||
for key, sport_games in sorted(games_by_sport_season.items()):
|
||||
filepath = canonical_games_dir / f"{key}.json"
|
||||
with open(filepath, 'w') as f:
|
||||
json.dump([asdict(g) for g in sport_games], f, indent=2)
|
||||
print(f" Exported {len(sport_games):,} games to canonical/games/{key}.json")
|
||||
|
||||
# Also export combined games_canonical.json for backward compatibility
|
||||
games_canonical_path = output_dir / 'games_canonical.json'
|
||||
with open(games_canonical_path, 'w') as f:
|
||||
json.dump([asdict(g) for g in canonical_games_list], f, indent=2)
|
||||
|
||||
print(f" Exported to {games_canonical_path}")
|
||||
print(f" Exported combined to {games_canonical_path}")
|
||||
|
||||
# =========================================================================
|
||||
# STAGE 5: VALIDATE
|
||||
@@ -320,7 +436,8 @@ def run_pipeline(
|
||||
print(f" - {output_dir / 'stadiums_canonical.json'}")
|
||||
print(f" - {output_dir / 'stadium_aliases.json'}")
|
||||
print(f" - {output_dir / 'teams_canonical.json'}")
|
||||
print(f" - {output_dir / 'games_canonical.json'}")
|
||||
print(f" - {output_dir / 'games_canonical.json'} (combined)")
|
||||
print(f" - {output_dir / 'canonical' / 'games' / '*.json'} (by sport/season)")
|
||||
print(f" - {output_dir / 'canonicalization_validation.json'}")
|
||||
print()
|
||||
|
||||
|
||||
+112
-10
@@ -23,10 +23,24 @@ from enum import Enum
|
||||
|
||||
# Import our modules
|
||||
from scrape_schedules import (
|
||||
Game, Stadium,
|
||||
scrape_nba_basketball_reference,
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference,
|
||||
scrape_nhl_hockey_reference,
|
||||
Game, Stadium, ScraperSource, scrape_with_fallback,
|
||||
# NBA sources
|
||||
scrape_nba_basketball_reference, scrape_nba_espn, scrape_nba_cbssports,
|
||||
# MLB sources
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference, scrape_mlb_espn,
|
||||
# NHL sources
|
||||
scrape_nhl_hockey_reference, scrape_nhl_espn, scrape_nhl_api,
|
||||
# NFL sources
|
||||
scrape_nfl_espn, scrape_nfl_pro_football_reference, scrape_nfl_cbssports,
|
||||
# WNBA sources
|
||||
scrape_wnba_espn, scrape_wnba_basketball_reference, scrape_wnba_cbssports,
|
||||
# MLS sources
|
||||
scrape_mls_espn, scrape_mls_fbref, scrape_mls_mlssoccer,
|
||||
# NWSL sources
|
||||
scrape_nwsl_espn, scrape_nwsl_fbref, scrape_nwsl_nwslsoccer,
|
||||
# CBB sources
|
||||
scrape_cbb_espn, scrape_cbb_sports_reference, scrape_cbb_cbssports,
|
||||
# Utilities
|
||||
generate_stadiums_from_teams,
|
||||
export_to_json,
|
||||
assign_stable_ids,
|
||||
@@ -119,10 +133,15 @@ def run_pipeline(
|
||||
all_stadiums = generate_stadiums_from_teams()
|
||||
print(f" Generated {len(all_stadiums)} stadiums from team data")
|
||||
|
||||
# Scrape by sport
|
||||
# Scrape by sport with multi-source fallback
|
||||
if sport in ['nba', 'all']:
|
||||
print_section(f"NBA {season}")
|
||||
nba_games = scrape_nba_basketball_reference(season)
|
||||
nba_sources = [
|
||||
ScraperSource('Basketball-Reference', scrape_nba_basketball_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nba_espn, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_nba_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nba_games = scrape_with_fallback('NBA', season, nba_sources)
|
||||
nba_season = f"{season-1}-{str(season)[2:]}"
|
||||
nba_games = assign_stable_ids(nba_games, 'NBA', nba_season)
|
||||
all_games.extend(nba_games)
|
||||
@@ -130,19 +149,91 @@ def run_pipeline(
|
||||
|
||||
if sport in ['mlb', 'all']:
|
||||
print_section(f"MLB {season}")
|
||||
mlb_games = scrape_mlb_statsapi(season)
|
||||
# MLB API uses official gamePk - already stable
|
||||
mlb_sources = [
|
||||
ScraperSource('MLB Stats API', scrape_mlb_statsapi, priority=1, min_games=1000),
|
||||
ScraperSource('Baseball-Reference', scrape_mlb_baseball_reference, priority=2, min_games=500),
|
||||
ScraperSource('ESPN', scrape_mlb_espn, priority=3, min_games=500),
|
||||
]
|
||||
mlb_games = scrape_with_fallback('MLB', season, mlb_sources)
|
||||
mlb_games = assign_stable_ids(mlb_games, 'MLB', str(season))
|
||||
all_games.extend(mlb_games)
|
||||
games_by_sport['MLB'] = len(mlb_games)
|
||||
|
||||
if sport in ['nhl', 'all']:
|
||||
print_section(f"NHL {season}")
|
||||
nhl_games = scrape_nhl_hockey_reference(season)
|
||||
nhl_sources = [
|
||||
ScraperSource('Hockey-Reference', scrape_nhl_hockey_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nhl_espn, priority=2, min_games=500),
|
||||
ScraperSource('NHL API', scrape_nhl_api, priority=3, min_games=100),
|
||||
]
|
||||
nhl_games = scrape_with_fallback('NHL', season, nhl_sources)
|
||||
nhl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nhl_games = assign_stable_ids(nhl_games, 'NHL', nhl_season)
|
||||
all_games.extend(nhl_games)
|
||||
games_by_sport['NHL'] = len(nhl_games)
|
||||
|
||||
if sport in ['nfl', 'all']:
|
||||
print_section(f"NFL {season}")
|
||||
nfl_sources = [
|
||||
ScraperSource('ESPN', scrape_nfl_espn, priority=1, min_games=200),
|
||||
ScraperSource('Pro-Football-Reference', scrape_nfl_pro_football_reference, priority=2, min_games=200),
|
||||
ScraperSource('CBS Sports', scrape_nfl_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nfl_games = scrape_with_fallback('NFL', season, nfl_sources)
|
||||
nfl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nfl_games = assign_stable_ids(nfl_games, 'NFL', nfl_season)
|
||||
all_games.extend(nfl_games)
|
||||
games_by_sport['NFL'] = len(nfl_games)
|
||||
|
||||
if sport in ['wnba', 'all']:
|
||||
print_section(f"WNBA {season}")
|
||||
wnba_sources = [
|
||||
ScraperSource('ESPN', scrape_wnba_espn, priority=1, min_games=100),
|
||||
ScraperSource('Basketball-Reference', scrape_wnba_basketball_reference, priority=2, min_games=100),
|
||||
ScraperSource('CBS Sports', scrape_wnba_cbssports, priority=3, min_games=50),
|
||||
]
|
||||
wnba_games = scrape_with_fallback('WNBA', season, wnba_sources)
|
||||
wnba_games = assign_stable_ids(wnba_games, 'WNBA', str(season))
|
||||
all_games.extend(wnba_games)
|
||||
games_by_sport['WNBA'] = len(wnba_games)
|
||||
|
||||
if sport in ['mls', 'all']:
|
||||
print_section(f"MLS {season}")
|
||||
mls_sources = [
|
||||
ScraperSource('ESPN', scrape_mls_espn, priority=1, min_games=200),
|
||||
ScraperSource('FBref', scrape_mls_fbref, priority=2, min_games=100),
|
||||
ScraperSource('MLSSoccer.com', scrape_mls_mlssoccer, priority=3, min_games=100),
|
||||
]
|
||||
mls_games = scrape_with_fallback('MLS', season, mls_sources)
|
||||
mls_games = assign_stable_ids(mls_games, 'MLS', str(season))
|
||||
all_games.extend(mls_games)
|
||||
games_by_sport['MLS'] = len(mls_games)
|
||||
|
||||
if sport in ['nwsl', 'all']:
|
||||
print_section(f"NWSL {season}")
|
||||
nwsl_sources = [
|
||||
ScraperSource('ESPN', scrape_nwsl_espn, priority=1, min_games=100),
|
||||
ScraperSource('FBref', scrape_nwsl_fbref, priority=2, min_games=50),
|
||||
ScraperSource('NWSL.com', scrape_nwsl_nwslsoccer, priority=3, min_games=50),
|
||||
]
|
||||
nwsl_games = scrape_with_fallback('NWSL', season, nwsl_sources)
|
||||
nwsl_games = assign_stable_ids(nwsl_games, 'NWSL', str(season))
|
||||
all_games.extend(nwsl_games)
|
||||
games_by_sport['NWSL'] = len(nwsl_games)
|
||||
|
||||
if sport in ['cbb', 'all']:
|
||||
print_section(f"CBB {season}")
|
||||
cbb_sources = [
|
||||
ScraperSource('ESPN', scrape_cbb_espn, priority=1, min_games=1000),
|
||||
ScraperSource('Sports-Reference', scrape_cbb_sports_reference, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_cbb_cbssports, priority=3, min_games=300),
|
||||
]
|
||||
cbb_games = scrape_with_fallback('CBB', season, cbb_sources)
|
||||
cbb_season = f"{season-1}-{str(season)[2:]}"
|
||||
cbb_games = assign_stable_ids(cbb_games, 'CBB', cbb_season)
|
||||
all_games.extend(cbb_games)
|
||||
games_by_sport['CBB'] = len(cbb_games)
|
||||
|
||||
# Export data
|
||||
print_section("Exporting Data")
|
||||
export_to_json(all_games, all_stadiums, output_dir)
|
||||
@@ -233,6 +324,17 @@ def run_pipeline(
|
||||
if count < 75 or count > 90:
|
||||
print(f" NHL: {team} has {count} games (expected ~82)")
|
||||
|
||||
if sport in ['nfl', 'all']:
|
||||
nfl_games = [g for g in all_games if g.sport == 'NFL']
|
||||
team_counts = {}
|
||||
for g in nfl_games:
|
||||
team_counts[g.home_team_abbrev] = team_counts.get(g.home_team_abbrev, 0) + 1
|
||||
team_counts[g.away_team_abbrev] = team_counts.get(g.away_team_abbrev, 0) + 1
|
||||
|
||||
for team, count in sorted(team_counts.items()):
|
||||
if count < 15 or count > 20:
|
||||
print(f" NFL: {team} has {count} games (expected ~17)")
|
||||
|
||||
# =========================================================================
|
||||
# PHASE 3: GENERATE REPORT
|
||||
# =========================================================================
|
||||
@@ -396,7 +498,7 @@ Examples:
|
||||
help='Season year (default: 2025)'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sport', choices=['nba', 'mlb', 'nhl', 'all'], default='all',
|
||||
'--sport', choices=['nba', 'mlb', 'nhl', 'nfl', 'wnba', 'mls', 'nwsl', 'cbb', 'all'], default='all',
|
||||
help='Sport to process (default: all)'
|
||||
)
|
||||
parser.add_argument(
|
||||
|
||||
+2407
-24
File diff suppressed because it is too large
Load Diff
Executable
+1092
File diff suppressed because it is too large
Load Diff
@@ -67,6 +67,32 @@ EXPECTED_GAMES = {
|
||||
'max': 168,
|
||||
'description': 'MLB regular season (162 games)'
|
||||
},
|
||||
'nfl': {
|
||||
'expected': 17,
|
||||
'min': 15,
|
||||
'max': 20,
|
||||
'description': 'NFL regular season (17 games)'
|
||||
},
|
||||
'wnba': {
|
||||
'expected': 40,
|
||||
'min': 35,
|
||||
'max': 45,
|
||||
'description': 'WNBA regular season (40 games)'
|
||||
},
|
||||
'mls': {
|
||||
'expected': 34,
|
||||
'min': 30,
|
||||
'max': 40,
|
||||
'description': 'MLS regular season (34 games)'
|
||||
},
|
||||
'nwsl': {
|
||||
'expected': 26,
|
||||
'min': 22,
|
||||
'max': 30,
|
||||
'description': 'NWSL regular season (26 games)'
|
||||
},
|
||||
# Note: CBB doesn't have fixed game counts per "team"
|
||||
# CBB teams vary widely (30+ games)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,10 @@ from scrape_schedules import (
|
||||
scrape_nba_basketball_reference,
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference,
|
||||
scrape_nhl_hockey_reference,
|
||||
NBA_TEAMS, MLB_TEAMS, NHL_TEAMS,
|
||||
scrape_wnba_espn, scrape_mls_espn, scrape_nwsl_espn,
|
||||
scrape_nfl_espn, scrape_cbb_espn,
|
||||
NBA_TEAMS, MLB_TEAMS, NHL_TEAMS, WNBA_TEAMS, MLS_TEAMS, NWSL_TEAMS,
|
||||
NFL_TEAMS,
|
||||
assign_stable_ids,
|
||||
)
|
||||
|
||||
@@ -136,7 +139,11 @@ def generate_game_key(game: Game) -> str:
|
||||
|
||||
def normalize_team_name(name: str, sport: str) -> str:
|
||||
"""Normalize team name variations."""
|
||||
teams = {'NBA': NBA_TEAMS, 'MLB': MLB_TEAMS, 'NHL': NHL_TEAMS}.get(sport, {})
|
||||
teams = {
|
||||
'NBA': NBA_TEAMS, 'MLB': MLB_TEAMS, 'NHL': NHL_TEAMS,
|
||||
'WNBA': WNBA_TEAMS, 'MLS': MLS_TEAMS, 'NWSL': NWSL_TEAMS,
|
||||
'NFL': NFL_TEAMS,
|
||||
}.get(sport, {})
|
||||
|
||||
name_lower = name.lower().strip()
|
||||
|
||||
@@ -465,7 +472,7 @@ def main():
|
||||
parser.add_argument('--data-dir', type=str, default='./data', help='Data directory')
|
||||
parser.add_argument('--scrape-and-validate', action='store_true', help='Scrape fresh and validate')
|
||||
parser.add_argument('--season', type=int, default=2025, help='Season year')
|
||||
parser.add_argument('--sport', choices=['nba', 'mlb', 'nhl', 'all'], default='all')
|
||||
parser.add_argument('--sport', choices=['nba', 'mlb', 'nhl', 'nfl', 'wnba', 'mls', 'nwsl', 'cbb', 'all'], default='all')
|
||||
parser.add_argument('--output', type=str, default='./data/validation_report.json')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
Reference in New Issue
Block a user