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:
@@ -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
|
||||
|
||||
2702
Scripts/data/canonical/stadiums.json
Normal file
2702
Scripts/data/canonical/stadiums.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,10 +3,10 @@
|
||||
"error_count": 0,
|
||||
"warning_count": 0,
|
||||
"summary": {
|
||||
"stadiums": 92,
|
||||
"stadiums": 148,
|
||||
"teams": 92,
|
||||
"games": 4972,
|
||||
"aliases": 130,
|
||||
"games": 0,
|
||||
"aliases": 194,
|
||||
"by_category": {}
|
||||
},
|
||||
"errors": []
|
||||
|
||||
10742
Scripts/data/games.csv
10742
Scripts/data/games.csv
File diff suppressed because it is too large
Load Diff
13308
Scripts/data/games.json
13308
Scripts/data/games.json
File diff suppressed because it is too large
Load Diff
36452
Scripts/data/games/mlb_2026.json
Normal file
36452
Scripts/data/games/mlb_2026.json
Normal file
File diff suppressed because it is too large
Load Diff
7652
Scripts/data/games/mls_2026.json
Normal file
7652
Scripts/data/games/mls_2026.json
Normal file
File diff suppressed because it is too large
Load Diff
18452
Scripts/data/games/nba_2025-26.json
Normal file
18452
Scripts/data/games/nba_2025-26.json
Normal file
File diff suppressed because it is too large
Load Diff
4292
Scripts/data/games/nfl_2026.json
Normal file
4292
Scripts/data/games/nfl_2026.json
Normal file
File diff suppressed because it is too large
Load Diff
19682
Scripts/data/games/nhl_2025-26.json
Normal file
19682
Scripts/data/games/nhl_2025-26.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
205
Scripts/data/pipeline_report.json
Normal file
205
Scripts/data/pipeline_report.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -1,93 +1,181 @@
|
||||
id,name,city,state,latitude,longitude,capacity,sport,team_abbrevs,source,year_opened
|
||||
manual_nba_atl,State Farm Arena,Atlanta,,33.7573,-84.3963,0,NBA,['ATL'],manual,
|
||||
manual_nba_bos,TD Garden,Boston,,42.3662,-71.0621,0,NBA,['BOS'],manual,
|
||||
manual_nba_brk,Barclays Center,Brooklyn,,40.6826,-73.9754,0,NBA,['BRK'],manual,
|
||||
manual_nba_cho,Spectrum Center,Charlotte,,35.2251,-80.8392,0,NBA,['CHO'],manual,
|
||||
manual_nba_chi,United Center,Chicago,,41.8807,-87.6742,0,NBA,['CHI'],manual,
|
||||
manual_nba_cle,Rocket Mortgage FieldHouse,Cleveland,,41.4965,-81.6882,0,NBA,['CLE'],manual,
|
||||
manual_nba_dal,American Airlines Center,Dallas,,32.7905,-96.8103,0,NBA,['DAL'],manual,
|
||||
manual_nba_den,Ball Arena,Denver,,39.7487,-105.0077,0,NBA,['DEN'],manual,
|
||||
manual_nba_det,Little Caesars Arena,Detroit,,42.3411,-83.0553,0,NBA,['DET'],manual,
|
||||
manual_nba_gsw,Chase Center,San Francisco,,37.768,-122.3879,0,NBA,['GSW'],manual,
|
||||
manual_nba_hou,Toyota Center,Houston,,29.7508,-95.3621,0,NBA,['HOU'],manual,
|
||||
manual_nba_ind,Gainbridge Fieldhouse,Indianapolis,,39.764,-86.1555,0,NBA,['IND'],manual,
|
||||
manual_nba_lac,Intuit Dome,Inglewood,,33.9425,-118.3419,0,NBA,['LAC'],manual,
|
||||
manual_nba_lal,Crypto.com Arena,Los Angeles,,34.043,-118.2673,0,NBA,['LAL'],manual,
|
||||
manual_nba_mem,FedExForum,Memphis,,35.1382,-90.0506,0,NBA,['MEM'],manual,
|
||||
manual_nba_mia,Kaseya Center,Miami,,25.7814,-80.187,0,NBA,['MIA'],manual,
|
||||
manual_nba_mil,Fiserv Forum,Milwaukee,,43.0451,-87.9174,0,NBA,['MIL'],manual,
|
||||
manual_nba_min,Target Center,Minneapolis,,44.9795,-93.2761,0,NBA,['MIN'],manual,
|
||||
manual_nba_nop,Smoothie King Center,New Orleans,,29.949,-90.0821,0,NBA,['NOP'],manual,
|
||||
manual_nba_nyk,Madison Square Garden,New York,,40.7505,-73.9934,0,NBA,['NYK'],manual,
|
||||
manual_nba_okc,Paycom Center,Oklahoma City,,35.4634,-97.5151,0,NBA,['OKC'],manual,
|
||||
manual_nba_orl,Kia Center,Orlando,,28.5392,-81.3839,0,NBA,['ORL'],manual,
|
||||
manual_nba_phi,Wells Fargo Center,Philadelphia,,39.9012,-75.172,0,NBA,['PHI'],manual,
|
||||
manual_nba_pho,Footprint Center,Phoenix,,33.4457,-112.0712,0,NBA,['PHO'],manual,
|
||||
manual_nba_por,Moda Center,Portland,,45.5316,-122.6668,0,NBA,['POR'],manual,
|
||||
manual_nba_sac,Golden 1 Center,Sacramento,,38.5802,-121.4997,0,NBA,['SAC'],manual,
|
||||
manual_nba_sas,Frost Bank Center,San Antonio,,29.427,-98.4375,0,NBA,['SAS'],manual,
|
||||
manual_nba_tor,Scotiabank Arena,Toronto,,43.6435,-79.3791,0,NBA,['TOR'],manual,
|
||||
manual_nba_uta,Delta Center,Salt Lake City,,40.7683,-111.9011,0,NBA,['UTA'],manual,
|
||||
manual_nba_was,Capital One Arena,Washington,,38.8982,-77.0209,0,NBA,['WAS'],manual,
|
||||
manual_mlb_ari,Chase Field,Phoenix,AZ,33.4453,-112.0667,48686,MLB,['ARI'],manual,
|
||||
manual_mlb_atl,Truist Park,Atlanta,GA,33.8907,-84.4678,41084,MLB,['ATL'],manual,
|
||||
manual_mlb_bal,Oriole Park at Camden Yards,Baltimore,MD,39.2838,-76.6218,45971,MLB,['BAL'],manual,
|
||||
manual_mlb_bos,Fenway Park,Boston,MA,42.3467,-71.0972,37755,MLB,['BOS'],manual,
|
||||
manual_mlb_chc,Wrigley Field,Chicago,IL,41.9484,-87.6553,41649,MLB,['CHC'],manual,
|
||||
manual_mlb_chw,Guaranteed Rate Field,Chicago,IL,41.8299,-87.6338,40615,MLB,['CHW'],manual,
|
||||
manual_mlb_cin,Great American Ball Park,Cincinnati,OH,39.0979,-84.5082,42319,MLB,['CIN'],manual,
|
||||
manual_mlb_cle,Progressive Field,Cleveland,OH,41.4962,-81.6852,34830,MLB,['CLE'],manual,
|
||||
manual_mlb_col,Coors Field,Denver,CO,39.7559,-104.9942,50144,MLB,['COL'],manual,
|
||||
manual_mlb_det,Comerica Park,Detroit,MI,42.339,-83.0485,41083,MLB,['DET'],manual,
|
||||
manual_mlb_hou,Minute Maid Park,Houston,TX,29.7573,-95.3555,41168,MLB,['HOU'],manual,
|
||||
manual_mlb_kcr,Kauffman Stadium,Kansas City,MO,39.0517,-94.4803,37903,MLB,['KCR'],manual,
|
||||
manual_mlb_laa,Angel Stadium,Anaheim,CA,33.8003,-117.8827,45517,MLB,['LAA'],manual,
|
||||
manual_mlb_lad,Dodger Stadium,Los Angeles,CA,34.0739,-118.24,56000,MLB,['LAD'],manual,
|
||||
manual_mlb_mia,LoanDepot Park,Miami,FL,25.7781,-80.2196,36742,MLB,['MIA'],manual,
|
||||
manual_mlb_mil,American Family Field,Milwaukee,WI,43.028,-87.9712,41900,MLB,['MIL'],manual,
|
||||
manual_mlb_min,Target Field,Minneapolis,MN,44.9817,-93.2776,38544,MLB,['MIN'],manual,
|
||||
manual_mlb_nym,Citi Field,New York,NY,40.7571,-73.8458,41922,MLB,['NYM'],manual,
|
||||
manual_mlb_nyy,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLB,['NYY'],manual,
|
||||
manual_mlb_oak,Sutter Health Park,Sacramento,CA,38.5802,-121.5097,14014,MLB,['OAK'],manual,
|
||||
manual_mlb_phi,Citizens Bank Park,Philadelphia,PA,39.9061,-75.1665,42792,MLB,['PHI'],manual,
|
||||
manual_mlb_pit,PNC Park,Pittsburgh,PA,40.4469,-80.0057,38362,MLB,['PIT'],manual,
|
||||
manual_mlb_sdp,Petco Park,San Diego,CA,32.7076,-117.157,40209,MLB,['SDP'],manual,
|
||||
manual_mlb_sfg,Oracle Park,San Francisco,CA,37.7786,-122.3893,41265,MLB,['SFG'],manual,
|
||||
manual_mlb_sea,T-Mobile Park,Seattle,WA,47.5914,-122.3325,47929,MLB,['SEA'],manual,
|
||||
manual_mlb_stl,Busch Stadium,St. Louis,MO,38.6226,-90.1928,45494,MLB,['STL'],manual,
|
||||
manual_mlb_tbr,Tropicana Field,St. Petersburg,FL,27.7682,-82.6534,25000,MLB,['TBR'],manual,
|
||||
manual_mlb_tex,Globe Life Field,Arlington,TX,32.7473,-97.0845,40300,MLB,['TEX'],manual,
|
||||
manual_mlb_tor,Rogers Centre,Toronto,ON,43.6414,-79.3894,49282,MLB,['TOR'],manual,
|
||||
manual_mlb_wsn,Nationals Park,Washington,DC,38.873,-77.0074,41339,MLB,['WSN'],manual,
|
||||
manual_nhl_ana,Honda Center,Anaheim,CA,33.8078,-117.8765,17174,NHL,['ANA'],manual,
|
||||
manual_nhl_ari,Delta Center,Salt Lake City,UT,40.7683,-111.9011,18306,NHL,['ARI'],manual,
|
||||
manual_nhl_bos,TD Garden,Boston,MA,42.3662,-71.0621,17565,NHL,['BOS'],manual,
|
||||
manual_nhl_buf,KeyBank Center,Buffalo,NY,42.875,-78.8764,19070,NHL,['BUF'],manual,
|
||||
manual_nhl_cgy,Scotiabank Saddledome,Calgary,AB,51.0374,-114.0519,19289,NHL,['CGY'],manual,
|
||||
manual_nhl_car,PNC Arena,Raleigh,NC,35.8034,-78.722,18680,NHL,['CAR'],manual,
|
||||
manual_nhl_chi,United Center,Chicago,IL,41.8807,-87.6742,19717,NHL,['CHI'],manual,
|
||||
manual_nhl_col,Ball Arena,Denver,CO,39.7487,-105.0077,18007,NHL,['COL'],manual,
|
||||
manual_nhl_cbj,Nationwide Arena,Columbus,OH,39.9693,-83.0061,18500,NHL,['CBJ'],manual,
|
||||
manual_nhl_dal,American Airlines Center,Dallas,TX,32.7905,-96.8103,18532,NHL,['DAL'],manual,
|
||||
manual_nhl_det,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,19515,NHL,['DET'],manual,
|
||||
manual_nhl_edm,Rogers Place,Edmonton,AB,53.5469,-113.4978,18347,NHL,['EDM'],manual,
|
||||
manual_nhl_fla,Amerant Bank Arena,Sunrise,FL,26.1584,-80.3256,19250,NHL,['FLA'],manual,
|
||||
manual_nhl_lak,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18230,NHL,['LAK'],manual,
|
||||
manual_nhl_min,Xcel Energy Center,St. Paul,MN,44.9448,-93.101,17954,NHL,['MIN'],manual,
|
||||
manual_nhl_mtl,Bell Centre,Montreal,QC,45.4961,-73.5693,21302,NHL,['MTL'],manual,
|
||||
manual_nhl_nsh,Bridgestone Arena,Nashville,TN,36.1592,-86.7785,17159,NHL,['NSH'],manual,
|
||||
manual_nhl_njd,Prudential Center,Newark,NJ,40.7334,-74.1712,16514,NHL,['NJD'],manual,
|
||||
manual_nhl_nyi,UBS Arena,Elmont,NY,40.7161,-73.7246,17255,NHL,['NYI'],manual,
|
||||
manual_nhl_nyr,Madison Square Garden,New York,NY,40.7505,-73.9934,18006,NHL,['NYR'],manual,
|
||||
manual_nhl_ott,Canadian Tire Centre,Ottawa,ON,45.2969,-75.9272,18652,NHL,['OTT'],manual,
|
||||
manual_nhl_phi,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,19543,NHL,['PHI'],manual,
|
||||
manual_nhl_pit,PPG Paints Arena,Pittsburgh,PA,40.4395,-79.9892,18387,NHL,['PIT'],manual,
|
||||
manual_nhl_sjs,SAP Center,San Jose,CA,37.3327,-121.901,17562,NHL,['SJS'],manual,
|
||||
manual_nhl_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,NHL,['SEA'],manual,
|
||||
manual_nhl_stl,Enterprise Center,St. Louis,MO,38.6268,-90.2025,18096,NHL,['STL'],manual,
|
||||
manual_nhl_tbl,Amalie Arena,Tampa,FL,27.9426,-82.4519,19092,NHL,['TBL'],manual,
|
||||
manual_nhl_tor,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,18819,NHL,['TOR'],manual,
|
||||
manual_nhl_van,Rogers Arena,Vancouver,BC,49.2778,-123.1089,18910,NHL,['VAN'],manual,
|
||||
manual_nhl_vgk,T-Mobile Arena,Las Vegas,NV,36.1028,-115.1784,17500,NHL,['VGK'],manual,
|
||||
manual_nhl_wsh,Capital One Arena,Washington,DC,38.8982,-77.0209,18573,NHL,['WSH'],manual,
|
||||
manual_nhl_wpg,Canada Life Centre,Winnipeg,MB,49.8928,-97.1436,15321,NHL,['WPG'],manual,
|
||||
id,name,city,state,latitude,longitude,capacity,sport,team_abbrevs,source,year_opened
|
||||
manual_nba_atl,State Farm Arena,Atlanta,,33.7573,-84.3963,0,NBA,['ATL'],manual,
|
||||
manual_nba_bos,TD Garden,Boston,,42.3662,-71.0621,0,NBA,['BOS'],manual,
|
||||
manual_nba_brk,Barclays Center,Brooklyn,,40.6826,-73.9754,0,NBA,['BRK'],manual,
|
||||
manual_nba_cho,Spectrum Center,Charlotte,,35.2251,-80.8392,0,NBA,['CHO'],manual,
|
||||
manual_nba_chi,United Center,Chicago,,41.8807,-87.6742,0,NBA,['CHI'],manual,
|
||||
manual_nba_cle,Rocket Mortgage FieldHouse,Cleveland,,41.4965,-81.6882,0,NBA,['CLE'],manual,
|
||||
manual_nba_dal,American Airlines Center,Dallas,,32.7905,-96.8103,0,NBA,['DAL'],manual,
|
||||
manual_nba_den,Ball Arena,Denver,,39.7487,-105.0077,0,NBA,['DEN'],manual,
|
||||
manual_nba_det,Little Caesars Arena,Detroit,,42.3411,-83.0553,0,NBA,['DET'],manual,
|
||||
manual_nba_gsw,Chase Center,San Francisco,,37.768,-122.3879,0,NBA,['GSW'],manual,
|
||||
manual_nba_hou,Toyota Center,Houston,,29.7508,-95.3621,0,NBA,['HOU'],manual,
|
||||
manual_nba_ind,Gainbridge Fieldhouse,Indianapolis,,39.764,-86.1555,0,NBA,['IND'],manual,
|
||||
manual_nba_lac,Intuit Dome,Inglewood,,33.9425,-118.3419,0,NBA,['LAC'],manual,
|
||||
manual_nba_lal,Crypto.com Arena,Los Angeles,,34.043,-118.2673,0,NBA,['LAL'],manual,
|
||||
manual_nba_mem,FedExForum,Memphis,,35.1382,-90.0506,0,NBA,['MEM'],manual,
|
||||
manual_nba_mia,Kaseya Center,Miami,,25.7814,-80.187,0,NBA,['MIA'],manual,
|
||||
manual_nba_mil,Fiserv Forum,Milwaukee,,43.0451,-87.9174,0,NBA,['MIL'],manual,
|
||||
manual_nba_min,Target Center,Minneapolis,,44.9795,-93.2761,0,NBA,['MIN'],manual,
|
||||
manual_nba_nop,Smoothie King Center,New Orleans,,29.949,-90.0821,0,NBA,['NOP'],manual,
|
||||
manual_nba_nyk,Madison Square Garden,New York,,40.7505,-73.9934,0,NBA,['NYK'],manual,
|
||||
manual_nba_okc,Paycom Center,Oklahoma City,,35.4634,-97.5151,0,NBA,['OKC'],manual,
|
||||
manual_nba_orl,Kia Center,Orlando,,28.5392,-81.3839,0,NBA,['ORL'],manual,
|
||||
manual_nba_phi,Wells Fargo Center,Philadelphia,,39.9012,-75.172,0,NBA,['PHI'],manual,
|
||||
manual_nba_pho,Footprint Center,Phoenix,,33.4457,-112.0712,0,NBA,['PHO'],manual,
|
||||
manual_nba_por,Moda Center,Portland,,45.5316,-122.6668,0,NBA,['POR'],manual,
|
||||
manual_nba_sac,Golden 1 Center,Sacramento,,38.5802,-121.4997,0,NBA,['SAC'],manual,
|
||||
manual_nba_sas,Frost Bank Center,San Antonio,,29.427,-98.4375,0,NBA,['SAS'],manual,
|
||||
manual_nba_tor,Scotiabank Arena,Toronto,,43.6435,-79.3791,0,NBA,['TOR'],manual,
|
||||
manual_nba_uta,Delta Center,Salt Lake City,,40.7683,-111.9011,0,NBA,['UTA'],manual,
|
||||
manual_nba_was,Capital One Arena,Washington,,38.8982,-77.0209,0,NBA,['WAS'],manual,
|
||||
manual_mlb_ari,Chase Field,Phoenix,AZ,33.4453,-112.0667,48686,MLB,['ARI'],manual,
|
||||
manual_mlb_atl,Truist Park,Atlanta,GA,33.8907,-84.4678,41084,MLB,['ATL'],manual,
|
||||
manual_mlb_bal,Oriole Park at Camden Yards,Baltimore,MD,39.2838,-76.6218,45971,MLB,['BAL'],manual,
|
||||
manual_mlb_bos,Fenway Park,Boston,MA,42.3467,-71.0972,37755,MLB,['BOS'],manual,
|
||||
manual_mlb_chc,Wrigley Field,Chicago,IL,41.9484,-87.6553,41649,MLB,['CHC'],manual,
|
||||
manual_mlb_chw,Guaranteed Rate Field,Chicago,IL,41.8299,-87.6338,40615,MLB,['CHW'],manual,
|
||||
manual_mlb_cin,Great American Ball Park,Cincinnati,OH,39.0979,-84.5082,42319,MLB,['CIN'],manual,
|
||||
manual_mlb_cle,Progressive Field,Cleveland,OH,41.4962,-81.6852,34830,MLB,['CLE'],manual,
|
||||
manual_mlb_col,Coors Field,Denver,CO,39.7559,-104.9942,50144,MLB,['COL'],manual,
|
||||
manual_mlb_det,Comerica Park,Detroit,MI,42.339,-83.0485,41083,MLB,['DET'],manual,
|
||||
manual_mlb_hou,Minute Maid Park,Houston,TX,29.7573,-95.3555,41168,MLB,['HOU'],manual,
|
||||
manual_mlb_kcr,Kauffman Stadium,Kansas City,MO,39.0517,-94.4803,37903,MLB,['KCR'],manual,
|
||||
manual_mlb_laa,Angel Stadium,Anaheim,CA,33.8003,-117.8827,45517,MLB,['LAA'],manual,
|
||||
manual_mlb_lad,Dodger Stadium,Los Angeles,CA,34.0739,-118.24,56000,MLB,['LAD'],manual,
|
||||
manual_mlb_mia,LoanDepot Park,Miami,FL,25.7781,-80.2196,36742,MLB,['MIA'],manual,
|
||||
manual_mlb_mil,American Family Field,Milwaukee,WI,43.028,-87.9712,41900,MLB,['MIL'],manual,
|
||||
manual_mlb_min,Target Field,Minneapolis,MN,44.9817,-93.2776,38544,MLB,['MIN'],manual,
|
||||
manual_mlb_nym,Citi Field,New York,NY,40.7571,-73.8458,41922,MLB,['NYM'],manual,
|
||||
manual_mlb_nyy,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLB,['NYY'],manual,
|
||||
manual_mlb_oak,Sutter Health Park,Sacramento,CA,38.5802,-121.5097,14014,MLB,['OAK'],manual,
|
||||
manual_mlb_phi,Citizens Bank Park,Philadelphia,PA,39.9061,-75.1665,42792,MLB,['PHI'],manual,
|
||||
manual_mlb_pit,PNC Park,Pittsburgh,PA,40.4469,-80.0057,38362,MLB,['PIT'],manual,
|
||||
manual_mlb_sdp,Petco Park,San Diego,CA,32.7076,-117.157,40209,MLB,['SDP'],manual,
|
||||
manual_mlb_sfg,Oracle Park,San Francisco,CA,37.7786,-122.3893,41265,MLB,['SFG'],manual,
|
||||
manual_mlb_sea,T-Mobile Park,Seattle,WA,47.5914,-122.3325,47929,MLB,['SEA'],manual,
|
||||
manual_mlb_stl,Busch Stadium,St. Louis,MO,38.6226,-90.1928,45494,MLB,['STL'],manual,
|
||||
manual_mlb_tbr,Tropicana Field,St. Petersburg,FL,27.7682,-82.6534,25000,MLB,['TBR'],manual,
|
||||
manual_mlb_tex,Globe Life Field,Arlington,TX,32.7473,-97.0845,40300,MLB,['TEX'],manual,
|
||||
manual_mlb_tor,Rogers Centre,Toronto,ON,43.6414,-79.3894,49282,MLB,['TOR'],manual,
|
||||
manual_mlb_wsn,Nationals Park,Washington,DC,38.873,-77.0074,41339,MLB,['WSN'],manual,
|
||||
manual_nhl_ana,Honda Center,Anaheim,CA,33.8078,-117.8765,17174,NHL,['ANA'],manual,
|
||||
manual_nhl_ari,Delta Center,Salt Lake City,UT,40.7683,-111.9011,18306,NHL,['ARI'],manual,
|
||||
manual_nhl_bos,TD Garden,Boston,MA,42.3662,-71.0621,17565,NHL,['BOS'],manual,
|
||||
manual_nhl_buf,KeyBank Center,Buffalo,NY,42.875,-78.8764,19070,NHL,['BUF'],manual,
|
||||
manual_nhl_cgy,Scotiabank Saddledome,Calgary,AB,51.0374,-114.0519,19289,NHL,['CGY'],manual,
|
||||
manual_nhl_car,PNC Arena,Raleigh,NC,35.8034,-78.722,18680,NHL,['CAR'],manual,
|
||||
manual_nhl_chi,United Center,Chicago,IL,41.8807,-87.6742,19717,NHL,['CHI'],manual,
|
||||
manual_nhl_col,Ball Arena,Denver,CO,39.7487,-105.0077,18007,NHL,['COL'],manual,
|
||||
manual_nhl_cbj,Nationwide Arena,Columbus,OH,39.9693,-83.0061,18500,NHL,['CBJ'],manual,
|
||||
manual_nhl_dal,American Airlines Center,Dallas,TX,32.7905,-96.8103,18532,NHL,['DAL'],manual,
|
||||
manual_nhl_det,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,19515,NHL,['DET'],manual,
|
||||
manual_nhl_edm,Rogers Place,Edmonton,AB,53.5469,-113.4978,18347,NHL,['EDM'],manual,
|
||||
manual_nhl_fla,Amerant Bank Arena,Sunrise,FL,26.1584,-80.3256,19250,NHL,['FLA'],manual,
|
||||
manual_nhl_lak,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18230,NHL,['LAK'],manual,
|
||||
manual_nhl_min,Xcel Energy Center,St. Paul,MN,44.9448,-93.101,17954,NHL,['MIN'],manual,
|
||||
manual_nhl_mtl,Bell Centre,Montreal,QC,45.4961,-73.5693,21302,NHL,['MTL'],manual,
|
||||
manual_nhl_nsh,Bridgestone Arena,Nashville,TN,36.1592,-86.7785,17159,NHL,['NSH'],manual,
|
||||
manual_nhl_njd,Prudential Center,Newark,NJ,40.7334,-74.1712,16514,NHL,['NJD'],manual,
|
||||
manual_nhl_nyi,UBS Arena,Elmont,NY,40.7161,-73.7246,17255,NHL,['NYI'],manual,
|
||||
manual_nhl_nyr,Madison Square Garden,New York,NY,40.7505,-73.9934,18006,NHL,['NYR'],manual,
|
||||
manual_nhl_ott,Canadian Tire Centre,Ottawa,ON,45.2969,-75.9272,18652,NHL,['OTT'],manual,
|
||||
manual_nhl_phi,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,19543,NHL,['PHI'],manual,
|
||||
manual_nhl_pit,PPG Paints Arena,Pittsburgh,PA,40.4395,-79.9892,18387,NHL,['PIT'],manual,
|
||||
manual_nhl_sjs,SAP Center,San Jose,CA,37.3327,-121.901,17562,NHL,['SJS'],manual,
|
||||
manual_nhl_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,NHL,['SEA'],manual,
|
||||
manual_nhl_stl,Enterprise Center,St. Louis,MO,38.6268,-90.2025,18096,NHL,['STL'],manual,
|
||||
manual_nhl_tbl,Amalie Arena,Tampa,FL,27.9426,-82.4519,19092,NHL,['TBL'],manual,
|
||||
manual_nhl_tor,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,18819,NHL,['TOR'],manual,
|
||||
manual_nhl_van,Rogers Arena,Vancouver,BC,49.2778,-123.1089,18910,NHL,['VAN'],manual,
|
||||
manual_nhl_vgk,T-Mobile Arena,Las Vegas,NV,36.1028,-115.1784,17500,NHL,['VGK'],manual,
|
||||
manual_nhl_wsh,Capital One Arena,Washington,DC,38.8982,-77.0209,18573,NHL,['WSH'],manual,
|
||||
manual_nhl_wpg,Canada Life Centre,Winnipeg,MB,49.8928,-97.1436,15321,NHL,['WPG'],manual,
|
||||
manual_wnba_atl,Gateway Center Arena,College Park,GA,33.6534,-84.448,3500,WNBA,['ATL'],manual,
|
||||
manual_wnba_chi,Wintrust Arena,Chicago,IL,41.8622,-87.6164,10387,WNBA,['CHI'],manual,
|
||||
manual_wnba_con,Mohegan Sun Arena,Uncasville,CT,41.4946,-72.0874,10000,WNBA,['CON'],manual,
|
||||
manual_wnba_dal,College Park Center,Arlington,TX,32.7298,-97.1137,7000,WNBA,['DAL'],manual,
|
||||
manual_wnba_gsv,Chase Center,San Francisco,CA,37.768,-122.3879,18064,WNBA,['GSV'],manual,
|
||||
manual_wnba_ind,Gainbridge Fieldhouse,Indianapolis,IN,39.764,-86.1555,17274,WNBA,['IND'],manual,
|
||||
manual_wnba_lva,Michelob Ultra Arena,Las Vegas,NV,36.0929,-115.1757,12000,WNBA,['LVA'],manual,
|
||||
manual_wnba_las,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,19068,WNBA,['LAS'],manual,
|
||||
manual_wnba_min,Target Center,Minneapolis,MN,44.9795,-93.2761,17500,WNBA,['MIN'],manual,
|
||||
manual_wnba_nyl,Barclays Center,Brooklyn,NY,40.6826,-73.9754,17732,WNBA,['NYL'],manual,
|
||||
manual_wnba_phx,Footprint Center,Phoenix,AZ,33.4457,-112.0712,17000,WNBA,['PHX'],manual,
|
||||
manual_wnba_sea,Climate Pledge Arena,Seattle,WA,47.6221,-122.354,17100,WNBA,['SEA'],manual,
|
||||
manual_wnba_was,Entertainment & Sports Arena,Washington,DC,38.8701,-76.9728,4200,WNBA,['WAS'],manual,
|
||||
manual_mls_atl,Mercedes-Benz Stadium,Atlanta,GA,33.7553,-84.4006,71000,MLS,['ATL'],manual,
|
||||
manual_mls_atx,Q2 Stadium,Austin,TX,30.3876,-97.72,20738,MLS,['ATX'],manual,
|
||||
manual_mls_clt,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,74867,MLS,['CLT'],manual,
|
||||
manual_mls_chi,Soldier Field,Chicago,IL,41.8623,-87.6167,61500,MLS,['CHI'],manual,
|
||||
manual_mls_cin,TQL Stadium,Cincinnati,OH,39.1113,-84.5212,26000,MLS,['CIN'],manual,
|
||||
manual_mls_col,Dick's Sporting Goods Park,Commerce City,CO,39.8056,-104.8919,18061,MLS,['COL'],manual,
|
||||
manual_mls_clb,Lower.com Field,Columbus,OH,39.9689,-83.0173,20371,MLS,['CLB'],manual,
|
||||
manual_mls_dal,Toyota Stadium,Frisco,TX,33.1546,-96.8353,20500,MLS,['DAL'],manual,
|
||||
manual_mls_dcu,Audi Field,Washington,DC,38.8686,-77.0128,20000,MLS,['DCU'],manual,
|
||||
manual_mls_hou,Shell Energy Stadium,Houston,TX,29.7523,-95.3522,22039,MLS,['HOU'],manual,
|
||||
manual_mls_lag,Dignity Health Sports Park,Carson,CA,33.8644,-118.2611,27000,MLS,['LAG'],manual,
|
||||
manual_mls_lafc,BMO Stadium,Los Angeles,CA,34.0128,-118.2841,22000,MLS,['LAFC'],manual,
|
||||
manual_mls_mia,Chase Stadium,Fort Lauderdale,FL,26.1902,-80.163,21550,MLS,['MIA'],manual,
|
||||
manual_mls_min,Allianz Field,St. Paul,MN,44.9532,-93.1653,19400,MLS,['MIN'],manual,
|
||||
manual_mls_mtl,Stade Saputo,Montreal,QC,45.5628,-73.553,19619,MLS,['MTL'],manual,
|
||||
manual_mls_nsh,Geodis Park,Nashville,TN,36.1303,-86.7663,30000,MLS,['NSH'],manual,
|
||||
manual_mls_ner,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,65878,MLS,['NER'],manual,
|
||||
manual_mls_nyc,Yankee Stadium,New York,NY,40.8296,-73.9262,46537,MLS,['NYC'],manual,
|
||||
manual_mls_rbny,Red Bull Arena,Harrison,NJ,40.7368,-74.1503,25000,MLS,['RBNY'],manual,
|
||||
manual_mls_orl,Inter&Co Stadium,Orlando,FL,28.5411,-81.3899,25500,MLS,['ORL'],manual,
|
||||
manual_mls_phi,Subaru Park,Chester,PA,39.8328,-75.3789,18500,MLS,['PHI'],manual,
|
||||
manual_mls_por,Providence Park,Portland,OR,45.5217,-122.6917,25218,MLS,['POR'],manual,
|
||||
manual_mls_rsl,America First Field,Sandy,UT,40.5828,-111.8933,20213,MLS,['RSL'],manual,
|
||||
manual_mls_sje,PayPal Park,San Jose,CA,37.3513,-121.9253,18000,MLS,['SJE'],manual,
|
||||
manual_mls_sea,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,MLS,['SEA'],manual,
|
||||
manual_mls_skc,Children's Mercy Park,Kansas City,KS,39.1218,-94.8234,18467,MLS,['SKC'],manual,
|
||||
manual_mls_stl,CityPark,St. Louis,MO,38.6322,-90.2094,22500,MLS,['STL'],manual,
|
||||
manual_mls_tor,BMO Field,Toronto,ON,43.6332,-79.4186,30000,MLS,['TOR'],manual,
|
||||
manual_mls_van,BC Place,Vancouver,BC,49.2768,-123.1118,54320,MLS,['VAN'],manual,
|
||||
manual_mls_sdg,Snapdragon Stadium,San Diego,CA,32.7839,-117.1224,35000,MLS,['SDG'],manual,
|
||||
manual_nwsl_ang,BMO Stadium,Los Angeles,CA,34.0128,-118.2841,22000,NWSL,['ANG'],manual,
|
||||
manual_nwsl_bay,PayPal Park,San Jose,CA,37.3513,-121.9253,18000,NWSL,['BAY'],manual,
|
||||
manual_nwsl_chi,SeatGeek Stadium,Chicago,IL,41.6462,-87.7304,20000,NWSL,['CHI'],manual,
|
||||
manual_nwsl_hou,Shell Energy Stadium,Houston,TX,29.7523,-95.3522,22039,NWSL,['HOU'],manual,
|
||||
manual_nwsl_kcc,CPKC Stadium,Kansas City,KS,39.0851,-94.5582,11500,NWSL,['KCC'],manual,
|
||||
manual_nwsl_njy,Red Bull Arena,Harrison,NJ,40.7368,-74.1503,25000,NWSL,['NJY'],manual,
|
||||
manual_nwsl_ncc,WakeMed Soccer Park,Cary,NC,35.8589,-78.7989,10000,NWSL,['NCC'],manual,
|
||||
manual_nwsl_orl,Inter&Co Stadium,Orlando,FL,28.5411,-81.3899,25500,NWSL,['ORL'],manual,
|
||||
manual_nwsl_por,Providence Park,Portland,OR,45.5217,-122.6917,25218,NWSL,['POR'],manual,
|
||||
manual_nwsl_rgn,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,NWSL,['RGN'],manual,
|
||||
manual_nwsl_sdw,Snapdragon Stadium,San Diego,CA,32.7839,-117.1224,35000,NWSL,['SDW'],manual,
|
||||
manual_nwsl_uta,America First Field,Sandy,UT,40.5828,-111.8933,20213,NWSL,['UTA'],manual,
|
||||
manual_nwsl_wsh,Audi Field,Washington,DC,38.8686,-77.0128,20000,NWSL,['WSH'],manual,
|
||||
manual_nfl_ari,State Farm Stadium,Glendale,AZ,33.5276,-112.2626,63400,NFL,['ARI'],manual,
|
||||
manual_nfl_atl,Mercedes-Benz Stadium,Atlanta,GA,33.7553,-84.4006,71000,NFL,['ATL'],manual,
|
||||
manual_nfl_bal,M&T Bank Stadium,Baltimore,MD,39.278,-76.6227,71008,NFL,['BAL'],manual,
|
||||
manual_nfl_buf,Highmark Stadium,Orchard Park,NY,42.7738,-78.787,71608,NFL,['BUF'],manual,
|
||||
manual_nfl_car,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,74867,NFL,['CAR'],manual,
|
||||
manual_nfl_chi,Soldier Field,Chicago,IL,41.8623,-87.6167,61500,NFL,['CHI'],manual,
|
||||
manual_nfl_cin,Paycor Stadium,Cincinnati,OH,39.0954,-84.516,65515,NFL,['CIN'],manual,
|
||||
manual_nfl_cle,Cleveland Browns Stadium,Cleveland,OH,41.5061,-81.6995,67431,NFL,['CLE'],manual,
|
||||
manual_nfl_dal,AT&T Stadium,Arlington,TX,32.748,-97.0928,80000,NFL,['DAL'],manual,
|
||||
manual_nfl_den,Empower Field at Mile High,Denver,CO,39.7439,-105.0201,76125,NFL,['DEN'],manual,
|
||||
manual_nfl_det,Ford Field,Detroit,MI,42.34,-83.0456,65000,NFL,['DET'],manual,
|
||||
manual_nfl_gb,Lambeau Field,Green Bay,WI,44.5013,-88.0622,81435,NFL,['GB'],manual,
|
||||
manual_nfl_hou,NRG Stadium,Houston,TX,29.6847,-95.4107,72220,NFL,['HOU'],manual,
|
||||
manual_nfl_ind,Lucas Oil Stadium,Indianapolis,IN,39.7601,-86.1639,67000,NFL,['IND'],manual,
|
||||
manual_nfl_jax,EverBank Stadium,Jacksonville,FL,30.3239,-81.6373,67814,NFL,['JAX'],manual,
|
||||
manual_nfl_kc,GEHA Field at Arrowhead Stadium,Kansas City,MO,39.0489,-94.4839,76416,NFL,['KC'],manual,
|
||||
manual_nfl_lv,Allegiant Stadium,Las Vegas,NV,36.0909,-115.1833,65000,NFL,['LV'],manual,
|
||||
manual_nfl_lac,SoFi Stadium,Inglewood,CA,33.9535,-118.3392,70240,NFL,['LAC'],manual,
|
||||
manual_nfl_lar,SoFi Stadium,Inglewood,CA,33.9535,-118.3392,70240,NFL,['LAR'],manual,
|
||||
manual_nfl_mia,Hard Rock Stadium,Miami Gardens,FL,25.958,-80.2389,65326,NFL,['MIA'],manual,
|
||||
manual_nfl_min,U.S. Bank Stadium,Minneapolis,MN,44.9737,-93.2577,66655,NFL,['MIN'],manual,
|
||||
manual_nfl_ne,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,65878,NFL,['NE'],manual,
|
||||
manual_nfl_no,Caesars Superdome,New Orleans,LA,29.9511,-90.0812,73208,NFL,['NO'],manual,
|
||||
manual_nfl_nyg,MetLife Stadium,East Rutherford,NJ,40.8128,-74.0742,82500,NFL,['NYG'],manual,
|
||||
manual_nfl_nyj,MetLife Stadium,East Rutherford,NJ,40.8128,-74.0742,82500,NFL,['NYJ'],manual,
|
||||
manual_nfl_phi,Lincoln Financial Field,Philadelphia,PA,39.9008,-75.1674,69176,NFL,['PHI'],manual,
|
||||
manual_nfl_pit,Acrisure Stadium,Pittsburgh,PA,40.4468,-80.0158,68400,NFL,['PIT'],manual,
|
||||
manual_nfl_sf,Levi's Stadium,Santa Clara,CA,37.4032,-121.9698,68500,NFL,['SF'],manual,
|
||||
manual_nfl_sea,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,NFL,['SEA'],manual,
|
||||
manual_nfl_tb,Raymond James Stadium,Tampa,FL,27.9759,-82.5033,65618,NFL,['TB'],manual,
|
||||
manual_nfl_ten,Nissan Stadium,Nashville,TN,36.1665,-86.7713,69143,NFL,['TEN'],manual,
|
||||
manual_nfl_was,Northwest Stadium,Landover,MD,38.9076,-76.8645,67617,NFL,['WAS'],manual,
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1286,5 +1286,789 @@
|
||||
"WPG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_gateway_center_arena",
|
||||
"name": "Gateway Center Arena",
|
||||
"city": "College Park",
|
||||
"state": "GA",
|
||||
"latitude": 33.6534,
|
||||
"longitude": -84.448,
|
||||
"capacity": 3500,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"ATL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_wintrust_arena",
|
||||
"name": "Wintrust Arena",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.8622,
|
||||
"longitude": -87.6164,
|
||||
"capacity": 10387,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_mohegan_sun_arena",
|
||||
"name": "Mohegan Sun Arena",
|
||||
"city": "Uncasville",
|
||||
"state": "CT",
|
||||
"latitude": 41.4946,
|
||||
"longitude": -72.0874,
|
||||
"capacity": 10000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"CON"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_college_park_center",
|
||||
"name": "College Park Center",
|
||||
"city": "Arlington",
|
||||
"state": "TX",
|
||||
"latitude": 32.7298,
|
||||
"longitude": -97.1137,
|
||||
"capacity": 7000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"DAL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_chase_center",
|
||||
"name": "Chase Center",
|
||||
"city": "San Francisco",
|
||||
"state": "CA",
|
||||
"latitude": 37.768,
|
||||
"longitude": -122.3879,
|
||||
"capacity": 18064,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"GSV"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_gainbridge_fieldhouse",
|
||||
"name": "Gainbridge Fieldhouse",
|
||||
"city": "Indianapolis",
|
||||
"state": "IN",
|
||||
"latitude": 39.764,
|
||||
"longitude": -86.1555,
|
||||
"capacity": 17274,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"IND"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_michelob_ultra_arena",
|
||||
"name": "Michelob Ultra Arena",
|
||||
"city": "Las Vegas",
|
||||
"state": "NV",
|
||||
"latitude": 36.0929,
|
||||
"longitude": -115.1757,
|
||||
"capacity": 12000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"LVA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_cryptocom_arena",
|
||||
"name": "Crypto.com Arena",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.043,
|
||||
"longitude": -118.2673,
|
||||
"capacity": 19068,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"LAS"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_target_center",
|
||||
"name": "Target Center",
|
||||
"city": "Minneapolis",
|
||||
"state": "MN",
|
||||
"latitude": 44.9795,
|
||||
"longitude": -93.2761,
|
||||
"capacity": 17500,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"MIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_barclays_center",
|
||||
"name": "Barclays Center",
|
||||
"city": "Brooklyn",
|
||||
"state": "NY",
|
||||
"latitude": 40.6826,
|
||||
"longitude": -73.9754,
|
||||
"capacity": 17732,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"NYL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_footprint_center",
|
||||
"name": "Footprint Center",
|
||||
"city": "Phoenix",
|
||||
"state": "AZ",
|
||||
"latitude": 33.4457,
|
||||
"longitude": -112.0712,
|
||||
"capacity": 17000,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"PHX"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_climate_pledge_arena",
|
||||
"name": "Climate Pledge Arena",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.6221,
|
||||
"longitude": -122.354,
|
||||
"capacity": 17100,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"SEA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_wnba_entertainment_sports_arena",
|
||||
"name": "Entertainment & Sports Arena",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8701,
|
||||
"longitude": -76.9728,
|
||||
"capacity": 4200,
|
||||
"sport": "WNBA",
|
||||
"primary_team_abbrevs": [
|
||||
"WAS"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_mercedesbenz_stadium",
|
||||
"name": "Mercedes-Benz Stadium",
|
||||
"city": "Atlanta",
|
||||
"state": "GA",
|
||||
"latitude": 33.7553,
|
||||
"longitude": -84.4006,
|
||||
"capacity": 71000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ATL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_q2_stadium",
|
||||
"name": "Q2 Stadium",
|
||||
"city": "Austin",
|
||||
"state": "TX",
|
||||
"latitude": 30.3876,
|
||||
"longitude": -97.72,
|
||||
"capacity": 20738,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ATX"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bank_of_america_stadium",
|
||||
"name": "Bank of America Stadium",
|
||||
"city": "Charlotte",
|
||||
"state": "NC",
|
||||
"latitude": 35.2258,
|
||||
"longitude": -80.8528,
|
||||
"capacity": 74867,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CLT"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_soldier_field",
|
||||
"name": "Soldier Field",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.8623,
|
||||
"longitude": -87.6167,
|
||||
"capacity": 61500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_tql_stadium",
|
||||
"name": "TQL Stadium",
|
||||
"city": "Cincinnati",
|
||||
"state": "OH",
|
||||
"latitude": 39.1113,
|
||||
"longitude": -84.5212,
|
||||
"capacity": 26000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_dicks_sporting_goods_park",
|
||||
"name": "Dick's Sporting Goods Park",
|
||||
"city": "Commerce City",
|
||||
"state": "CO",
|
||||
"latitude": 39.8056,
|
||||
"longitude": -104.8919,
|
||||
"capacity": 18061,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"COL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_lowercom_field",
|
||||
"name": "Lower.com Field",
|
||||
"city": "Columbus",
|
||||
"state": "OH",
|
||||
"latitude": 39.9689,
|
||||
"longitude": -83.0173,
|
||||
"capacity": 20371,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"CLB"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_toyota_stadium",
|
||||
"name": "Toyota Stadium",
|
||||
"city": "Frisco",
|
||||
"state": "TX",
|
||||
"latitude": 33.1546,
|
||||
"longitude": -96.8353,
|
||||
"capacity": 20500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"DAL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_audi_field",
|
||||
"name": "Audi Field",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8686,
|
||||
"longitude": -77.0128,
|
||||
"capacity": 20000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"DCU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_shell_energy_stadium",
|
||||
"name": "Shell Energy Stadium",
|
||||
"city": "Houston",
|
||||
"state": "TX",
|
||||
"latitude": 29.7523,
|
||||
"longitude": -95.3522,
|
||||
"capacity": 22039,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"HOU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_dignity_health_sports_park",
|
||||
"name": "Dignity Health Sports Park",
|
||||
"city": "Carson",
|
||||
"state": "CA",
|
||||
"latitude": 33.8644,
|
||||
"longitude": -118.2611,
|
||||
"capacity": 27000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"LAG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bmo_stadium",
|
||||
"name": "BMO Stadium",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.0128,
|
||||
"longitude": -118.2841,
|
||||
"capacity": 22000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"LAFC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_chase_stadium",
|
||||
"name": "Chase Stadium",
|
||||
"city": "Fort Lauderdale",
|
||||
"state": "FL",
|
||||
"latitude": 26.1902,
|
||||
"longitude": -80.163,
|
||||
"capacity": 21550,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MIA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_allianz_field",
|
||||
"name": "Allianz Field",
|
||||
"city": "St. Paul",
|
||||
"state": "MN",
|
||||
"latitude": 44.9532,
|
||||
"longitude": -93.1653,
|
||||
"capacity": 19400,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MIN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_stade_saputo",
|
||||
"name": "Stade Saputo",
|
||||
"city": "Montreal",
|
||||
"state": "QC",
|
||||
"latitude": 45.5628,
|
||||
"longitude": -73.553,
|
||||
"capacity": 19619,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"MTL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_geodis_park",
|
||||
"name": "Geodis Park",
|
||||
"city": "Nashville",
|
||||
"state": "TN",
|
||||
"latitude": 36.1303,
|
||||
"longitude": -86.7663,
|
||||
"capacity": 30000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NSH"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_gillette_stadium",
|
||||
"name": "Gillette Stadium",
|
||||
"city": "Foxborough",
|
||||
"state": "MA",
|
||||
"latitude": 42.0909,
|
||||
"longitude": -71.2643,
|
||||
"capacity": 65878,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NER"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_yankee_stadium",
|
||||
"name": "Yankee Stadium",
|
||||
"city": "New York",
|
||||
"state": "NY",
|
||||
"latitude": 40.8296,
|
||||
"longitude": -73.9262,
|
||||
"capacity": 46537,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"NYC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_red_bull_arena",
|
||||
"name": "Red Bull Arena",
|
||||
"city": "Harrison",
|
||||
"state": "NJ",
|
||||
"latitude": 40.7368,
|
||||
"longitude": -74.1503,
|
||||
"capacity": 25000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"RBNY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_interco_stadium",
|
||||
"name": "Inter&Co Stadium",
|
||||
"city": "Orlando",
|
||||
"state": "FL",
|
||||
"latitude": 28.5411,
|
||||
"longitude": -81.3899,
|
||||
"capacity": 25500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"ORL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_subaru_park",
|
||||
"name": "Subaru Park",
|
||||
"city": "Chester",
|
||||
"state": "PA",
|
||||
"latitude": 39.8328,
|
||||
"longitude": -75.3789,
|
||||
"capacity": 18500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"PHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_providence_park",
|
||||
"name": "Providence Park",
|
||||
"city": "Portland",
|
||||
"state": "OR",
|
||||
"latitude": 45.5217,
|
||||
"longitude": -122.6917,
|
||||
"capacity": 25218,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"POR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_america_first_field",
|
||||
"name": "America First Field",
|
||||
"city": "Sandy",
|
||||
"state": "UT",
|
||||
"latitude": 40.5828,
|
||||
"longitude": -111.8933,
|
||||
"capacity": 20213,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"RSL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_paypal_park",
|
||||
"name": "PayPal Park",
|
||||
"city": "San Jose",
|
||||
"state": "CA",
|
||||
"latitude": 37.3513,
|
||||
"longitude": -121.9253,
|
||||
"capacity": 18000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SJE"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_lumen_field",
|
||||
"name": "Lumen Field",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.5952,
|
||||
"longitude": -122.3316,
|
||||
"capacity": 68740,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SEA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_childrens_mercy_park",
|
||||
"name": "Children's Mercy Park",
|
||||
"city": "Kansas City",
|
||||
"state": "KS",
|
||||
"latitude": 39.1218,
|
||||
"longitude": -94.8234,
|
||||
"capacity": 18467,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SKC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_citypark",
|
||||
"name": "CityPark",
|
||||
"city": "St. Louis",
|
||||
"state": "MO",
|
||||
"latitude": 38.6322,
|
||||
"longitude": -90.2094,
|
||||
"capacity": 22500,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"STL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bmo_field",
|
||||
"name": "BMO Field",
|
||||
"city": "Toronto",
|
||||
"state": "ON",
|
||||
"latitude": 43.6332,
|
||||
"longitude": -79.4186,
|
||||
"capacity": 30000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"TOR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_bc_place",
|
||||
"name": "BC Place",
|
||||
"city": "Vancouver",
|
||||
"state": "BC",
|
||||
"latitude": 49.2768,
|
||||
"longitude": -123.1118,
|
||||
"capacity": 54320,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"VAN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_mls_snapdragon_stadium",
|
||||
"name": "Snapdragon Stadium",
|
||||
"city": "San Diego",
|
||||
"state": "CA",
|
||||
"latitude": 32.7839,
|
||||
"longitude": -117.1224,
|
||||
"capacity": 35000,
|
||||
"sport": "MLS",
|
||||
"primary_team_abbrevs": [
|
||||
"SDG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_bmo_stadium",
|
||||
"name": "BMO Stadium",
|
||||
"city": "Los Angeles",
|
||||
"state": "CA",
|
||||
"latitude": 34.0128,
|
||||
"longitude": -118.2841,
|
||||
"capacity": 22000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"ANG"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_paypal_park",
|
||||
"name": "PayPal Park",
|
||||
"city": "San Jose",
|
||||
"state": "CA",
|
||||
"latitude": 37.3513,
|
||||
"longitude": -121.9253,
|
||||
"capacity": 18000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"BAY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_seatgeek_stadium",
|
||||
"name": "SeatGeek Stadium",
|
||||
"city": "Chicago",
|
||||
"state": "IL",
|
||||
"latitude": 41.6462,
|
||||
"longitude": -87.7304,
|
||||
"capacity": 20000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"CHI"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_shell_energy_stadium",
|
||||
"name": "Shell Energy Stadium",
|
||||
"city": "Houston",
|
||||
"state": "TX",
|
||||
"latitude": 29.7523,
|
||||
"longitude": -95.3522,
|
||||
"capacity": 22039,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"HOU"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_cpkc_stadium",
|
||||
"name": "CPKC Stadium",
|
||||
"city": "Kansas City",
|
||||
"state": "KS",
|
||||
"latitude": 39.0851,
|
||||
"longitude": -94.5582,
|
||||
"capacity": 11500,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"KCC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_red_bull_arena",
|
||||
"name": "Red Bull Arena",
|
||||
"city": "Harrison",
|
||||
"state": "NJ",
|
||||
"latitude": 40.7368,
|
||||
"longitude": -74.1503,
|
||||
"capacity": 25000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"NJY"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_wakemed_soccer_park",
|
||||
"name": "WakeMed Soccer Park",
|
||||
"city": "Cary",
|
||||
"state": "NC",
|
||||
"latitude": 35.8589,
|
||||
"longitude": -78.7989,
|
||||
"capacity": 10000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"NCC"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_interco_stadium",
|
||||
"name": "Inter&Co Stadium",
|
||||
"city": "Orlando",
|
||||
"state": "FL",
|
||||
"latitude": 28.5411,
|
||||
"longitude": -81.3899,
|
||||
"capacity": 25500,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"ORL"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_providence_park",
|
||||
"name": "Providence Park",
|
||||
"city": "Portland",
|
||||
"state": "OR",
|
||||
"latitude": 45.5217,
|
||||
"longitude": -122.6917,
|
||||
"capacity": 25218,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"POR"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_lumen_field",
|
||||
"name": "Lumen Field",
|
||||
"city": "Seattle",
|
||||
"state": "WA",
|
||||
"latitude": 47.5952,
|
||||
"longitude": -122.3316,
|
||||
"capacity": 68740,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"RGN"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_snapdragon_stadium",
|
||||
"name": "Snapdragon Stadium",
|
||||
"city": "San Diego",
|
||||
"state": "CA",
|
||||
"latitude": 32.7839,
|
||||
"longitude": -117.1224,
|
||||
"capacity": 35000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"SDW"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_america_first_field",
|
||||
"name": "America First Field",
|
||||
"city": "Sandy",
|
||||
"state": "UT",
|
||||
"latitude": 40.5828,
|
||||
"longitude": -111.8933,
|
||||
"capacity": 20213,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"UTA"
|
||||
],
|
||||
"year_opened": null
|
||||
},
|
||||
{
|
||||
"canonical_id": "stadium_nwsl_audi_field",
|
||||
"name": "Audi Field",
|
||||
"city": "Washington",
|
||||
"state": "DC",
|
||||
"latitude": 38.8686,
|
||||
"longitude": -77.0128,
|
||||
"capacity": 20000,
|
||||
"sport": "NWSL",
|
||||
"primary_team_abbrevs": [
|
||||
"WSH"
|
||||
],
|
||||
"year_opened": null
|
||||
}
|
||||
]
|
||||
@@ -31,9 +31,24 @@ from dataclasses import dataclass, asdict
|
||||
|
||||
# Import pipeline components
|
||||
from scrape_schedules import (
|
||||
scrape_nba_basketball_reference,
|
||||
scrape_mlb_statsapi,
|
||||
scrape_nhl_hockey_reference,
|
||||
ScraperSource, scrape_with_fallback,
|
||||
# NBA sources
|
||||
scrape_nba_basketball_reference, scrape_nba_espn, scrape_nba_cbssports,
|
||||
# MLB sources
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference, scrape_mlb_espn,
|
||||
# NHL sources
|
||||
scrape_nhl_hockey_reference, scrape_nhl_espn, scrape_nhl_api,
|
||||
# NFL sources
|
||||
scrape_nfl_espn, scrape_nfl_pro_football_reference, scrape_nfl_cbssports,
|
||||
# WNBA sources
|
||||
scrape_wnba_espn, scrape_wnba_basketball_reference, scrape_wnba_cbssports,
|
||||
# MLS sources
|
||||
scrape_mls_espn, scrape_mls_fbref, scrape_mls_mlssoccer,
|
||||
# NWSL sources
|
||||
scrape_nwsl_espn, scrape_nwsl_fbref, scrape_nwsl_nwslsoccer,
|
||||
# CBB sources
|
||||
scrape_cbb_espn, scrape_cbb_sports_reference, scrape_cbb_cbssports,
|
||||
# Utilities
|
||||
generate_stadiums_from_teams,
|
||||
assign_stable_ids,
|
||||
export_to_json,
|
||||
@@ -114,28 +129,90 @@ def run_pipeline(
|
||||
all_stadiums = generate_stadiums_from_teams()
|
||||
print(f" Generated {len(all_stadiums)} stadiums from team data")
|
||||
|
||||
# Scrape NBA
|
||||
# Scrape all sports with multi-source fallback
|
||||
print_section(f"NBA {season}")
|
||||
nba_games = scrape_nba_basketball_reference(season)
|
||||
nba_sources = [
|
||||
ScraperSource('Basketball-Reference', scrape_nba_basketball_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nba_espn, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_nba_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nba_games = scrape_with_fallback('NBA', season, nba_sources)
|
||||
nba_season = f"{season-1}-{str(season)[2:]}"
|
||||
nba_games = assign_stable_ids(nba_games, 'NBA', nba_season)
|
||||
all_games.extend(nba_games)
|
||||
print(f" Scraped {len(nba_games)} NBA games")
|
||||
|
||||
# Scrape MLB
|
||||
print_section(f"MLB {season}")
|
||||
mlb_games = scrape_mlb_statsapi(season)
|
||||
mlb_sources = [
|
||||
ScraperSource('MLB Stats API', scrape_mlb_statsapi, priority=1, min_games=1000),
|
||||
ScraperSource('Baseball-Reference', scrape_mlb_baseball_reference, priority=2, min_games=500),
|
||||
ScraperSource('ESPN', scrape_mlb_espn, priority=3, min_games=500),
|
||||
]
|
||||
mlb_games = scrape_with_fallback('MLB', season, mlb_sources)
|
||||
mlb_games = assign_stable_ids(mlb_games, 'MLB', str(season))
|
||||
all_games.extend(mlb_games)
|
||||
print(f" Scraped {len(mlb_games)} MLB games")
|
||||
|
||||
# Scrape NHL
|
||||
print_section(f"NHL {season}")
|
||||
nhl_games = scrape_nhl_hockey_reference(season)
|
||||
nhl_sources = [
|
||||
ScraperSource('Hockey-Reference', scrape_nhl_hockey_reference, priority=1, min_games=500),
|
||||
ScraperSource('ESPN', scrape_nhl_espn, priority=2, min_games=500),
|
||||
ScraperSource('NHL API', scrape_nhl_api, priority=3, min_games=100),
|
||||
]
|
||||
nhl_games = scrape_with_fallback('NHL', season, nhl_sources)
|
||||
nhl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nhl_games = assign_stable_ids(nhl_games, 'NHL', nhl_season)
|
||||
all_games.extend(nhl_games)
|
||||
print(f" Scraped {len(nhl_games)} NHL games")
|
||||
|
||||
print_section(f"NFL {season}")
|
||||
nfl_sources = [
|
||||
ScraperSource('ESPN', scrape_nfl_espn, priority=1, min_games=200),
|
||||
ScraperSource('Pro-Football-Reference', scrape_nfl_pro_football_reference, priority=2, min_games=200),
|
||||
ScraperSource('CBS Sports', scrape_nfl_cbssports, priority=3, min_games=100),
|
||||
]
|
||||
nfl_games = scrape_with_fallback('NFL', season, nfl_sources)
|
||||
nfl_season = f"{season-1}-{str(season)[2:]}"
|
||||
nfl_games = assign_stable_ids(nfl_games, 'NFL', nfl_season)
|
||||
all_games.extend(nfl_games)
|
||||
|
||||
print_section(f"WNBA {season}")
|
||||
wnba_sources = [
|
||||
ScraperSource('ESPN', scrape_wnba_espn, priority=1, min_games=100),
|
||||
ScraperSource('Basketball-Reference', scrape_wnba_basketball_reference, priority=2, min_games=100),
|
||||
ScraperSource('CBS Sports', scrape_wnba_cbssports, priority=3, min_games=50),
|
||||
]
|
||||
wnba_games = scrape_with_fallback('WNBA', season, wnba_sources)
|
||||
wnba_games = assign_stable_ids(wnba_games, 'WNBA', str(season))
|
||||
all_games.extend(wnba_games)
|
||||
|
||||
print_section(f"MLS {season}")
|
||||
mls_sources = [
|
||||
ScraperSource('ESPN', scrape_mls_espn, priority=1, min_games=200),
|
||||
ScraperSource('FBref', scrape_mls_fbref, priority=2, min_games=100),
|
||||
ScraperSource('MLSSoccer.com', scrape_mls_mlssoccer, priority=3, min_games=100),
|
||||
]
|
||||
mls_games = scrape_with_fallback('MLS', season, mls_sources)
|
||||
mls_games = assign_stable_ids(mls_games, 'MLS', str(season))
|
||||
all_games.extend(mls_games)
|
||||
|
||||
print_section(f"NWSL {season}")
|
||||
nwsl_sources = [
|
||||
ScraperSource('ESPN', scrape_nwsl_espn, priority=1, min_games=100),
|
||||
ScraperSource('FBref', scrape_nwsl_fbref, priority=2, min_games=50),
|
||||
ScraperSource('NWSL.com', scrape_nwsl_nwslsoccer, priority=3, min_games=50),
|
||||
]
|
||||
nwsl_games = scrape_with_fallback('NWSL', season, nwsl_sources)
|
||||
nwsl_games = assign_stable_ids(nwsl_games, 'NWSL', str(season))
|
||||
all_games.extend(nwsl_games)
|
||||
|
||||
print_section(f"CBB {season}")
|
||||
cbb_sources = [
|
||||
ScraperSource('ESPN', scrape_cbb_espn, priority=1, min_games=1000),
|
||||
ScraperSource('Sports-Reference', scrape_cbb_sports_reference, priority=2, min_games=500),
|
||||
ScraperSource('CBS Sports', scrape_cbb_cbssports, priority=3, min_games=300),
|
||||
]
|
||||
cbb_games = scrape_with_fallback('CBB', season, cbb_sources)
|
||||
cbb_season = f"{season-1}-{str(season)[2:]}"
|
||||
cbb_games = assign_stable_ids(cbb_games, 'CBB', cbb_season)
|
||||
all_games.extend(cbb_games)
|
||||
|
||||
# Export raw data
|
||||
print_section("Exporting Raw Data")
|
||||
@@ -148,16 +225,36 @@ def run_pipeline(
|
||||
else:
|
||||
print_header("LOADING EXISTING RAW DATA")
|
||||
|
||||
games_file = output_dir / 'games.json'
|
||||
stadiums_file = output_dir / 'stadiums.json'
|
||||
# Try loading from new structure first (games/*.json)
|
||||
games_dir = output_dir / 'games'
|
||||
raw_games = []
|
||||
|
||||
with open(games_file) as f:
|
||||
raw_games = json.load(f)
|
||||
print(f" Loaded {len(raw_games)} raw games")
|
||||
if games_dir.exists() and any(games_dir.glob('*.json')):
|
||||
print_section("Loading from games/ directory")
|
||||
for games_file in sorted(games_dir.glob('*.json')):
|
||||
with open(games_file) as f:
|
||||
file_games = json.load(f)
|
||||
raw_games.extend(file_games)
|
||||
print(f" Loaded {len(file_games):,} games from {games_file.name}")
|
||||
else:
|
||||
# Fallback to legacy games.json
|
||||
print_section("Loading from legacy games.json")
|
||||
games_file = output_dir / 'games.json'
|
||||
with open(games_file) as f:
|
||||
raw_games = json.load(f)
|
||||
|
||||
with open(stadiums_file) as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums")
|
||||
print(f" Total: {len(raw_games):,} raw games")
|
||||
|
||||
# Try loading stadiums from canonical/ first, then legacy
|
||||
canonical_dir = output_dir / 'canonical'
|
||||
if (canonical_dir / 'stadiums.json').exists():
|
||||
with open(canonical_dir / 'stadiums.json') as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums from canonical/stadiums.json")
|
||||
else:
|
||||
with open(output_dir / 'stadiums.json') as f:
|
||||
raw_stadiums = json.load(f)
|
||||
print(f" Loaded {len(raw_stadiums)} raw stadiums from stadiums.json")
|
||||
|
||||
# =========================================================================
|
||||
# STAGE 2: CANONICALIZE STADIUMS
|
||||
@@ -242,13 +339,32 @@ def run_pipeline(
|
||||
for issue, count in by_issue.items():
|
||||
print(f" - {issue}: {count}")
|
||||
|
||||
# Export
|
||||
games_canonical_path = output_dir / 'games_canonical.json'
|
||||
# Export games to new structure: canonical/games/{sport}_{season}.json
|
||||
canonical_games_dir = output_dir / 'canonical' / 'games'
|
||||
canonical_games_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Group games by sport and season
|
||||
games_by_sport_season = {}
|
||||
for game in canonical_games_list:
|
||||
sport = game.sport.lower()
|
||||
season = game.season
|
||||
key = f"{sport}_{season}"
|
||||
if key not in games_by_sport_season:
|
||||
games_by_sport_season[key] = []
|
||||
games_by_sport_season[key].append(game)
|
||||
|
||||
# Export each sport/season file
|
||||
for key, sport_games in sorted(games_by_sport_season.items()):
|
||||
filepath = canonical_games_dir / f"{key}.json"
|
||||
with open(filepath, 'w') as f:
|
||||
json.dump([asdict(g) for g in sport_games], f, indent=2)
|
||||
print(f" Exported {len(sport_games):,} games to canonical/games/{key}.json")
|
||||
|
||||
# Also export combined games_canonical.json for backward compatibility
|
||||
games_canonical_path = output_dir / 'games_canonical.json'
|
||||
with open(games_canonical_path, 'w') as f:
|
||||
json.dump([asdict(g) for g in canonical_games_list], f, indent=2)
|
||||
|
||||
print(f" Exported to {games_canonical_path}")
|
||||
print(f" Exported combined to {games_canonical_path}")
|
||||
|
||||
# =========================================================================
|
||||
# STAGE 5: VALIDATE
|
||||
@@ -320,7 +436,8 @@ def run_pipeline(
|
||||
print(f" - {output_dir / 'stadiums_canonical.json'}")
|
||||
print(f" - {output_dir / 'stadium_aliases.json'}")
|
||||
print(f" - {output_dir / 'teams_canonical.json'}")
|
||||
print(f" - {output_dir / 'games_canonical.json'}")
|
||||
print(f" - {output_dir / 'games_canonical.json'} (combined)")
|
||||
print(f" - {output_dir / 'canonical' / 'games' / '*.json'} (by sport/season)")
|
||||
print(f" - {output_dir / 'canonicalization_validation.json'}")
|
||||
print()
|
||||
|
||||
|
||||
@@ -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
1092
Scripts/sportstime.py
Executable file
File diff suppressed because it is too large
Load Diff
@@ -67,6 +67,32 @@ EXPECTED_GAMES = {
|
||||
'max': 168,
|
||||
'description': 'MLB regular season (162 games)'
|
||||
},
|
||||
'nfl': {
|
||||
'expected': 17,
|
||||
'min': 15,
|
||||
'max': 20,
|
||||
'description': 'NFL regular season (17 games)'
|
||||
},
|
||||
'wnba': {
|
||||
'expected': 40,
|
||||
'min': 35,
|
||||
'max': 45,
|
||||
'description': 'WNBA regular season (40 games)'
|
||||
},
|
||||
'mls': {
|
||||
'expected': 34,
|
||||
'min': 30,
|
||||
'max': 40,
|
||||
'description': 'MLS regular season (34 games)'
|
||||
},
|
||||
'nwsl': {
|
||||
'expected': 26,
|
||||
'min': 22,
|
||||
'max': 30,
|
||||
'description': 'NWSL regular season (26 games)'
|
||||
},
|
||||
# Note: CBB doesn't have fixed game counts per "team"
|
||||
# CBB teams vary widely (30+ games)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,10 @@ from scrape_schedules import (
|
||||
scrape_nba_basketball_reference,
|
||||
scrape_mlb_statsapi, scrape_mlb_baseball_reference,
|
||||
scrape_nhl_hockey_reference,
|
||||
NBA_TEAMS, MLB_TEAMS, NHL_TEAMS,
|
||||
scrape_wnba_espn, scrape_mls_espn, scrape_nwsl_espn,
|
||||
scrape_nfl_espn, scrape_cbb_espn,
|
||||
NBA_TEAMS, MLB_TEAMS, NHL_TEAMS, WNBA_TEAMS, MLS_TEAMS, NWSL_TEAMS,
|
||||
NFL_TEAMS,
|
||||
assign_stable_ids,
|
||||
)
|
||||
|
||||
@@ -136,7 +139,11 @@ def generate_game_key(game: Game) -> str:
|
||||
|
||||
def normalize_team_name(name: str, sport: str) -> str:
|
||||
"""Normalize team name variations."""
|
||||
teams = {'NBA': NBA_TEAMS, 'MLB': MLB_TEAMS, 'NHL': NHL_TEAMS}.get(sport, {})
|
||||
teams = {
|
||||
'NBA': NBA_TEAMS, 'MLB': MLB_TEAMS, 'NHL': NHL_TEAMS,
|
||||
'WNBA': WNBA_TEAMS, 'MLS': MLS_TEAMS, 'NWSL': NWSL_TEAMS,
|
||||
'NFL': NFL_TEAMS,
|
||||
}.get(sport, {})
|
||||
|
||||
name_lower = name.lower().strip()
|
||||
|
||||
@@ -465,7 +472,7 @@ def main():
|
||||
parser.add_argument('--data-dir', type=str, default='./data', help='Data directory')
|
||||
parser.add_argument('--scrape-and-validate', action='store_true', help='Scrape fresh and validate')
|
||||
parser.add_argument('--season', type=int, default=2025, help='Season year')
|
||||
parser.add_argument('--sport', choices=['nba', 'mlb', 'nhl', 'all'], default='all')
|
||||
parser.add_argument('--sport', choices=['nba', 'mlb', 'nhl', 'nfl', 'wnba', 'mls', 'nwsl', 'cbb', 'all'], default='all')
|
||||
parser.add_argument('--output', type=str, default='./data/validation_report.json')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
Reference in New Issue
Block a user