ziyuzhou02 commited on
Commit
8e18a3f
·
verified ·
1 Parent(s): 3304af4

Deploy maintained LiveHouse-TS application and public results

Browse files
Files changed (7) hide show
  1. README.md +4 -4
  2. app.py +8 -2
  3. constraints.txt +72 -0
  4. requirements.txt +10 -7
  5. src/about.py +5 -5
  6. src/display/css_html_js.py +1 -1
  7. src/utils.py +1 -1
README.md CHANGED
@@ -1,5 +1,5 @@
1
  ---
2
- title: TSFM Realworld Bench
3
  emoji: 📈
4
  colorFrom: blue
5
  colorTo: green
@@ -11,11 +11,11 @@ license: apache-2.0
11
  python_version: 3.11.9
12
  ---
13
 
14
- # TSFM Realworld Bench Leaderboard
15
 
16
- Leaderboard for the **TSFM Realworld Benchmark** — evaluating time series foundation models on real-world univariate-target forecasting tasks.
17
 
18
- Results are submitted via pull request to the [TS-Live](https://github.com/zhouziyu02/TS-Live) repository.
19
 
20
  The leaderboard includes GIFT-Eval-style result slices aggregated by actual prediction
21
  length, domain, and frequency, normalized per configuration against Seasonal-Naive.
 
1
  ---
2
+ title: LiveHouse-TS
3
  emoji: 📈
4
  colorFrom: blue
5
  colorTo: green
 
11
  python_version: 3.11.9
12
  ---
13
 
14
+ # LiveHouse-TS Leaderboard
15
 
16
+ **LiveHouse-TS** evaluates time series foundation models on real-world univariate-target forecasting tasks.
17
 
18
+ Results are submitted via pull request to the [TS-Live](https://github.com/Thinkcat-Lab/LiveHouse-TS) repository.
19
 
20
  The leaderboard includes GIFT-Eval-style result slices aggregated by actual prediction
21
  length, domain, and frequency, normalized per configuration against Seasonal-Naive.
app.py CHANGED
@@ -6,6 +6,10 @@ from pathlib import Path
6
 
7
  import gradio as gr
8
 
 
 
 
 
9
  SPACE_DIR = Path(__file__).resolve().parent
10
  if str(SPACE_DIR) not in sys.path:
11
  sys.path.insert(0, str(SPACE_DIR))
@@ -34,7 +38,7 @@ from src.utils import (
34
  prepare_values_table,
35
  )
36
 
37
- RESULTS_PATH = os.getenv("TSFM_RESULTS_PATH", "space/results" if Path("space/results").exists() else "results")
38
  REFRESH_SECONDS = int(os.getenv("TSFM_REFRESH_SECONDS", "300"))
39
  DOMAIN_OUTPUT_OFFSET = 14
40
  MODEL_COLUMN_WIDTH = "180px"
@@ -257,7 +261,9 @@ def _make_forecast_plotter(dataset_key: str):
257
 
258
  def refresh_leaderboard() -> tuple:
259
  grouped = get_grouped_dfs(RESULTS_PATH)
260
- datasets = grouped["datasets"]
 
 
261
  one_day_rank, one_day_metrics = _fixed_window_outputs("1d")
262
  seven_day_rank, seven_day_metrics = _fixed_window_outputs("7d")
263
  thirty_day_rank, thirty_day_metrics = _fixed_window_outputs("30d")
 
6
 
7
  import gradio as gr
8
 
9
+ # Gradio checks its own HTTP endpoint at startup; keep loopback off outbound proxies.
10
+ os.environ["NO_PROXY"] = ",".join(filter(None, [os.getenv("NO_PROXY", os.getenv("no_proxy", "")),
11
+ "localhost,127.0.0.1,0.0.0.0"]))
12
+
13
  SPACE_DIR = Path(__file__).resolve().parent
14
  if str(SPACE_DIR) not in sys.path:
15
  sys.path.insert(0, str(SPACE_DIR))
 
38
  prepare_values_table,
39
  )
40
 
41
+ RESULTS_PATH = os.getenv("TSFM_RESULTS_PATH", str(SPACE_DIR / "results"))
42
  REFRESH_SECONDS = int(os.getenv("TSFM_REFRESH_SECONDS", "300"))
43
  DOMAIN_OUTPUT_OFFSET = 14
44
  MODEL_COLUMN_WIDTH = "180px"
 
261
 
262
  def refresh_leaderboard() -> tuple:
263
  grouped = get_grouped_dfs(RESULTS_PATH)
264
+ # Gradio outputs are fixed at startup; missing/new datasets must not change
265
+ # callback arity or shift another dataset's values into an existing table.
266
+ datasets = DATASETS
267
  one_day_rank, one_day_metrics = _fixed_window_outputs("1d")
268
  seven_day_rank, seven_day_metrics = _fixed_window_outputs("7d")
269
  thirty_day_rank, thirty_day_metrics = _fixed_window_outputs("30d")
constraints.txt ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Tested deployment dependency constraints, generated 2026-09-05 on Python 3.11.
2
+ # Regenerate in a clean environment after running CI and smoke tests.
3
+ aiofiles==23.2.1
4
+ annotated-doc==0.0.5
5
+ annotated-types==0.8.0
6
+ anyio==4.15.0
7
+ certifi==2026.7.22
8
+ charset-normalizer==3.5.1
9
+ click==8.5.0
10
+ contourpy==1.3.3; python_version >= "3.11"
11
+ contourpy==1.3.2; python_version < "3.11"
12
+ cycler==0.12.1
13
+ fastapi==0.112.4
14
+ ffmpy==1.0.0
15
+ filelock==3.32.5
16
+ fonttools==4.64.0
17
+ fsspec==2026.7.0
18
+ gluonts==0.16.3
19
+ gradio==4.44.0
20
+ gradio_client==1.3.0
21
+ h11==0.16.0
22
+ hf-xet==1.6.0
23
+ httpcore==1.0.9
24
+ httpx==0.28.1
25
+ huggingface-hub==0.35.2
26
+ idna==3.19
27
+ importlib_resources==6.5.2
28
+ iniconfig==2.3.0
29
+ Jinja2==3.1.6
30
+ kiwisolver==1.5.1
31
+ markdown-it-py==4.2.0
32
+ MarkupSafe==2.1.5
33
+ matplotlib==3.9.4
34
+ mdurl==0.1.2
35
+ numpy==1.26.4
36
+ orjson==3.12.0
37
+ packaging==26.3
38
+ pandas==2.2.3
39
+ patsy==1.0.3
40
+ pillow==10.4.0
41
+ plotly==5.24.1
42
+ pluggy==1.6.0
43
+ pydantic==2.10.6
44
+ pydantic_core==2.27.2
45
+ pydub==0.25.1
46
+ Pygments==2.21.0
47
+ pyparsing==3.3.2
48
+ pytest==8.4.2
49
+ python-dateutil==2.9.0.post0
50
+ python-dotenv==1.2.3
51
+ python-multipart==0.0.32
52
+ pytz==2026.3.post1
53
+ PyYAML==6.0.3
54
+ requests==2.34.2
55
+ rich==15.0.0
56
+ ruff==0.16.6
57
+ scipy==1.11.4
58
+ semantic-version==2.10.0
59
+ shellingham==1.5.4
60
+ six==1.17.0
61
+ starlette==0.37.2
62
+ statsmodels==0.14.6
63
+ tenacity==9.1.4
64
+ tomlkit==0.12.0
65
+ toolz==0.12.1
66
+ tqdm==4.70.0
67
+ typer==0.27.2
68
+ typing_extensions==4.16.0
69
+ tzdata==2026.3
70
+ urllib3==2.7.0
71
+ uvicorn==0.30.6
72
+ websockets==12.0
requirements.txt CHANGED
@@ -1,10 +1,13 @@
1
- # gradio is installed by HF Space from README sdk_version — do NOT pin here
2
- huggingface-hub>=0.18.0,<0.35.3
 
 
3
  starlette==0.37.2
4
  fastapi==0.112.4
5
- jinja2==3.1.4
6
  uvicorn==0.30.6
7
- pandas
8
- numpy
9
- scipy
10
- plotly
 
 
1
+ -c constraints.txt
2
+ gradio==4.44.0
3
+ huggingface-hub>=0.23,<0.35.3
4
+ pydantic>=2.7,<2.11
5
  starlette==0.37.2
6
  fastapi==0.112.4
7
+ jinja2>=3.1.6,<4
8
  uvicorn==0.30.6
9
+ pandas>=2.2,<2.3
10
+ numpy>=1.26,<2
11
+ scipy>=1.11,<1.12
12
+ plotly>=5,<6
13
+ matplotlib>=3.9,<3.10
src/about.py CHANGED
@@ -1,7 +1,7 @@
1
- TITLE = """ TSFM Realworld Bench Leaderboard """
2
 
3
  INTRODUCTION_TEXT = """
4
- **TSFM Realworld Bench** evaluates time series foundation models on **live TS-Bench
5
  real-world data** with **zero-shot API inference** via [TSFM.ai](https://tsfm.ai/).
6
  Following [GIFT-Eval](https://huggingface.co/spaces/Salesforce/GIFT-Eval), the leaderboard
7
  reports **absolute metric values** and **per-dataset ranks**. The Overall tab also reports
@@ -55,9 +55,9 @@ on future live releases.
55
  CITATION_BUTTON_LABEL = "Copy citation"
56
  CITATION_BUTTON_TEXT = r"""
57
  @misc{tsfm_realworld_bench,
58
- title={TSFM Realworld Bench: A Benchmark for Time Series Foundation Models},
59
- author={TSFM Realworld Bench Team},
60
  year={2026},
61
- howpublished={\url{https://huggingface.co/spaces/CityMindDev/TSFM-Realworld-Bench}}
62
  }
63
  """
 
1
+ TITLE = """ LiveHouse-TS Leaderboard """
2
 
3
  INTRODUCTION_TEXT = """
4
+ **LiveHouse-TS** evaluates time series foundation models on **live TS-Bench
5
  real-world data** with **zero-shot API inference** via [TSFM.ai](https://tsfm.ai/).
6
  Following [GIFT-Eval](https://huggingface.co/spaces/Salesforce/GIFT-Eval), the leaderboard
7
  reports **absolute metric values** and **per-dataset ranks**. The Overall tab also reports
 
55
  CITATION_BUTTON_LABEL = "Copy citation"
56
  CITATION_BUTTON_TEXT = r"""
57
  @misc{tsfm_realworld_bench,
58
+ title={LiveHouse-TS: A Live Benchmark for Time Series Foundation Models},
59
+ author={LiveHouse-TS Team},
60
  year={2026},
61
+ howpublished={\url{https://huggingface.co/spaces/CityMindDev/LiveHouse-TS}}
62
  }
63
  """
src/display/css_html_js.py CHANGED
@@ -1,4 +1,4 @@
1
- # Gradio custom styles for the TSFM Realworld Bench leaderboard.
2
  custom_css = """
3
  :root {
4
  --bench-ink: #18202f;
 
1
+ # Gradio custom styles for the LiveHouse-TS leaderboard.
2
  custom_css = """
3
  :root {
4
  --bench-ink: #18202f;
src/utils.py CHANGED
@@ -261,7 +261,7 @@ def load_all_results(root_dir: str = "results") -> pd.DataFrame:
261
  df = df[df["model"].map(_model_key).isin(model_allowlist)].copy()
262
  if df.empty:
263
  return pd.DataFrame(columns=RESULT_COLUMNS)
264
-
265
  parts = df["dataset"].astype(str).str.split("/", expand=True)
266
  if parts.shape[1] < 3:
267
  for idx in range(parts.shape[1], 3):
 
261
  df = df[df["model"].map(_model_key).isin(model_allowlist)].copy()
262
  if df.empty:
263
  return pd.DataFrame(columns=RESULT_COLUMNS)
264
+
265
  parts = df["dataset"].astype(str).str.split("/", expand=True)
266
  if parts.shape[1] < 3:
267
  for idx in range(parts.shape[1], 3):