from __future__ import annotations import json from pathlib import Path import numpy as np from datasets import Dataset from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split PROJECT_DIR = Path(__file__).resolve().parent DATA_DIR = PROJECT_DIR / "data" def split_indices(labels: np.ndarray, seed: int = 2026) -> dict[str, np.ndarray]: indices = np.arange(len(labels)) train, remainder = train_test_split( indices, test_size=0.30, stratify=labels, random_state=seed, ) validation, test = train_test_split( remainder, test_size=0.50, stratify=labels[remainder], random_state=seed, ) return {"train": train, "validation": validation, "test": test} def main() -> None: DATA_DIR.mkdir(parents=True, exist_ok=True) digits = load_digits() images = digits.images.astype(np.float32) labels = digits.target.astype(np.int64) manifest = {} for name, indices in split_indices(labels).items(): dataset = Dataset.from_dict( { "image": [image.reshape(-1).tolist() for image in images[indices]], "label": labels[indices].tolist(), } ) path = DATA_DIR / f"{name}.parquet" dataset.to_parquet(path) counts = np.bincount(labels[indices], minlength=10) manifest[name] = { "rows": len(indices), "class_counts": counts.tolist(), "path": path.name, } (DATA_DIR / "manifest.json").write_text( json.dumps(manifest, indent=2), encoding="utf-8", ) print(json.dumps(manifest, indent=2)) if __name__ == "__main__": main()