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:
Trey t
2026-01-09 23:22:13 -06:00
parent f5e509a9ae
commit 8790d2ad73
35 changed files with 117819 additions and 65871 deletions

View File

@@ -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

View File

@@ -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": []

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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"
}
]
}

View File

@@ -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",

View File

@@ -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,
1 id name city state latitude longitude capacity sport team_abbrevs source year_opened
2 manual_nba_atl State Farm Arena Atlanta 33.7573 -84.3963 0 NBA ['ATL'] manual
3 manual_nba_bos TD Garden Boston 42.3662 -71.0621 0 NBA ['BOS'] manual
4 manual_nba_brk Barclays Center Brooklyn 40.6826 -73.9754 0 NBA ['BRK'] manual
5 manual_nba_cho Spectrum Center Charlotte 35.2251 -80.8392 0 NBA ['CHO'] manual
6 manual_nba_chi United Center Chicago 41.8807 -87.6742 0 NBA ['CHI'] manual
7 manual_nba_cle Rocket Mortgage FieldHouse Cleveland 41.4965 -81.6882 0 NBA ['CLE'] manual
8 manual_nba_dal American Airlines Center Dallas 32.7905 -96.8103 0 NBA ['DAL'] manual
9 manual_nba_den Ball Arena Denver 39.7487 -105.0077 0 NBA ['DEN'] manual
10 manual_nba_det Little Caesars Arena Detroit 42.3411 -83.0553 0 NBA ['DET'] manual
11 manual_nba_gsw Chase Center San Francisco 37.768 -122.3879 0 NBA ['GSW'] manual
12 manual_nba_hou Toyota Center Houston 29.7508 -95.3621 0 NBA ['HOU'] manual
13 manual_nba_ind Gainbridge Fieldhouse Indianapolis 39.764 -86.1555 0 NBA ['IND'] manual
14 manual_nba_lac Intuit Dome Inglewood 33.9425 -118.3419 0 NBA ['LAC'] manual
15 manual_nba_lal Crypto.com Arena Los Angeles 34.043 -118.2673 0 NBA ['LAL'] manual
16 manual_nba_mem FedExForum Memphis 35.1382 -90.0506 0 NBA ['MEM'] manual
17 manual_nba_mia Kaseya Center Miami 25.7814 -80.187 0 NBA ['MIA'] manual
18 manual_nba_mil Fiserv Forum Milwaukee 43.0451 -87.9174 0 NBA ['MIL'] manual
19 manual_nba_min Target Center Minneapolis 44.9795 -93.2761 0 NBA ['MIN'] manual
20 manual_nba_nop Smoothie King Center New Orleans 29.949 -90.0821 0 NBA ['NOP'] manual
21 manual_nba_nyk Madison Square Garden New York 40.7505 -73.9934 0 NBA ['NYK'] manual
22 manual_nba_okc Paycom Center Oklahoma City 35.4634 -97.5151 0 NBA ['OKC'] manual
23 manual_nba_orl Kia Center Orlando 28.5392 -81.3839 0 NBA ['ORL'] manual
24 manual_nba_phi Wells Fargo Center Philadelphia 39.9012 -75.172 0 NBA ['PHI'] manual
25 manual_nba_pho Footprint Center Phoenix 33.4457 -112.0712 0 NBA ['PHO'] manual
26 manual_nba_por Moda Center Portland 45.5316 -122.6668 0 NBA ['POR'] manual
27 manual_nba_sac Golden 1 Center Sacramento 38.5802 -121.4997 0 NBA ['SAC'] manual
28 manual_nba_sas Frost Bank Center San Antonio 29.427 -98.4375 0 NBA ['SAS'] manual
29 manual_nba_tor Scotiabank Arena Toronto 43.6435 -79.3791 0 NBA ['TOR'] manual
30 manual_nba_uta Delta Center Salt Lake City 40.7683 -111.9011 0 NBA ['UTA'] manual
31 manual_nba_was Capital One Arena Washington 38.8982 -77.0209 0 NBA ['WAS'] manual
32 manual_mlb_ari Chase Field Phoenix AZ 33.4453 -112.0667 48686 MLB ['ARI'] manual
33 manual_mlb_atl Truist Park Atlanta GA 33.8907 -84.4678 41084 MLB ['ATL'] manual
34 manual_mlb_bal Oriole Park at Camden Yards Baltimore MD 39.2838 -76.6218 45971 MLB ['BAL'] manual
35 manual_mlb_bos Fenway Park Boston MA 42.3467 -71.0972 37755 MLB ['BOS'] manual
36 manual_mlb_chc Wrigley Field Chicago IL 41.9484 -87.6553 41649 MLB ['CHC'] manual
37 manual_mlb_chw Guaranteed Rate Field Chicago IL 41.8299 -87.6338 40615 MLB ['CHW'] manual
38 manual_mlb_cin Great American Ball Park Cincinnati OH 39.0979 -84.5082 42319 MLB ['CIN'] manual
39 manual_mlb_cle Progressive Field Cleveland OH 41.4962 -81.6852 34830 MLB ['CLE'] manual
40 manual_mlb_col Coors Field Denver CO 39.7559 -104.9942 50144 MLB ['COL'] manual
41 manual_mlb_det Comerica Park Detroit MI 42.339 -83.0485 41083 MLB ['DET'] manual
42 manual_mlb_hou Minute Maid Park Houston TX 29.7573 -95.3555 41168 MLB ['HOU'] manual
43 manual_mlb_kcr Kauffman Stadium Kansas City MO 39.0517 -94.4803 37903 MLB ['KCR'] manual
44 manual_mlb_laa Angel Stadium Anaheim CA 33.8003 -117.8827 45517 MLB ['LAA'] manual
45 manual_mlb_lad Dodger Stadium Los Angeles CA 34.0739 -118.24 56000 MLB ['LAD'] manual
46 manual_mlb_mia LoanDepot Park Miami FL 25.7781 -80.2196 36742 MLB ['MIA'] manual
47 manual_mlb_mil American Family Field Milwaukee WI 43.028 -87.9712 41900 MLB ['MIL'] manual
48 manual_mlb_min Target Field Minneapolis MN 44.9817 -93.2776 38544 MLB ['MIN'] manual
49 manual_mlb_nym Citi Field New York NY 40.7571 -73.8458 41922 MLB ['NYM'] manual
50 manual_mlb_nyy Yankee Stadium New York NY 40.8296 -73.9262 46537 MLB ['NYY'] manual
51 manual_mlb_oak Sutter Health Park Sacramento CA 38.5802 -121.5097 14014 MLB ['OAK'] manual
52 manual_mlb_phi Citizens Bank Park Philadelphia PA 39.9061 -75.1665 42792 MLB ['PHI'] manual
53 manual_mlb_pit PNC Park Pittsburgh PA 40.4469 -80.0057 38362 MLB ['PIT'] manual
54 manual_mlb_sdp Petco Park San Diego CA 32.7076 -117.157 40209 MLB ['SDP'] manual
55 manual_mlb_sfg Oracle Park San Francisco CA 37.7786 -122.3893 41265 MLB ['SFG'] manual
56 manual_mlb_sea T-Mobile Park Seattle WA 47.5914 -122.3325 47929 MLB ['SEA'] manual
57 manual_mlb_stl Busch Stadium St. Louis MO 38.6226 -90.1928 45494 MLB ['STL'] manual
58 manual_mlb_tbr Tropicana Field St. Petersburg FL 27.7682 -82.6534 25000 MLB ['TBR'] manual
59 manual_mlb_tex Globe Life Field Arlington TX 32.7473 -97.0845 40300 MLB ['TEX'] manual
60 manual_mlb_tor Rogers Centre Toronto ON 43.6414 -79.3894 49282 MLB ['TOR'] manual
61 manual_mlb_wsn Nationals Park Washington DC 38.873 -77.0074 41339 MLB ['WSN'] manual
62 manual_nhl_ana Honda Center Anaheim CA 33.8078 -117.8765 17174 NHL ['ANA'] manual
63 manual_nhl_ari Delta Center Salt Lake City UT 40.7683 -111.9011 18306 NHL ['ARI'] manual
64 manual_nhl_bos TD Garden Boston MA 42.3662 -71.0621 17565 NHL ['BOS'] manual
65 manual_nhl_buf KeyBank Center Buffalo NY 42.875 -78.8764 19070 NHL ['BUF'] manual
66 manual_nhl_cgy Scotiabank Saddledome Calgary AB 51.0374 -114.0519 19289 NHL ['CGY'] manual
67 manual_nhl_car PNC Arena Raleigh NC 35.8034 -78.722 18680 NHL ['CAR'] manual
68 manual_nhl_chi United Center Chicago IL 41.8807 -87.6742 19717 NHL ['CHI'] manual
69 manual_nhl_col Ball Arena Denver CO 39.7487 -105.0077 18007 NHL ['COL'] manual
70 manual_nhl_cbj Nationwide Arena Columbus OH 39.9693 -83.0061 18500 NHL ['CBJ'] manual
71 manual_nhl_dal American Airlines Center Dallas TX 32.7905 -96.8103 18532 NHL ['DAL'] manual
72 manual_nhl_det Little Caesars Arena Detroit MI 42.3411 -83.0553 19515 NHL ['DET'] manual
73 manual_nhl_edm Rogers Place Edmonton AB 53.5469 -113.4978 18347 NHL ['EDM'] manual
74 manual_nhl_fla Amerant Bank Arena Sunrise FL 26.1584 -80.3256 19250 NHL ['FLA'] manual
75 manual_nhl_lak Crypto.com Arena Los Angeles CA 34.043 -118.2673 18230 NHL ['LAK'] manual
76 manual_nhl_min Xcel Energy Center St. Paul MN 44.9448 -93.101 17954 NHL ['MIN'] manual
77 manual_nhl_mtl Bell Centre Montreal QC 45.4961 -73.5693 21302 NHL ['MTL'] manual
78 manual_nhl_nsh Bridgestone Arena Nashville TN 36.1592 -86.7785 17159 NHL ['NSH'] manual
79 manual_nhl_njd Prudential Center Newark NJ 40.7334 -74.1712 16514 NHL ['NJD'] manual
80 manual_nhl_nyi UBS Arena Elmont NY 40.7161 -73.7246 17255 NHL ['NYI'] manual
81 manual_nhl_nyr Madison Square Garden New York NY 40.7505 -73.9934 18006 NHL ['NYR'] manual
82 manual_nhl_ott Canadian Tire Centre Ottawa ON 45.2969 -75.9272 18652 NHL ['OTT'] manual
83 manual_nhl_phi Wells Fargo Center Philadelphia PA 39.9012 -75.172 19543 NHL ['PHI'] manual
84 manual_nhl_pit PPG Paints Arena Pittsburgh PA 40.4395 -79.9892 18387 NHL ['PIT'] manual
85 manual_nhl_sjs SAP Center San Jose CA 37.3327 -121.901 17562 NHL ['SJS'] manual
86 manual_nhl_sea Climate Pledge Arena Seattle WA 47.6221 -122.354 17100 NHL ['SEA'] manual
87 manual_nhl_stl Enterprise Center St. Louis MO 38.6268 -90.2025 18096 NHL ['STL'] manual
88 manual_nhl_tbl Amalie Arena Tampa FL 27.9426 -82.4519 19092 NHL ['TBL'] manual
89 manual_nhl_tor Scotiabank Arena Toronto ON 43.6435 -79.3791 18819 NHL ['TOR'] manual
90 manual_nhl_van Rogers Arena Vancouver BC 49.2778 -123.1089 18910 NHL ['VAN'] manual
91 manual_nhl_vgk T-Mobile Arena Las Vegas NV 36.1028 -115.1784 17500 NHL ['VGK'] manual
92 manual_nhl_wsh Capital One Arena Washington DC 38.8982 -77.0209 18573 NHL ['WSH'] manual
93 manual_nhl_wpg Canada Life Centre Winnipeg MB 49.8928 -97.1436 15321 NHL ['WPG'] manual
94 manual_wnba_atl Gateway Center Arena College Park GA 33.6534 -84.448 3500 WNBA ['ATL'] manual
95 manual_wnba_chi Wintrust Arena Chicago IL 41.8622 -87.6164 10387 WNBA ['CHI'] manual
96 manual_wnba_con Mohegan Sun Arena Uncasville CT 41.4946 -72.0874 10000 WNBA ['CON'] manual
97 manual_wnba_dal College Park Center Arlington TX 32.7298 -97.1137 7000 WNBA ['DAL'] manual
98 manual_wnba_gsv Chase Center San Francisco CA 37.768 -122.3879 18064 WNBA ['GSV'] manual
99 manual_wnba_ind Gainbridge Fieldhouse Indianapolis IN 39.764 -86.1555 17274 WNBA ['IND'] manual
100 manual_wnba_lva Michelob Ultra Arena Las Vegas NV 36.0929 -115.1757 12000 WNBA ['LVA'] manual
101 manual_wnba_las Crypto.com Arena Los Angeles CA 34.043 -118.2673 19068 WNBA ['LAS'] manual
102 manual_wnba_min Target Center Minneapolis MN 44.9795 -93.2761 17500 WNBA ['MIN'] manual
103 manual_wnba_nyl Barclays Center Brooklyn NY 40.6826 -73.9754 17732 WNBA ['NYL'] manual
104 manual_wnba_phx Footprint Center Phoenix AZ 33.4457 -112.0712 17000 WNBA ['PHX'] manual
105 manual_wnba_sea Climate Pledge Arena Seattle WA 47.6221 -122.354 17100 WNBA ['SEA'] manual
106 manual_wnba_was Entertainment & Sports Arena Washington DC 38.8701 -76.9728 4200 WNBA ['WAS'] manual
107 manual_mls_atl Mercedes-Benz Stadium Atlanta GA 33.7553 -84.4006 71000 MLS ['ATL'] manual
108 manual_mls_atx Q2 Stadium Austin TX 30.3876 -97.72 20738 MLS ['ATX'] manual
109 manual_mls_clt Bank of America Stadium Charlotte NC 35.2258 -80.8528 74867 MLS ['CLT'] manual
110 manual_mls_chi Soldier Field Chicago IL 41.8623 -87.6167 61500 MLS ['CHI'] manual
111 manual_mls_cin TQL Stadium Cincinnati OH 39.1113 -84.5212 26000 MLS ['CIN'] manual
112 manual_mls_col Dick's Sporting Goods Park Commerce City CO 39.8056 -104.8919 18061 MLS ['COL'] manual
113 manual_mls_clb Lower.com Field Columbus OH 39.9689 -83.0173 20371 MLS ['CLB'] manual
114 manual_mls_dal Toyota Stadium Frisco TX 33.1546 -96.8353 20500 MLS ['DAL'] manual
115 manual_mls_dcu Audi Field Washington DC 38.8686 -77.0128 20000 MLS ['DCU'] manual
116 manual_mls_hou Shell Energy Stadium Houston TX 29.7523 -95.3522 22039 MLS ['HOU'] manual
117 manual_mls_lag Dignity Health Sports Park Carson CA 33.8644 -118.2611 27000 MLS ['LAG'] manual
118 manual_mls_lafc BMO Stadium Los Angeles CA 34.0128 -118.2841 22000 MLS ['LAFC'] manual
119 manual_mls_mia Chase Stadium Fort Lauderdale FL 26.1902 -80.163 21550 MLS ['MIA'] manual
120 manual_mls_min Allianz Field St. Paul MN 44.9532 -93.1653 19400 MLS ['MIN'] manual
121 manual_mls_mtl Stade Saputo Montreal QC 45.5628 -73.553 19619 MLS ['MTL'] manual
122 manual_mls_nsh Geodis Park Nashville TN 36.1303 -86.7663 30000 MLS ['NSH'] manual
123 manual_mls_ner Gillette Stadium Foxborough MA 42.0909 -71.2643 65878 MLS ['NER'] manual
124 manual_mls_nyc Yankee Stadium New York NY 40.8296 -73.9262 46537 MLS ['NYC'] manual
125 manual_mls_rbny Red Bull Arena Harrison NJ 40.7368 -74.1503 25000 MLS ['RBNY'] manual
126 manual_mls_orl Inter&Co Stadium Orlando FL 28.5411 -81.3899 25500 MLS ['ORL'] manual
127 manual_mls_phi Subaru Park Chester PA 39.8328 -75.3789 18500 MLS ['PHI'] manual
128 manual_mls_por Providence Park Portland OR 45.5217 -122.6917 25218 MLS ['POR'] manual
129 manual_mls_rsl America First Field Sandy UT 40.5828 -111.8933 20213 MLS ['RSL'] manual
130 manual_mls_sje PayPal Park San Jose CA 37.3513 -121.9253 18000 MLS ['SJE'] manual
131 manual_mls_sea Lumen Field Seattle WA 47.5952 -122.3316 68740 MLS ['SEA'] manual
132 manual_mls_skc Children's Mercy Park Kansas City KS 39.1218 -94.8234 18467 MLS ['SKC'] manual
133 manual_mls_stl CityPark St. Louis MO 38.6322 -90.2094 22500 MLS ['STL'] manual
134 manual_mls_tor BMO Field Toronto ON 43.6332 -79.4186 30000 MLS ['TOR'] manual
135 manual_mls_van BC Place Vancouver BC 49.2768 -123.1118 54320 MLS ['VAN'] manual
136 manual_mls_sdg Snapdragon Stadium San Diego CA 32.7839 -117.1224 35000 MLS ['SDG'] manual
137 manual_nwsl_ang BMO Stadium Los Angeles CA 34.0128 -118.2841 22000 NWSL ['ANG'] manual
138 manual_nwsl_bay PayPal Park San Jose CA 37.3513 -121.9253 18000 NWSL ['BAY'] manual
139 manual_nwsl_chi SeatGeek Stadium Chicago IL 41.6462 -87.7304 20000 NWSL ['CHI'] manual
140 manual_nwsl_hou Shell Energy Stadium Houston TX 29.7523 -95.3522 22039 NWSL ['HOU'] manual
141 manual_nwsl_kcc CPKC Stadium Kansas City KS 39.0851 -94.5582 11500 NWSL ['KCC'] manual
142 manual_nwsl_njy Red Bull Arena Harrison NJ 40.7368 -74.1503 25000 NWSL ['NJY'] manual
143 manual_nwsl_ncc WakeMed Soccer Park Cary NC 35.8589 -78.7989 10000 NWSL ['NCC'] manual
144 manual_nwsl_orl Inter&Co Stadium Orlando FL 28.5411 -81.3899 25500 NWSL ['ORL'] manual
145 manual_nwsl_por Providence Park Portland OR 45.5217 -122.6917 25218 NWSL ['POR'] manual
146 manual_nwsl_rgn Lumen Field Seattle WA 47.5952 -122.3316 68740 NWSL ['RGN'] manual
147 manual_nwsl_sdw Snapdragon Stadium San Diego CA 32.7839 -117.1224 35000 NWSL ['SDW'] manual
148 manual_nwsl_uta America First Field Sandy UT 40.5828 -111.8933 20213 NWSL ['UTA'] manual
149 manual_nwsl_wsh Audi Field Washington DC 38.8686 -77.0128 20000 NWSL ['WSH'] manual
150 manual_nfl_ari State Farm Stadium Glendale AZ 33.5276 -112.2626 63400 NFL ['ARI'] manual
151 manual_nfl_atl Mercedes-Benz Stadium Atlanta GA 33.7553 -84.4006 71000 NFL ['ATL'] manual
152 manual_nfl_bal M&T Bank Stadium Baltimore MD 39.278 -76.6227 71008 NFL ['BAL'] manual
153 manual_nfl_buf Highmark Stadium Orchard Park NY 42.7738 -78.787 71608 NFL ['BUF'] manual
154 manual_nfl_car Bank of America Stadium Charlotte NC 35.2258 -80.8528 74867 NFL ['CAR'] manual
155 manual_nfl_chi Soldier Field Chicago IL 41.8623 -87.6167 61500 NFL ['CHI'] manual
156 manual_nfl_cin Paycor Stadium Cincinnati OH 39.0954 -84.516 65515 NFL ['CIN'] manual
157 manual_nfl_cle Cleveland Browns Stadium Cleveland OH 41.5061 -81.6995 67431 NFL ['CLE'] manual
158 manual_nfl_dal AT&T Stadium Arlington TX 32.748 -97.0928 80000 NFL ['DAL'] manual
159 manual_nfl_den Empower Field at Mile High Denver CO 39.7439 -105.0201 76125 NFL ['DEN'] manual
160 manual_nfl_det Ford Field Detroit MI 42.34 -83.0456 65000 NFL ['DET'] manual
161 manual_nfl_gb Lambeau Field Green Bay WI 44.5013 -88.0622 81435 NFL ['GB'] manual
162 manual_nfl_hou NRG Stadium Houston TX 29.6847 -95.4107 72220 NFL ['HOU'] manual
163 manual_nfl_ind Lucas Oil Stadium Indianapolis IN 39.7601 -86.1639 67000 NFL ['IND'] manual
164 manual_nfl_jax EverBank Stadium Jacksonville FL 30.3239 -81.6373 67814 NFL ['JAX'] manual
165 manual_nfl_kc GEHA Field at Arrowhead Stadium Kansas City MO 39.0489 -94.4839 76416 NFL ['KC'] manual
166 manual_nfl_lv Allegiant Stadium Las Vegas NV 36.0909 -115.1833 65000 NFL ['LV'] manual
167 manual_nfl_lac SoFi Stadium Inglewood CA 33.9535 -118.3392 70240 NFL ['LAC'] manual
168 manual_nfl_lar SoFi Stadium Inglewood CA 33.9535 -118.3392 70240 NFL ['LAR'] manual
169 manual_nfl_mia Hard Rock Stadium Miami Gardens FL 25.958 -80.2389 65326 NFL ['MIA'] manual
170 manual_nfl_min U.S. Bank Stadium Minneapolis MN 44.9737 -93.2577 66655 NFL ['MIN'] manual
171 manual_nfl_ne Gillette Stadium Foxborough MA 42.0909 -71.2643 65878 NFL ['NE'] manual
172 manual_nfl_no Caesars Superdome New Orleans LA 29.9511 -90.0812 73208 NFL ['NO'] manual
173 manual_nfl_nyg MetLife Stadium East Rutherford NJ 40.8128 -74.0742 82500 NFL ['NYG'] manual
174 manual_nfl_nyj MetLife Stadium East Rutherford NJ 40.8128 -74.0742 82500 NFL ['NYJ'] manual
175 manual_nfl_phi Lincoln Financial Field Philadelphia PA 39.9008 -75.1674 69176 NFL ['PHI'] manual
176 manual_nfl_pit Acrisure Stadium Pittsburgh PA 40.4468 -80.0158 68400 NFL ['PIT'] manual
177 manual_nfl_sf Levi's Stadium Santa Clara CA 37.4032 -121.9698 68500 NFL ['SF'] manual
178 manual_nfl_sea Lumen Field Seattle WA 47.5952 -122.3316 68740 NFL ['SEA'] manual
179 manual_nfl_tb Raymond James Stadium Tampa FL 27.9759 -82.5033 65618 NFL ['TB'] manual
180 manual_nfl_ten Nissan Stadium Nashville TN 36.1665 -86.7713 69143 NFL ['TEN'] manual
181 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

View File

@@ -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
}
]

View File

@@ -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()

View File

@@ -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(

File diff suppressed because it is too large Load Diff

1092
Scripts/sportstime.py Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -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)
}

View File

@@ -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()