feat: add style changes and cleaning
Browse files
app.py
CHANGED
|
@@ -16,25 +16,35 @@ df = load_data()
|
|
| 16 |
ALL_METRICS = sorted(df["metric"].unique().tolist())
|
| 17 |
ALL_SUBDATASETS = sorted(df["subdataset"].unique().tolist())
|
| 18 |
ALL_MODELS = sorted(df["model"].unique().tolist())
|
|
|
|
| 19 |
|
| 20 |
|
| 21 |
-
def build_table(metric, subdataset, models):
|
| 22 |
-
|
|
|
|
| 23 |
if subdataset != "All":
|
| 24 |
sub = sub[sub["subdataset"] == subdataset]
|
|
|
|
|
|
|
| 25 |
if models:
|
| 26 |
sub = sub[sub["model"].isin(models)]
|
| 27 |
pivot = sub.pivot_table(
|
| 28 |
-
index=["subdataset", "
|
|
|
|
|
|
|
| 29 |
)
|
| 30 |
pivot = pivot.sort_index()
|
| 31 |
pivot = pivot.reset_index()
|
|
|
|
|
|
|
|
|
|
| 32 |
return pivot
|
| 33 |
|
| 34 |
|
| 35 |
def build_plots(metric, subdataset):
|
| 36 |
-
|
| 37 |
-
|
|
|
|
| 38 |
return fig_rank, fig_value
|
| 39 |
|
| 40 |
|
|
@@ -664,6 +674,11 @@ Currently **{n_dates} evaluations** are available, from **{date_min}** to **{dat
|
|
| 664 |
value="All",
|
| 665 |
label="Subdataset",
|
| 666 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 667 |
models_dd = gr.Dropdown(
|
| 668 |
choices=ALL_MODELS,
|
| 669 |
value=ALL_MODELS,
|
|
@@ -672,15 +687,15 @@ Currently **{n_dates} evaluations** are available, from **{date_min}** to **{dat
|
|
| 672 |
)
|
| 673 |
|
| 674 |
results_table = gr.Dataframe(
|
| 675 |
-
value=build_table(ALL_METRICS[0], "All", ALL_MODELS),
|
| 676 |
label="Results",
|
| 677 |
interactive=False,
|
| 678 |
)
|
| 679 |
|
| 680 |
-
for control in [metric_dd, subdataset_dd, models_dd]:
|
| 681 |
control.change(
|
| 682 |
fn=build_table,
|
| 683 |
-
inputs=[metric_dd, subdataset_dd, models_dd],
|
| 684 |
outputs=results_table,
|
| 685 |
)
|
| 686 |
|
|
|
|
| 16 |
ALL_METRICS = sorted(df["metric"].unique().tolist())
|
| 17 |
ALL_SUBDATASETS = sorted(df["subdataset"].unique().tolist())
|
| 18 |
ALL_MODELS = sorted(df["model"].unique().tolist())
|
| 19 |
+
ALL_FREQUENCIES = sorted(df["frequency"].unique().tolist())
|
| 20 |
|
| 21 |
|
| 22 |
+
def build_table(metric, subdataset, frequency, models):
|
| 23 |
+
data = load_data()
|
| 24 |
+
sub = data[data["metric"] == metric]
|
| 25 |
if subdataset != "All":
|
| 26 |
sub = sub[sub["subdataset"] == subdataset]
|
| 27 |
+
if frequency != "All":
|
| 28 |
+
sub = sub[sub["frequency"] == frequency]
|
| 29 |
if models:
|
| 30 |
sub = sub[sub["model"].isin(models)]
|
| 31 |
pivot = sub.pivot_table(
|
| 32 |
+
index=["subdataset", "frequency", "cutoff"],
|
| 33 |
+
columns="model",
|
| 34 |
+
values="value",
|
| 35 |
)
|
| 36 |
pivot = pivot.sort_index()
|
| 37 |
pivot = pivot.reset_index()
|
| 38 |
+
# Format numeric columns to 3 decimal places
|
| 39 |
+
num_cols = pivot.select_dtypes(include="number").columns
|
| 40 |
+
pivot[num_cols] = pivot[num_cols].round(3)
|
| 41 |
return pivot
|
| 42 |
|
| 43 |
|
| 44 |
def build_plots(metric, subdataset):
|
| 45 |
+
data = load_data()
|
| 46 |
+
fig_rank = plot_rank_for_subdataset(data, metric, subdataset)
|
| 47 |
+
fig_value = plot_value_for_subdataset(data, metric, subdataset)
|
| 48 |
return fig_rank, fig_value
|
| 49 |
|
| 50 |
|
|
|
|
| 674 |
value="All",
|
| 675 |
label="Subdataset",
|
| 676 |
)
|
| 677 |
+
frequency_dd = gr.Dropdown(
|
| 678 |
+
choices=["All"] + ALL_FREQUENCIES,
|
| 679 |
+
value="All",
|
| 680 |
+
label="Frequency",
|
| 681 |
+
)
|
| 682 |
models_dd = gr.Dropdown(
|
| 683 |
choices=ALL_MODELS,
|
| 684 |
value=ALL_MODELS,
|
|
|
|
| 687 |
)
|
| 688 |
|
| 689 |
results_table = gr.Dataframe(
|
| 690 |
+
value=build_table(ALL_METRICS[0], "All", "All", ALL_MODELS),
|
| 691 |
label="Results",
|
| 692 |
interactive=False,
|
| 693 |
)
|
| 694 |
|
| 695 |
+
for control in [metric_dd, subdataset_dd, frequency_dd, models_dd]:
|
| 696 |
control.change(
|
| 697 |
fn=build_table,
|
| 698 |
+
inputs=[metric_dd, subdataset_dd, frequency_dd, models_dd],
|
| 699 |
outputs=results_table,
|
| 700 |
)
|
| 701 |
|
data.py
CHANGED
|
@@ -29,4 +29,6 @@ def load_data() -> pd.DataFrame:
|
|
| 29 |
if "model_alias" in df.columns:
|
| 30 |
df = df.rename(columns={"model": "model_id", "model_alias": "model"})
|
| 31 |
|
|
|
|
|
|
|
| 32 |
return df
|
|
|
|
| 29 |
if "model_alias" in df.columns:
|
| 30 |
df = df.rename(columns={"model": "model_id", "model_alias": "model"})
|
| 31 |
|
| 32 |
+
print(df)
|
| 33 |
+
|
| 34 |
return df
|
leaderboard.py
CHANGED
|
@@ -14,9 +14,9 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 14 |
Returns a dataframe with columns: model, rank CRPS, rank MASE
|
| 15 |
"""
|
| 16 |
ranked = df.copy()
|
| 17 |
-
ranked["rank"] = ranked.groupby(
|
| 18 |
-
|
| 19 |
-
|
| 20 |
|
| 21 |
# Step 2: average ranks across cutoffs per (metric, subdataset, frequency, model)
|
| 22 |
per_subdataset = (
|
|
@@ -27,9 +27,9 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 27 |
|
| 28 |
# Print per-subdataset ranks for manual inspection
|
| 29 |
for metric in sorted(per_subdataset["metric"].unique()):
|
| 30 |
-
print(f"\n{'='*60}")
|
| 31 |
print(f"Metric: {metric}")
|
| 32 |
-
print(f"{'='*60}")
|
| 33 |
sub = per_subdataset[per_subdataset["metric"] == metric]
|
| 34 |
pivot = sub.pivot_table(
|
| 35 |
index=["subdataset", "frequency"], columns="model", values="rank"
|
|
@@ -37,11 +37,7 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 37 |
print(pivot.to_string())
|
| 38 |
|
| 39 |
# Step 3: average across all (subdataset, frequency) combos
|
| 40 |
-
overall = (
|
| 41 |
-
per_subdataset.groupby(["metric", "model"])["rank"]
|
| 42 |
-
.mean()
|
| 43 |
-
.reset_index()
|
| 44 |
-
)
|
| 45 |
|
| 46 |
# Pivot so each metric becomes a column
|
| 47 |
leaderboard = overall.pivot(index="model", columns="metric", values="rank")
|
|
@@ -52,7 +48,7 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 52 |
# Average metric values: mean across all (subdataset, frequency, cutoff) per (metric, model)
|
| 53 |
avg_values = (
|
| 54 |
df.groupby(["metric", "model"])["value"]
|
| 55 |
-
.
|
| 56 |
.reset_index()
|
| 57 |
.pivot(index="model", columns="metric", values="value")
|
| 58 |
)
|
|
@@ -69,16 +65,13 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 69 |
|
| 70 |
# Round for display
|
| 71 |
for col in leaderboard.columns:
|
| 72 |
-
if col.startswith("rank "):
|
| 73 |
-
leaderboard[col] = leaderboard[col].round(
|
| 74 |
-
elif col.startswith("avg "):
|
| 75 |
-
leaderboard[col] = leaderboard[col].round(4)
|
| 76 |
|
| 77 |
# Add medals to model names
|
| 78 |
leaderboard = leaderboard.reset_index(drop=True)
|
| 79 |
leaderboard["model"] = [
|
| 80 |
-
f"{MEDALS.get(i, '')} {m}".strip()
|
| 81 |
-
for i, m in enumerate(leaderboard["model"])
|
| 82 |
]
|
| 83 |
|
| 84 |
# Reorder: model, avg columns, rank columns
|
|
@@ -89,14 +82,12 @@ def compute_leaderboard(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 89 |
return leaderboard
|
| 90 |
|
| 91 |
|
| 92 |
-
|
| 93 |
-
|
| 94 |
if __name__ == "__main__":
|
| 95 |
from data import load_data
|
| 96 |
|
| 97 |
df = load_data()
|
| 98 |
lb = compute_leaderboard(df)
|
| 99 |
-
print(f"\n{'='*60}")
|
| 100 |
print("LEADERBOARD")
|
| 101 |
-
print(f"{'='*60}")
|
| 102 |
print(lb.to_string(index=False))
|
|
|
|
| 14 |
Returns a dataframe with columns: model, rank CRPS, rank MASE
|
| 15 |
"""
|
| 16 |
ranked = df.copy()
|
| 17 |
+
ranked["rank"] = ranked.groupby(["metric", "subdataset", "frequency", "cutoff"])[
|
| 18 |
+
"value"
|
| 19 |
+
].rank(method="min")
|
| 20 |
|
| 21 |
# Step 2: average ranks across cutoffs per (metric, subdataset, frequency, model)
|
| 22 |
per_subdataset = (
|
|
|
|
| 27 |
|
| 28 |
# Print per-subdataset ranks for manual inspection
|
| 29 |
for metric in sorted(per_subdataset["metric"].unique()):
|
| 30 |
+
print(f"\n{'=' * 60}")
|
| 31 |
print(f"Metric: {metric}")
|
| 32 |
+
print(f"{'=' * 60}")
|
| 33 |
sub = per_subdataset[per_subdataset["metric"] == metric]
|
| 34 |
pivot = sub.pivot_table(
|
| 35 |
index=["subdataset", "frequency"], columns="model", values="rank"
|
|
|
|
| 37 |
print(pivot.to_string())
|
| 38 |
|
| 39 |
# Step 3: average across all (subdataset, frequency) combos
|
| 40 |
+
overall = per_subdataset.groupby(["metric", "model"])["rank"].mean().reset_index()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
# Pivot so each metric becomes a column
|
| 43 |
leaderboard = overall.pivot(index="model", columns="metric", values="rank")
|
|
|
|
| 48 |
# Average metric values: mean across all (subdataset, frequency, cutoff) per (metric, model)
|
| 49 |
avg_values = (
|
| 50 |
df.groupby(["metric", "model"])["value"]
|
| 51 |
+
.median() # using median instead of mean to avoid outliers
|
| 52 |
.reset_index()
|
| 53 |
.pivot(index="model", columns="metric", values="value")
|
| 54 |
)
|
|
|
|
| 65 |
|
| 66 |
# Round for display
|
| 67 |
for col in leaderboard.columns:
|
| 68 |
+
if col.startswith("rank ") or col.startswith("avg "):
|
| 69 |
+
leaderboard[col] = leaderboard[col].round(3)
|
|
|
|
|
|
|
| 70 |
|
| 71 |
# Add medals to model names
|
| 72 |
leaderboard = leaderboard.reset_index(drop=True)
|
| 73 |
leaderboard["model"] = [
|
| 74 |
+
f"{MEDALS.get(i, '')} {m}".strip() for i, m in enumerate(leaderboard["model"])
|
|
|
|
| 75 |
]
|
| 76 |
|
| 77 |
# Reorder: model, avg columns, rank columns
|
|
|
|
| 82 |
return leaderboard
|
| 83 |
|
| 84 |
|
|
|
|
|
|
|
| 85 |
if __name__ == "__main__":
|
| 86 |
from data import load_data
|
| 87 |
|
| 88 |
df = load_data()
|
| 89 |
lb = compute_leaderboard(df)
|
| 90 |
+
print(f"\n{'=' * 60}")
|
| 91 |
print("LEADERBOARD")
|
| 92 |
+
print(f"{'=' * 60}")
|
| 93 |
print(lb.to_string(index=False))
|
uv.lock
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
version = 1
|
| 2 |
-
revision =
|
| 3 |
requires-python = ">=3.12"
|
| 4 |
resolution-markers = [
|
| 5 |
"python_full_version >= '3.14' and sys_platform == 'win32'",
|
|
@@ -532,6 +532,7 @@ dependencies = [
|
|
| 532 |
{ name = "gradio" },
|
| 533 |
{ name = "matplotlib" },
|
| 534 |
{ name = "pandas" },
|
|
|
|
| 535 |
]
|
| 536 |
|
| 537 |
[package.dev-dependencies]
|
|
@@ -544,6 +545,7 @@ requires-dist = [
|
|
| 544 |
{ name = "gradio", specifier = ">=6.5.1" },
|
| 545 |
{ name = "matplotlib", specifier = ">=3.10.8" },
|
| 546 |
{ name = "pandas", specifier = ">=3.0.0" },
|
|
|
|
| 547 |
]
|
| 548 |
|
| 549 |
[package.metadata.requires-dev]
|
|
@@ -1123,6 +1125,49 @@ wheels = [
|
|
| 1123 |
{ url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
|
| 1124 |
]
|
| 1125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1126 |
[[package]]
|
| 1127 |
name = "pydantic"
|
| 1128 |
version = "2.12.5"
|
|
|
|
| 1 |
version = 1
|
| 2 |
+
revision = 2
|
| 3 |
requires-python = ">=3.12"
|
| 4 |
resolution-markers = [
|
| 5 |
"python_full_version >= '3.14' and sys_platform == 'win32'",
|
|
|
|
| 532 |
{ name = "gradio" },
|
| 533 |
{ name = "matplotlib" },
|
| 534 |
{ name = "pandas" },
|
| 535 |
+
{ name = "pyarrow" },
|
| 536 |
]
|
| 537 |
|
| 538 |
[package.dev-dependencies]
|
|
|
|
| 545 |
{ name = "gradio", specifier = ">=6.5.1" },
|
| 546 |
{ name = "matplotlib", specifier = ">=3.10.8" },
|
| 547 |
{ name = "pandas", specifier = ">=3.0.0" },
|
| 548 |
+
{ name = "pyarrow", specifier = ">=19.0.0" },
|
| 549 |
]
|
| 550 |
|
| 551 |
[package.metadata.requires-dev]
|
|
|
|
| 1125 |
{ url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
|
| 1126 |
]
|
| 1127 |
|
| 1128 |
+
[[package]]
|
| 1129 |
+
name = "pyarrow"
|
| 1130 |
+
version = "23.0.0"
|
| 1131 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1132 |
+
sdist = { url = "https://files.pythonhosted.org/packages/01/33/ffd9c3eb087fa41dd79c3cf20c4c0ae3cdb877c4f8e1107a446006344924/pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615", size = 1167185, upload-time = "2026-01-18T16:19:42.218Z" }
|
| 1133 |
+
wheels = [
|
| 1134 |
+
{ url = "https://files.pythonhosted.org/packages/3d/bd/c861d020831ee57609b73ea721a617985ece817684dc82415b0bc3e03ac3/pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8", size = 34189116, upload-time = "2026-01-18T16:15:28.054Z" },
|
| 1135 |
+
{ url = "https://files.pythonhosted.org/packages/8c/23/7725ad6cdcbaf6346221391e7b3eecd113684c805b0a95f32014e6fa0736/pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a", size = 35803831, upload-time = "2026-01-18T16:15:33.798Z" },
|
| 1136 |
+
{ url = "https://files.pythonhosted.org/packages/57/06/684a421543455cdc2944d6a0c2cc3425b028a4c6b90e34b35580c4899743/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333", size = 44436452, upload-time = "2026-01-18T16:15:41.598Z" },
|
| 1137 |
+
{ url = "https://files.pythonhosted.org/packages/c6/6f/8f9eb40c2328d66e8b097777ddcf38494115ff9f1b5bc9754ba46991191e/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b", size = 47557396, upload-time = "2026-01-18T16:15:51.252Z" },
|
| 1138 |
+
{ url = "https://files.pythonhosted.org/packages/10/6e/f08075f1472e5159553501fde2cc7bc6700944bdabe49a03f8a035ee6ccd/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de", size = 48147129, upload-time = "2026-01-18T16:16:00.299Z" },
|
| 1139 |
+
{ url = "https://files.pythonhosted.org/packages/7d/82/d5a680cd507deed62d141cc7f07f7944a6766fc51019f7f118e4d8ad0fb8/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df", size = 50596642, upload-time = "2026-01-18T16:16:08.502Z" },
|
| 1140 |
+
{ url = "https://files.pythonhosted.org/packages/a9/26/4f29c61b3dce9fa7780303b86895ec6a0917c9af927101daaaf118fbe462/pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c", size = 27660628, upload-time = "2026-01-18T16:16:15.28Z" },
|
| 1141 |
+
{ url = "https://files.pythonhosted.org/packages/66/34/564db447d083ec7ff93e0a883a597d2f214e552823bfc178a2d0b1f2c257/pyarrow-23.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ad96a597547af7827342ffb3c503c8316e5043bb09b47a84885ce39394c96e00", size = 34184630, upload-time = "2026-01-18T16:16:22.141Z" },
|
| 1142 |
+
{ url = "https://files.pythonhosted.org/packages/aa/3a/3999daebcb5e6119690c92a621c4d78eef2ffba7a0a1b56386d2875fcd77/pyarrow-23.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b9edf990df77c2901e79608f08c13fbde60202334a4fcadb15c1f57bf7afee43", size = 35796820, upload-time = "2026-01-18T16:16:29.441Z" },
|
| 1143 |
+
{ url = "https://files.pythonhosted.org/packages/ec/ee/39195233056c6a8d0976d7d1ac1cd4fe21fb0ec534eca76bc23ef3f60e11/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:36d1b5bc6ddcaff0083ceec7e2561ed61a51f49cce8be079ee8ed406acb6fdef", size = 44438735, upload-time = "2026-01-18T16:16:38.79Z" },
|
| 1144 |
+
{ url = "https://files.pythonhosted.org/packages/2c/41/6a7328ee493527e7afc0c88d105ecca69a3580e29f2faaeac29308369fd7/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4292b889cd224f403304ddda8b63a36e60f92911f89927ec8d98021845ea21be", size = 47557263, upload-time = "2026-01-18T16:16:46.248Z" },
|
| 1145 |
+
{ url = "https://files.pythonhosted.org/packages/c6/ee/34e95b21ee84db494eae60083ddb4383477b31fb1fd19fd866d794881696/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dfd9e133e60eaa847fd80530a1b89a052f09f695d0b9c34c235ea6b2e0924cf7", size = 48153529, upload-time = "2026-01-18T16:16:53.412Z" },
|
| 1146 |
+
{ url = "https://files.pythonhosted.org/packages/52/88/8a8d83cea30f4563efa1b7bf51d241331ee5cd1b185a7e063f5634eca415/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832141cc09fac6aab1cd3719951d23301396968de87080c57c9a7634e0ecd068", size = 50598851, upload-time = "2026-01-18T16:17:01.133Z" },
|
| 1147 |
+
{ url = "https://files.pythonhosted.org/packages/c6/4c/2929c4be88723ba025e7b3453047dc67e491c9422965c141d24bab6b5962/pyarrow-23.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:7a7d067c9a88faca655c71bcc30ee2782038d59c802d57950826a07f60d83c4c", size = 27577747, upload-time = "2026-01-18T16:18:02.413Z" },
|
| 1148 |
+
{ url = "https://files.pythonhosted.org/packages/64/52/564a61b0b82d72bd68ec3aef1adda1e3eba776f89134b9ebcb5af4b13cb6/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ce9486e0535a843cf85d990e2ec5820a47918235183a5c7b8b97ed7e92c2d47d", size = 34446038, upload-time = "2026-01-18T16:17:07.861Z" },
|
| 1149 |
+
{ url = "https://files.pythonhosted.org/packages/cc/c9/232d4f9855fd1de0067c8a7808a363230d223c83aeee75e0fe6eab851ba9/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:075c29aeaa685fd1182992a9ed2499c66f084ee54eea47da3eb76e125e06064c", size = 35921142, upload-time = "2026-01-18T16:17:15.401Z" },
|
| 1150 |
+
{ url = "https://files.pythonhosted.org/packages/96/f2/60af606a3748367b906bb82d41f0032e059f075444445d47e32a7ff1df62/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:799965a5379589510d888be3094c2296efd186a17ca1cef5b77703d4d5121f53", size = 44490374, upload-time = "2026-01-18T16:17:23.93Z" },
|
| 1151 |
+
{ url = "https://files.pythonhosted.org/packages/ff/2d/7731543050a678ea3a413955a2d5d80d2a642f270aa57a3cb7d5a86e3f46/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef7cac8fe6fccd8b9e7617bfac785b0371a7fe26af59463074e4882747145d40", size = 47527896, upload-time = "2026-01-18T16:17:33.393Z" },
|
| 1152 |
+
{ url = "https://files.pythonhosted.org/packages/5a/90/f3342553b7ac9879413aed46500f1637296f3c8222107523a43a1c08b42a/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15a414f710dc927132dd67c361f78c194447479555af57317066ee5116b90e9e", size = 48210401, upload-time = "2026-01-18T16:17:42.012Z" },
|
| 1153 |
+
{ url = "https://files.pythonhosted.org/packages/f3/da/9862ade205ecc46c172b6ce5038a74b5151c7401e36255f15975a45878b2/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e0d2e6915eca7d786be6a77bf227fbc06d825a75b5b5fe9bcbef121dec32685", size = 50579677, upload-time = "2026-01-18T16:17:50.241Z" },
|
| 1154 |
+
{ url = "https://files.pythonhosted.org/packages/c2/4c/f11f371f5d4740a5dafc2e11c76bcf42d03dfdb2d68696da97de420b6963/pyarrow-23.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4b317ea6e800b5704e5e5929acb6e2dc13e9276b708ea97a39eb8b345aa2658b", size = 27631889, upload-time = "2026-01-18T16:17:56.55Z" },
|
| 1155 |
+
{ url = "https://files.pythonhosted.org/packages/97/bb/15aec78bcf43a0c004067bd33eb5352836a29a49db8581fc56f2b6ca88b7/pyarrow-23.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:20b187ed9550d233a872074159f765f52f9d92973191cd4b93f293a19efbe377", size = 34213265, upload-time = "2026-01-18T16:18:07.904Z" },
|
| 1156 |
+
{ url = "https://files.pythonhosted.org/packages/f6/6c/deb2c594bbba41c37c5d9aa82f510376998352aa69dfcb886cb4b18ad80f/pyarrow-23.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:18ec84e839b493c3886b9b5e06861962ab4adfaeb79b81c76afbd8d84c7d5fda", size = 35819211, upload-time = "2026-01-18T16:18:13.94Z" },
|
| 1157 |
+
{ url = "https://files.pythonhosted.org/packages/e0/e5/ee82af693cb7b5b2b74f6524cdfede0e6ace779d7720ebca24d68b57c36b/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e438dd3f33894e34fd02b26bd12a32d30d006f5852315f611aa4add6c7fab4bc", size = 44502313, upload-time = "2026-01-18T16:18:20.367Z" },
|
| 1158 |
+
{ url = "https://files.pythonhosted.org/packages/9c/86/95c61ad82236495f3c31987e85135926ba3ec7f3819296b70a68d8066b49/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:a244279f240c81f135631be91146d7fa0e9e840e1dfed2aba8483eba25cd98e6", size = 47585886, upload-time = "2026-01-18T16:18:27.544Z" },
|
| 1159 |
+
{ url = "https://files.pythonhosted.org/packages/bb/6e/a72d901f305201802f016d015de1e05def7706fff68a1dedefef5dc7eff7/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c4692e83e42438dba512a570c6eaa42be2f8b6c0f492aea27dec54bdc495103a", size = 48207055, upload-time = "2026-01-18T16:18:35.425Z" },
|
| 1160 |
+
{ url = "https://files.pythonhosted.org/packages/f9/e5/5de029c537630ca18828db45c30e2a78da03675a70ac6c3528203c416fe3/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae7f30f898dfe44ea69654a35c93e8da4cef6606dc4c72394068fd95f8e9f54a", size = 50619812, upload-time = "2026-01-18T16:18:43.553Z" },
|
| 1161 |
+
{ url = "https://files.pythonhosted.org/packages/59/8d/2af846cd2412e67a087f5bda4a8e23dfd4ebd570f777db2e8686615dafc1/pyarrow-23.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:5b86bb649e4112fb0614294b7d0a175c7513738876b89655605ebb87c804f861", size = 28263851, upload-time = "2026-01-18T16:19:38.567Z" },
|
| 1162 |
+
{ url = "https://files.pythonhosted.org/packages/7b/7f/caab863e587041156f6786c52e64151b7386742c8c27140f637176e9230e/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ebc017d765d71d80a3f8584ca0566b53e40464586585ac64176115baa0ada7d3", size = 34463240, upload-time = "2026-01-18T16:18:49.755Z" },
|
| 1163 |
+
{ url = "https://files.pythonhosted.org/packages/c9/fa/3a5b8c86c958e83622b40865e11af0857c48ec763c11d472c87cd518283d/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:0800cc58a6d17d159df823f87ad66cefebf105b982493d4bad03ee7fab84b993", size = 35935712, upload-time = "2026-01-18T16:18:55.626Z" },
|
| 1164 |
+
{ url = "https://files.pythonhosted.org/packages/c5/08/17a62078fc1a53decb34a9aa79cf9009efc74d63d2422e5ade9fed2f99e3/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3a7c68c722da9bb5b0f8c10e3eae71d9825a4b429b40b32709df5d1fa55beb3d", size = 44503523, upload-time = "2026-01-18T16:19:03.958Z" },
|
| 1165 |
+
{ url = "https://files.pythonhosted.org/packages/cc/70/84d45c74341e798aae0323d33b7c39194e23b1abc439ceaf60a68a7a969a/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:bd5556c24622df90551063ea41f559b714aa63ca953db884cfb958559087a14e", size = 47542490, upload-time = "2026-01-18T16:19:11.208Z" },
|
| 1166 |
+
{ url = "https://files.pythonhosted.org/packages/61/d9/d1274b0e6f19e235de17441e53224f4716574b2ca837022d55702f24d71d/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54810f6e6afc4ffee7c2e0051b61722fbea9a4961b46192dcfae8ea12fa09059", size = 48233605, upload-time = "2026-01-18T16:19:19.544Z" },
|
| 1167 |
+
{ url = "https://files.pythonhosted.org/packages/39/07/e4e2d568cb57543d84482f61e510732820cddb0f47c4bb7df629abfed852/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:14de7d48052cf4b0ed174533eafa3cfe0711b8076ad70bede32cf59f744f0d7c", size = 50603979, upload-time = "2026-01-18T16:19:26.717Z" },
|
| 1168 |
+
{ url = "https://files.pythonhosted.org/packages/72/9c/47693463894b610f8439b2e970b82ef81e9599c757bf2049365e40ff963c/pyarrow-23.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:427deac1f535830a744a4f04a6ac183a64fcac4341b3f618e693c41b7b98d2b0", size = 28338905, upload-time = "2026-01-18T16:19:32.93Z" },
|
| 1169 |
+
]
|
| 1170 |
+
|
| 1171 |
[[package]]
|
| 1172 |
name = "pydantic"
|
| 1173 |
version = "2.12.5"
|