utils/schedule.py (31 lines of code) (raw):

import json import os from typing import Literal import pandas as pd # Data file paths _DATA_DIR = "data" _SCHEDULE_FILE = os.path.join(_DATA_DIR, "pydata_amsterdam_2025_schedule.json") _DESCRIPTIONS_FILE = os.path.join(_DATA_DIR, "pydata_amsterdam_2025_descriptions.json") _SPEAKERS_FILE = os.path.join(_DATA_DIR, "pydata_amsterdam_2025_speakers_description.json") # Module-level caches _cache_schedule: list[dict[str, str | int]] | None = None _cache_descriptions: dict[int, str] | None = None _cache_speakers: dict[str, str] | None = None def _load_json(path: str): with open(path, "r") as f: return json.load(f) def _ensure_loaded() -> None: global _cache_schedule, _cache_descriptions, _cache_speakers if _cache_schedule is None: _cache_schedule = _load_json(_SCHEDULE_FILE) if _cache_descriptions is None: _cache_descriptions = _load_json(_DESCRIPTIONS_FILE) if _cache_speakers is None: _cache_speakers = _load_json(_SPEAKERS_FILE) def get_schedule(out_format: Literal["dict", "pandas"] = "dict") -> list[dict[str, str | int]] | pd.DataFrame: """Get the schedule data. Args: out_format: "dict" (default) for native Python structures, or "pandas" for DataFrame. Returns: list[dict] or pandas.DataFrame """ _ensure_loaded() return pd.DataFrame(_cache_schedule) if out_format == "pandas" else _cache_schedule def get_descriptions(out_format: Literal["dict", "pandas"] = "dict") -> dict[str, str] | pd.Series: """Get the descriptions mapping keyed by event_id (as str). Args: out_format: "dict" (default) or "pandas" (Series indexed by event_id) """ _ensure_loaded() return pd.Series(_cache_descriptions, name="description") if out_format == "pandas" else _cache_descriptions def get_speakers(out_format: Literal["dict", "pandas"] = "dict") -> dict[str, str] | pd.DataFrame: """Get the speakers mapping keyed by speaker_id (as str). Args: out_format: "dict" (default) or "pandas" (DataFrame indexed by speaker_id) """ _ensure_loaded() return pd.DataFrame.from_dict(_cache_speakers, orient="index") if out_format == "pandas" else _cache_speakers