mcpField
S
scikit-gstat

scikit-gstat

github.com/steadfastasartData & databases7371 installsUpdated 6w ago
Repository

About scikit-gstat

scikit-gstat is a Python library for variogram analysis and kriging, aimed at geospatial data analysts. It includes directional and spatio-temporal variograms, robust estimators, and a scikit-learn-compatible interface.

Key features

  1. 01Fit empirical and theoretical variograms
  2. 02Interpolate with ordinary kriging
  3. 03Analyze directional and spatio-temporal patterns
  4. 04Use robust variogram estimators
  5. 05Integrate with scikit-learn workflows

Use cases

  1. 01Model spatial correlation in measurements
  2. 02Predict values across a spatial grid
  3. 03Assess variogram models with cross-validation

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill scikit-gstat

After installing, type/scikit-gstatin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
kriging_methods.md
variogram_models.md
scripts/
variogram_analysis.py

Details

From the project README

SciKit-GStat - Geostatistics

Quick Reference

import skgstat as skg
import numpy as np

# Create variogram
V = skg.Variogram(coordinates=coords, values=values, n_lags=15)

# Fit model
V.model = 'spherical'
print(f"Range: {V.parameters[0]:.2f}, Sill: {V.parameters[1]:.2f}")

# Kriging interpolation
ok = skg.OrdinaryKriging(V)
predictions = ok.transform(grid_coords)

Key Classes

ClassPurpose
VariogramEmpirical and theoretical variograms
OrdinaryKrigingInterpolation with spatial correlation
DirectionalVariogramAnisotropic variograms
SpaceTimeVariogramSpatio-temporal analysis

Essential Operations

Create and Fit Variogram
import skgstat as skg

V = skg.Variogram(
    coordinates=coords,      # (n, 2) array of x, y
    values=values,           # (n,) array of measurements
    n_lags=15,
    maxlag='median'          # or specific distance
)

# Fit model: 'spherical', 'exponential', 'gaussian', 'matern', 'stable'
V.model = 'spherical'

# Get parameters
print(f"Range: {V.parameters[0]:.2f}")
print(f"Sill: {V.parameters[1]:.2f}")
print(f"Nugget: {V.parameters[2]:.2f}")
print(f"RMSE: {V.rmse:.4f}")
Ordinary Kriging
import skgstat as skg
import numpy as np

V = skg.Variogram(coords, values, model='spherical')
ok = skg.OrdinaryKriging(V)

# Create prediction grid
x = np.linspace(0, 100, 50)
y = np.linspace(0, 100, 50)
xx, yy = np.meshgrid(x, y)
grid_coords = np.column_stack([xx.ravel(), yy.ravel()])

# Predict
predictions = ok.transform(grid_coords)
Z = predictions.reshape(xx.shape)

# Get variance
ok.return_variance = True
predictions, variance = ok.transform(grid_coords)
Directional Variogram
import skgstat as skg

DV = skg.DirectionalVariogram(
    coordinates=coords,
    values=values,
    azimuth=45,          # Direction in degrees
    tolerance=22.5,      # Angular tolerance
    bandwidth='q33'      # Perpendicular bandwidth
)

# Check anisotropy
for az in [0, 45, 90, 135]:
    DV.azimuth = az
    print(f"Azimuth {az}: Range = {DV.parameters[0]:.2f}")
Cross-Validation
import skgstat as skg
from sklearn.model_selection import cross_val_score

V = skg.Variogram(coords, values, model='spherical')
ok = skg.OrdinaryKriging(V)

scores = cross_val_score(ok, coords, values, cv=5, scoring='neg_mean_squared_error')
print(f"CV RMSE: {np.sqrt(-scores.mean()):.4f}")
Robust Estimators
import skgstat as skg

# Use robust estimator for noisy data
V = skg.Variogram(
    coords, values,
    estimator='cressie'  # 'matheron', 'cressie', 'dowd', 'genton'
)

Quick Model Reference

ModelBehavior
sphericalMost common, linear near origin
exponentialNever reaches sill, gradual approach
gaussianParabolic near origin, smooth
maternFlexible smoothness control

When to Use vs Alternatives

Use CaseToolWhy
Variogram analysis + krigingscikit-gstatModern API, sklearn-compatible
GSLIB-style simulation (SGSIM)GeostatsPyFull GSLIB simulation engine
Kriging with trend/driftpykrigeUniversal kriging, regression kriging
Random field generationgstoolsFlexible covariance, SRF generation
Spatio-temporal variogramsscikit-gstatBuilt-in SpaceTimeVariogram
Production geomodellingSGeMS / PetrelGUI, large-scale 3D models
Robust variogram estimationscikit-gstatCressie, Dowd, Genton estimators
ML pipeline integrationscikit-gstatsklearn fit/transform interface

Choose scikit-gstat when: You want a Pythonic, scikit-learn-compatible API for variogram fitting and kriging. Best for exploratory geostatistical analysis with cross-validation and integration into ML pipelines.

Choose GeostatsPy when: You need GSLIB-compatible simulation workflows (SGSIM, SISIM) or are working with traditional geostatistical conventions.

Choose pykrige when: You need universal kriging with external drift variables or regression kriging combining geostatistics with machine learning predictions.

Common Workflows

Variogram Fitting and Ordinary Kriging
  • Load spatial data as numpy arrays (coordinates and values)
  • Create Variogram object with appropriate n_lags and maxlag
  • Test estimators: matheron (default) vs cressie (robust) for noisy data
  • Fit multiple models (spherical, exponential, gaussian) and compare RMSE
  • Check anisotropy with DirectionalVariogram at 0, 45, 90, 135 degrees
  • Select best model based on RMSE and visual fit
  • Create OrdinaryKriging object from fitted variogram
  • Define prediction grid and run ok.transform(grid_coords)
  • Set ok.return_variance = True to get kriging variance
  • Cross-validate with cross_val_score() to assess prediction quality
  • Map predictions and kriging variance

Common Issues

IssueSolution
Variogram flat or erraticAdjust n_lags and maxlag (try maxlag='median')
Poor model fit (high RMSE)Try different model types or nested structures
Kriging too slowReduce number of conditioning points or grid resolution
Nugget too largeMay indicate measurement error; try robust estimators
Anisotropy unclearUse smaller angular tolerance in DirectionalVariogram

Tips

  1. Maxlag should be ~50% of study area diagonal
  2. Use robust estimators (cressie, dowd) with noisy data
  3. Test multiple models and compare RMSE
  4. Check anisotropy with directional variograms before kriging

References

Scripts

Comments

Markdown supported