from __future__ import annotations from typing import Dict import polars as pl from tools.base import BaseTool class AutoFieldTool(BaseTool): """Automatically shrink column types to the smallest that fits the data.""" def execute(self, inputs: Dict[str, pl.DataFrame]) -> Dict[str, pl.DataFrame]: df = inputs.get("Input", pl.DataFrame()) if df.is_empty(): return {"Output": df} new_cols: list[pl.Series] = [] for col_name in df.columns: series = df[col_name] shrunken = self._shrink(series) new_cols.append(shrunken) return {"Output": pl.DataFrame(new_cols)} def _shrink(self, s: pl.Series) -> pl.Series: if s.dtype in (pl.Int64, pl.Int32, pl.Int16): for dtype in (pl.Int8, pl.Int16, pl.Int32, pl.Int64): try: return s.cast(dtype) except Exception: continue if s.dtype in (pl.Float64, pl.Float32): try: return s.cast(pl.Float32) except Exception: pass return s