Changelog¶
All notable changes to this project are documented here. The format follows Keep a Changelog, and version numbers follow PEP 440.
Unreleased¶
0.1.0a2 - 2026-09-15¶
Second alpha pre-release. It adds a documentation site, makes kriging prediction much faster, and fixes wrong or missing results in parallel prediction and in the simple and universal kriging variance.
Added¶
- A documentation site, built with MkDocs, at https://diogoribeiro7.github.io/pygeostats/: user guides, an API reference and known limitations. Its examples, and the README's, run as tests (#21, #22).
Changed¶
- Kriging estimators factorise their kriging system once, at
fit, and predict from dual weights, with covariances computed in parallel in the Rust core.predictno longer rebuilds and factorises the system on every call, andAnisotropicKrigingno longer builds its covariances in Python or solves a system for every target (#24). - A singular kriging system, as when two samples share a location, raises
ValueErroratfitinstead of atpredict.AnisotropicKrigingalso rejects a variogram model other than exponential, spherical or Gaussian atfit(#24). ParallelKrigingExecutorspawns its process workers on every platform. Forked workers could wait forever on the Rust core's thread pool (#24).
Deprecated¶
OrdinaryKriging.predict_parallel(), which never worked: it raised for any input. It now warns and returns whatpredict()does, sincepredict()already computes targets in parallel, and it will be removed in a future release (#26).
Fixed¶
StreamingVariogramBuilder.add_pairs()works withoutweights, which it documents as optional. It raisedTypeError, because the Rust accumulator required the argument (#27).examples/anisotropic_kriging_example.pyruns. It called the unimplementedcreate_anisotropic_variogram_from_directionaland used undefined variables; it now follows the anisotropy guide (#27).SimpleKrigingandUniversalKrigingreport their own kriging variance. Both reported the ordinary kriging variance, which is too large for simple kriging and too small for universal kriging (#25).ParallelKrigingExecutorreturns predictions in the order of the targets. Thread and process results were joined in the order tasks finished, which put chunks of predictions at other targets' positions without an error (#23).- Fitted variograms, and kriging models that hold them, can be pickled and
deep-copied, so
ParallelKrigingExecutorworks with process workers (#23). - The executor's spatial strategy predicts every target. Targets along a line parallel to an axis, or at a single location, came back as NaN (#23).
- An error raised by the model during
ParallelKrigingExecutor.predict_parallelis raised, instead of turning that part of the predictions into NaN (#23). ParallelKrigingExecutorcallsprogress_callbackwhen tqdm is installed (#23).spatial_tilesraisesValueErrorfor tile sizes that are not positive, which used to run until memory ran out, and returns tiles for bounds with no width or height (#23).
Known limitations¶
- The workflow from directional variograms to anisotropic kriging is still not
implemented, and anisotropy estimates from
detect_anisotropyand the initialisers are rough: on a few hundred samples the axis can be tens of degrees off. AnisotropicKrigingmeasures its rotation angle clockwise, unlikeDirectionalVariogram.- Kriging in a process forked after pygeostats has predicted can hang.
- The known limitations page has the full list.
0.1.0a1 - 2026-09-15¶
First release, published to PyPI as an alpha pre-release. The project was
developed as pyspatialstats until that name turned out to belong to an
unrelated package on PyPI.
Added¶
- Wheels for Linux (x86_64 and aarch64), macOS (Intel and Apple silicon) and Windows (x86_64), built against the stable ABI so that one wheel per platform covers Python 3.11 and newer (#3, #7, #11).
- Publishing to PyPI through trusted publishing, with no API tokens (#3).
Changed¶
- Python 3.11 is the minimum supported version. Dependency minimums are the earliest releases that work on it (#11).
Fixed¶
Variogram.fitreaches the least-squares optimum and reports when a fit cannot be trusted (#5).- Anisotropic variogram fitting reports the longer axis as
range_major, tries several starts for its isotropic fallback, and no longer reports a fit that is flat across the data as converged (#9, #12). DirectionalVariogram.detect_anisotropyfits an ellipse through the directional ranges instead of taking the longest one, which put the axis 22 to 45 degrees off in the median (#13).estimate_rotation_anglereports the major axis, with a ratio of at least 1 (#13).- Anisotropy angles are averaged as axes, so directions either side of 0 degrees no longer average to 90 (#16).
InitializationEnsemble.runkeeps each directional range with its angle, and no longer raises when a direction has no range or fewer than three do (#17).EmpiricalVariogram.computereturns empty bins for a single point instead of raising (#14).- The sampling-pattern diagnostic no longer depends on the order of the points (#15).
Known limitations¶
- The workflow from directional variograms to anisotropic kriging is not
implemented:
DirectionalVariogram.estimate_initial_parameters()andcreate_anisotropic_variogram_from_directional()raiseNotImplementedError. - The anisotropy ratio from
detect_anisotropyruns low, andRangeInitializerreturns starting values rather than model ranges. The README has details.