Changelog
Unreleased
n_nearest_featuresnow selects the highest-scoring predictors deterministically instead of drawing a probability-weighted sample. On the published traffic benchmarks this reduced nRMSE by 2.5%/33.7% for PEMS-BAY MAR/block masks and 10.4%/19.4% for METR-LA, while removing feature-selection randomness.TimeSeriesImputernow accepts categorical, string, object, and boolean columns in pandas input: categorical targets are imputed with the configured classifier, and their lagged/lead copies participate as features alongside numeric ones. Polars time series input remains numeric-only.The benchmark suite (
scripts/multivariate_benchmark.pyand the docs benchmarks page) now covers open datasets commonly used to assess imputation algorithms: tabular UCI/sklearn datasets (Spambase, Letter Recognition, Wine Quality red, Abalone, Ionosphere, California Housing) imputed withMultivariateImputer, and time series benchmarks (PEMS-BAY, METR-LA, Beijing PM2.5, ETTh1) imputed withTimeSeriesImputer.
v0.3.2 (2026-07-19)
Optional Polars support:
MultivariateImputernow accepts eager Polars DataFrames with numeric, Boolean, String, Categorical, and Enum columns, whileTimeSeriesImputeraccepts a Polars Date/Datetimetime_columnand preserves it when regularizing timestamp gaps. Both imputers return Polars output for Polars input; install withdatafiller[polars].Behavior change:
min_samples_trainnow defaults to 20 (was 1). A benchmark across real and synthetic datasets showed that models fitted on a handful of rows produce imputations worse than plain column means once missingness reaches ~25%; thresholds of 10-20 were consistently best. Passmin_samples_train=1to restore the previous behavior.New
fallbackparameter onMultivariateImputerandTimeSeriesImputer: cells no model could impute (their missingness pattern never reachedmin_samples_traintraining rows) are now filled with the column mean (most frequent category for categoricals) by default (fallback="simple") instead of being left NaN. Passfallback=Noneto keep NaNs.optimasknow takes the caller’s row requirement into account (min_rows): among the NaN-free rectangles on its pareto front, it prefers ones with at leastmin_samples_trainrows over strictly larger ones with fewer, and only falls back to the unconstrained maximum-area choice when the constraint is infeasible. This removes most of the imputation-coverage loss previously caused by strictmin_samples_trainvalues on heavily missing data, and is byte-identical to the previous selection whenever the constraint does not bind.Optional GPU acceleration:
MultivariateImputerandTimeSeriesImputeraccept adeviceparameter (e.g."cuda") that solves all missingness patterns of a column as batched tensor operations. Requires the newdatafiller[gpu]extra (PyTorch), which stays entirely optional: with the defaultdevice=NonePyTorch is never imported. Imputed values match the CPU path up to float32 rounding; categorical targets, custom regressors, and patterns with too few complete rows keep using the CPU implementation.
v0.3.1 (2026-07-04)
ExtremeLearningMachinerewritten for speed and memory: BLAS-backed projection instead of a numba kernel, and chunked Gram-based fits/predicts above 65,536 rows so the full hidden matrix is never materialized (about 2.6x faster standalone fit, 7x lower peak memory on large fits).Fixed a correctness bug where refitting the same
ExtremeLearningMachineinstance on inputs of varying widths (asMultivariateImputerdoes per missingness pattern) read past or truncated the random projection matrix, producing non-finite or corrupted imputations. Projections are now sampled lazily per input width and cached, seeded reproducibly.Fixed an accuracy issue that made
ExtremeLearningMachinesystematically underperformFastRidgein typical imputation workloads: projection weights are now fan-in scaled, and a newmin_samples_per_featureparameter (default 5) caps the hidden width by the number of training samples so small per-pattern fits are no longer severely underdetermined.
v0.3 (2026-07-04)
TimeSeriesImputer can infer a regular DatetimeIndex frequency and reinsert missing timestamp rows inside the observed range before imputation.
Added optional deterministic calendar/trend features (
add_time_features, on by default) that stay observed through contiguous timestamp gaps.Training subsets that are identical across missingness patterns are fitted once and reused.
Large speedup of the imputation pipeline (about 4.5x on the reference TimeSeriesImputer benchmark) with lower memory usage and unchanged imputation results: default FastRidge models are solved from incrementally accumulated Gram matrices, per-pattern training rows are found from an index of missing positions, normalization statistics and feature-selection scoring are computed from masked sums without full-matrix copies, and lag/lead features are built directly in a preallocated matrix.
Fixed excessive memory retention caused by over-allocated NaN-position buffers.
Removed dead internal helpers and the unused global NaN-position pipeline.
v0.2.2 (2026-02-11)
Added scikit-learn transformer compatibility for MultivariateImputer and TimeSeriesImputer.
Ensured TimeSeriesImputer parameter updates propagate to its internal MultivariateImputer.
Added pipeline-focused tests for both imputers.
v0.2.1 (2026-01-21)
Documentation overhaul with clearer parameters, expanded how-to content, and a new benchmarks page.
New benchmark and utility scripts, plus runnable helpers for scripted runs.
Expanded benchmark artifacts and example outputs (Titanic and PEMS-Bay assets).
Imputation preprocessing updates (including pre-normalization adjustments).
Estimator defaults updated (ridge intercept default behavior).
Classifier baseline switched to DecisionTree.
Reduced repeated concatenations to improve performance in core workflows.
Timing tests to track performance regressions.
Removed unused imports and refreshed plotting assets/styles used in docs.