Spaces:
Running
Running
| from __future__ import annotations | |
| from datetime import datetime | |
| from typing import Any | |
| import pandas as pd | |
| import requests | |
| from config.settings import ( | |
| ODDS_API_KEY, | |
| ODDS_BASE_URL, | |
| ODDS_FEATURED_MARKETS, | |
| ODDS_FORMAT, | |
| ODDS_REGIONS, | |
| ODDS_SPORT_KEY, | |
| ) | |
| def fetch_featured_odds() -> pd.DataFrame: | |
| if not ODDS_API_KEY: | |
| return pd.DataFrame() | |
| url = f"{ODDS_BASE_URL}/sports/{ODDS_SPORT_KEY}/odds" | |
| params = { | |
| "apiKey": ODDS_API_KEY, | |
| "regions": ODDS_REGIONS, | |
| "markets": ODDS_FEATURED_MARKETS, | |
| "oddsFormat": ODDS_FORMAT, | |
| } | |
| response = requests.get(url, params=params, timeout=30) | |
| response.raise_for_status() | |
| payload = response.json() | |
| rows: list[dict[str, Any]] = [] | |
| for event in payload: | |
| event_id = event.get("id", "") | |
| commence_time = event.get("commence_time") | |
| home_team = event.get("home_team", "") | |
| away_team = event.get("away_team", "") | |
| for bookmaker in event.get("bookmakers", []): | |
| sportsbook = bookmaker.get("title", "") | |
| for market in bookmaker.get("markets", []): | |
| market_key = market.get("key", "") | |
| for outcome in market.get("outcomes", []): | |
| rows.append( | |
| { | |
| "fetched_at": datetime.utcnow(), | |
| "event_id": event_id, | |
| "commence_time": commence_time, | |
| "home_team": home_team, | |
| "away_team": away_team, | |
| "sportsbook": sportsbook, | |
| "market_key": market_key, | |
| "outcome_name": outcome.get("name", ""), | |
| "price": outcome.get("price"), | |
| "point": outcome.get("point"), | |
| } | |
| ) | |
| return pd.DataFrame(rows) |