• Stars
    star
    442
  • Rank 98,677 (Top 2 %)
  • Language
    Jupyter Notebook
  • License
    MIT License
  • Created over 6 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

GeostatsPy Python package for spatial data analytics and geostatistics. Mostly a reimplementation of GSLIB, Geostatistical Library (Deutsch and Journel, 1992) in Python. Geostatistics in a Python package. I hope this resources is helpful, Prof. Michael Pyrcz

Documentation Status

Cite As:

Pyrcz, M.J., Jo. H., Kupenko, A., Liu, W., Gigliotti, A.E., Salomaki, T., and Santos, J., 2021, GeostatsPy Python Package, PyPI, Python Package Index, https://pypi.org/project/geostatspy/.

GeostatsPy Package

The GeostatsPy Package brings GSLIB: Geostatistical Library (Deutsch and Journel, 1998) functions to Python. GSLIB is a practical and extremely robust set of code for building spatial modeling workflows.

I created the GeostatsPy Package to support my students in my Data Analytics, Geostatistics and Machine Learning courses. I find my students benefit from hands-on opportunities, in fact it is hard to imagine teaching these topics without providing the opportunity to handle the numerical methods and build workflows. Last year, I tried to have them use the original FORTRAN executables and even with support and worked out examples, it was an uphill battle. In addition, all my students and I are now working in Python for our research. Thus, having access to geostatistical methods in Python directly impacts and facilitates the research of my group.

Finally, I like to code. I have over 25 years of experience in FORTRAN, C++ and Visual Basic programing. This includes frontend (Qt interfaces in C++) and backend development with small and at times very large engineering and geoscience projects.

What's Included

This package contains 2 parts:

  1. geostatspy.geostats includes GSLIB functions rewritten in Python. This currently includes all the variogram, distribution transformations, and spatial estimation and simulation (SGSIM soon) methods. I will continue adding functions to support modeling operations for practical subsurface model cosntruction.

  2. geostatspy.GSLIB includes reimplimentation of the GSLIB visualizations and low tech wrappers of the numerical methods (note: the low-tech wrapper require access to GSLIB executables).

The Authors

This package is being developed at the University of Texas in the Texas Center for Geostatistics.

  • Michael J. Pyrcz, Ph.D., P.Eng. - associate professor with The University of Texas at Austin. Primary author of the package.

  • Honggeun Jo - Ph.D. student working with Michael Pyrcz at The University of Texas at Austin. Author of 3D subroutines, 3D variogram calculation and modeling and wrapper for sgsim for 3D modeling. Thank you Honggeun!

  • Anton Kupenko - bug fixes, added docstrings, code refractory for PEP8, removed duplicated functions and variables. Thank you Anton!

  • Wendi Liu - Ph.D. student working with Michael Pyrcz at The University of Texas at Austin. Author of 3D subroutines and gammabar method. Also, GSLIB compiles in Mac OSX, and 3D variogram calculation wrapper. Thank you Wendi!

  • Alex E. Gigliotti - undergraduate student working with Michael Pyrcz at The University of Texas at Austin. Established unit testing. Thank you Alex!

  • Travis Salomaki - Ph.D. student working with Michael Pyrcz at The University of Texas at Austin. Improving package docs. Thank you Travis!

  • Javier Santos - one of Michael Pyrcz's graduate students contributed the post processing algorithm for summarizing over multiple realizations. Thank you Javier!

Package Inventory

Here's a list and some details on each of the functions available.

geostatspy.GSLIB Functions

Utilities to support moving between Python DataFrames and ndarrays, Data Tables, Gridded Data and Models in Geo-EAS file format (standard to GSLIB):

  1. ndarray2GSLIB - utility to convert 1D or 2D numpy ndarray to a GSLIB Geo-EAS file for use with GSLIB methods
  2. GSLIB2ndarray - utility to convert GSLIB Geo-EAS files to a 1D or 2D numpy ndarray for use with Python methods
  3. Dataframe2GSLIB(data_file,df) - utility to convert pandas DataFrame to a GSLIB Geo-EAS file for use with GSLIB methods
  4. GSLIB2Dataframe - utility to convert GSLIB Geo-EAS files to a pandas DataFrame for use with Python methods
  5. DataFrame2ndarray - take spatial data from a DataFrame and make a sparse 2D ndarray (NaN where no data in cell)

Visualization functions with the same parameterization as GSLIB using matplotlib:

  1. pixelplt - reimplemention in Python of GSLIB pixelplt with matplotlib methods
  2. pixelplt_st - reimplemention in Python of GSLIB pixelplt with matplotlib methods with support for sub plots
  3. pixelplt_log_st - reimplemention in Python of GSLIB pixelplt with matplotlib methods with support for sub plots and log color bar
  4. locpix - pixel plot and location map, reimplementation in Python of a GSLIB MOD with MatPlotLib methods
  5. locpix_st - pixel plot and location map, reimplementation in Python of a GSLIB MOD with MatPlotLib methods with support for sub plots
  6. locpix_log_st - pixel plot and location map, reimplementation in Python of a GSLIB MOD with MatPlotLib methods with support for sub plots and log color bar
  7. hist - histograms reimplemented in Python of GSLIB hist with MatPlotLib methods
  8. hist_st - histograms reimplemented in Python of GSLIB hist with MatPlotLib methods with support for sub plots

Data transformations

  1. affine - affine distribution transformation to correct feature mean and standard deviation
  2. nscore - normal score transform, wrapper for nscore from GSLIB (GSLIB's nscore.exe must be in working directory)
  3. declus - cell-based declustering, 2D wrapper for declus from GSLIB (GSLIB's declus.exe must be in working directory)

Spatial Continuity

  1. make_variogram - make a dictionary of variogram parameters to for application with spatial estimation and simulation
  2. gamv - irregularly sampled variogram, 2D wrapper for gam from GSLIB (.exe must be in working directory)
  3. varmap - regular spaced data, 2D wrapper for varmap from GSLIB (.exe must be in working directory)
  4. varmapv - irregular spaced data, 2D wrapper for varmap from GSLIB (.exe must be in working directory)
  5. vmodel - variogram model, 2D wrapper for vmodel from GSLIB (.exe must be in working directory)

Spatial Modeling

  1. kb2d - kriging estimation, 2D wrapper for kb2d from GSLIB (GSLIB's kb2d.exe must be in working directory)
  2. sgsim_uncond - sequential Gaussian simulation, 2D unconditional wrapper for sgsim from GSLIB (GSLIB's sgsim.exe must be in working directory)
  3. sgsim - sequential Gaussian simulation, 2D and 3D wrapper for sgsim from GSLIB (GSLIB's sgsim.exe must be in working directory)
  4. cosgsim_uncond - sequential Gaussian simulation, 2D unconditional wrapper for sgsim from GSLIB (GSLIB's sgsim.exe must be in working directory)

Spatial Model Resampling

  1. sample - sample 2D model with provided X and Y and append to DataFrame
  2. gkern - make a Gaussian kernel for convolution, moving window averaging (from Teddy Hartano, Stack Overflow)
  3. regular_sample - extract regular spaced samples from a 2D spatial model
  4. random_sample - extract random samples from a 2D spatial model
  5. DataFrame2ndarray - convent spatial point data in a DataFrame to a sparse ndarray grid

geostatspy.geostats Functions

Numerical methods in GSLIB (Deutsch and Journel, 1998) translated to Python:

  1. correct_trend - correct the order relations of an indicator-based trend model
  2. backtr - GSLIB's backtr function to transform a distribution
  3. declus - GSLIB's DECLUS program reimplimented for cell-based declustering in 2D
  4. gam - GSLIB's GAM program reimplimented for variogram calculation with regular data in 2D
  5. gamv - GSLIB's GAMV program reimplimented for variogram calculation with iregular data in 2D
  6. varmapv - GSLIB's VARMAP program reimplimented for irregularly spaced spatial data in 2D
  7. vmodel - GSLIB's VMODEL program reimplimented for visualization of nested variogram models in 2D
  8. nscore - GSLIB's NSCORE program reimplimented for normal score distribution transformation
  9. kb2d - GSLIB's KB2D program reimplimented for 2D spaitial estimation
  10. ik2d - GSLIB's IK3D program reimplimented for 2D indicator-based kriging estimation

More functionality will be added soon.

Package Dependencies

The functions rely on the following packages:

  1. numpy - for ndarrays
  2. pandas - for DataFrames
  3. numpy.linalg - for linear algebra
  4. numba - for numerical speed up
  5. scipy - for fast nearest neighbor search
  6. matplotlib.pyplot - for plotting

These packages should be available with any modern Python distribution (e.g. https://www.anaconda.com/download/).

If you get a package import error, you may have to first install some of these packages. This can usually be accomplished by opening up a command window on Windows and then typing 'python -m pip install [package-name]'. More assistance is available with the respective package docs.

Explanation of GeostatsPy

GeostatsPy includes functions that run 2D workflows from GSLIB in Python (i.e. low tech wrappers), Python translations and reimplementations of GSLIB methods, along with utilities to move between GSLIB's Geo-EAS data sets and Pandas DataFrames, and grids and 2D NumPy ndarrays respectively and other useful operations such as resampling from regular datasets and rescaling distributions.

The reimplementations as of now include NSCORE, GAM, GAMV, VMODEL, DECLUS, KB2D, IK2D and SGSIM etc. and most of the visualizations using the standard GSLIB parametric inputs and matplotlib back end. The low tech wrappers simply write the GSLIB parameters, run the GSLIB executables and then read in the GSLIB output. This allows for construction of Python workflows with the very robust GSLIB programs.

Why make this package?

I wanted a set of functions to utilize the very robust and numerically efficient GSLIB: Geostatistical Library (Deutsch and Journel, 1998) in Python. While there are other current solutions in Python, I found that these solutions are either proprietary (not open source), not maintained or missing vital functionality; therefore, I have not been able to use these other solutions to teach modeling workflows to students with little or no programming experience. Imagine getting 55 undergraduate students to resort back to a previous version of Python because a single dependency of an available package is not available in a current Python version. Image a student about to submit an assignment, and the code won't run immediately before submission because of an update to a dependency. I need methods for my students that just work, are reliable and do not require students to complete a more complicated environment setup.

Deutsch and Journel (1998) gave the community GSLIB, an extremely robust and flexible set of tools to build spatial modeling workflows. I have spent almost 20 years working with GSLIB along with a wide variety of subsurface modeling software. The powerful flexibility of GSLIB may be lost in methods that attempt to 'can' the inputs and parameters into complicated and hard to work with objects or attempt to combine the programs into a single program. I love open source for teaching the theory because students must see under the hood! The concept of basic building blocks and simple, common inputs is essential to GSLIB. I tried to preserve this by putting together functions with the same conventions as GSLIB, the result is a set of functions that (1) are practical for my students to use and (2) will move the GSLIB veterans into Python workflow construction. Honestly, I did nothing original, but that was my intention.

I'm a very busy new professor, I'll keep adding more functionality as I have time.

More on GSLIB

The GSLIB source is available from GSLIB.com. If you would like to get the executables, ready to use without any need to compile them, go to GSLIB.com for Windows and Linux. I failed to find any Mac OS X executables so my Ph.D. student Wendi Liu compiled them for us (thank you Wendi!) and we have posted them here https://github.com/GeostatsGuy/GSLIB_MacOS. If folks on Windows are encountering missing DLL's, I could post static builds. Wendi provided instructions to help Mac users with missing DLL issues at that same location above.

Making Images

The graphical / visualization methods have 2 variants. '_ST' specifies that function is suitable for building subplots (stacked / combined images) while those without '_ST' are for stand-alone images (an image is returned with the function call and an image file is saved in the working directory). The resolution and image file type are specified at the top of the GeostatPy.GSLIB functions.

Assistance Welcome

Found an issue (I'm sure there are issues!)? Got a new idea? Want to work on this? Let me know, submit revisions, I'm happy to collaborate.

Package Examples

There are many example workflow examples available on my GitHub account at https://github.com/GeostatsGuy/, specifically the GeostatsPy https://github.com/GeostatsGuy/GeostatsPy and PythonNumericalDemos https://github.com/GeostatsGuy/PythonNumericalDemos repositories. Most of these examples simply placed the code for the required functions directly in the Jupyter notebook. These were made before this Package was made as I was developing all the functions individually. To use these examples just make these modifications:

  1. install geostatspy with the command pip install geostatspy. I used the terminal Anaconda Navigator under the environments tab to make sure the package was accessible to Jupyter Notebooks.
  2. add import geostatspy.GSLIB as GSLIB and import geostatspy.geostats as geostats to the top of the workflow
  3. add GSLIB. or geostats. as a 'prefex to the GeostatsPy functions based on which set they belong to.

Over the next month I will update all workflows to use the geostatspy package instead of pasting code into the workflows.

Here's a simple exaple of declustering with the geostatspy package. It looks long because we include making a synthetic dataset, dropping samples to impose a sampling bias, declustering and all the visualization and diagnostics.

import geostatspy.GSLIB as GSLIB                          # GSLIB utilities, viz and wrapped functions
import geostatspy.geostats as geostats                    # GSLIB converted to Python
import matplotlib.pyplot as plt                           # plotting
import scipy.stats                                        # summary stats of ndarrays

# Make a 2d simulation
nx = 100; ny = 100; cell_size = 10                        # grid number of cells and cell size
xmin = 0.0; ymin = 0.0;                                   # grid origin
xmax = xmin + nx * cell_size; ymax = ymin + ny * cell_size# calculate the extent of model
seed = 74073                                              # random number seed  for stochastic simulation    
range_max = 1800; range_min = 500; azimuth = 65           # Porosity variogram ranges and azimuth
vario = GSLIB.make_variogram(0.0,nst=1,it1=1,cc1=1.0,azi1=65,hmaj1=1800,hmin1=500) # assume variogram model
mean = 10.0; stdev = 2.0                                  # Porosity mean and standard deviation
vmin = 4; vmax = 16; cmap = plt.cm.plasma                 # color min and max and using the plasma color map

# calculate a stochastic realization with standard normal distribution
sim = GSLIB.sgsim_uncond(1,nx,ny,cell_size,seed,vario,"simulation") # 2d unconditional simulation
sim = GSLIB.affine(sim,mean,stdev)                        # correct the distribution to a target mean and standard deviation

# extract samples from the 2D realization 
sampling_ncell = 10  # sample every 10th node from the model
samples = GSLIB.regular_sample(sim,xmin,xmax,ymin,ymax,sampling_ncell,10,10,nx,ny,'Realization')

# remove samples to create a sample bias (preferentially removed low values to bias high)
samples_cluster = samples.drop([80,79,78,73,72,71,70,65,64,63,61,57,56,54,53,47,45,42]) # this removes specific rows (samples)
samples_cluster = samples_cluster.reset_index(drop=True)  # we reset and remove the index (it is not sequential anymore)
GSLIB.locpix(sim,xmin,xmax,ymin,ymax,cell_size,vmin,vmax,samples_cluster,'X','Y','Realization','Porosity Realization and Regular Samples','X(m)','Y(m)','Porosity (%)',cmap,"Por_Samples")

# apply the declus program convert to Python
wts,cell_sizes,averages = geostats.declus(samples_cluster,'X','Y','Realization',iminmax=1,noff=5,ncell=100,cmin=1,cmax=2000)
samples_cluster['wts'] = wts            # add the weights to the sample data
samples_cluster.head()

# plot the results and diagnostics for the declustering
plt.subplot(321)
GSLIB.locmap_st(samples_cluster,'X','Y','wts',xmin,xmax,ymin,ymax,0.0,2.0,'Declustering Weights','X (m)','Y (m)','Weights',cmap)

plt.subplot(322)
GSLIB.hist_st(samples_cluster['wts'],0.0,2.0,log=False,cumul=False,bins=20,weights=None,xlabel="Weights",title="Declustering Weights")
plt.ylim(0.0,20)

plt.subplot(323)
GSLIB.hist_st(samples_cluster['Realization'],0.0,20.0,log=False,cumul=False,bins=20,weights=None,xlabel="Porosity",title="Naive Porosity")
plt.ylim(0.0,20)

plt.subplot(324)
GSLIB.hist_st(samples_cluster['Realization'],0.0,20.0,log=False,cumul=False,bins=20,weights=samples_cluster['wts'],xlabel="Porosity",title="Naive Porosity")
plt.ylim(0.0,20)

# Plot the declustered mean vs. cell size to check the cell size selection
plt.subplot(325)
plt.scatter(cell_sizes,averages, c = "black", marker='o', alpha = 0.2, edgecolors = "none")
plt.xlabel('Cell Size (m)')
plt.ylabel('Porosity Average (%)')
plt.title('Porosity Average vs. Cell Size')
plt.ylim(8,12)
plt.xlim(0,2000)

print(scipy.stats.describe(wts))

plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=3.5, wspace=0.2, hspace=0.2)
plt.show()

I also have various lecture notes, demonstrations and example workflows on GitHub (see link below), and some tutorials on my YouTube channel (see link below). I will continue to add more. I'm just getting started,

Michael

Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin

More Resources Available at: Twitter | GitHub | Website | GoogleScholar | Book | YouTube | LinkedIn

More Repositories

1

PythonNumericalDemos

Well-documented Python demonstrations for spatial data analytics, geostatistical and machine learning to support my courses.
Jupyter Notebook
1,325
star
2

Resources

Inventory of all the educational content that I share on spatial data analytics, geostatistics and machine learning. I hope these resources are helpful, Prof. Michael Pyrcz
345
star
3

GeostatsPy_Intro_Course

Introduction to spatial data analytics and machine learning with GeostatsPy Python package
Jupyter Notebook
138
star
4

ExcelNumericalDemos

A set of numerical demonstrations in Excel to assist with teaching / learning concepts in probability, statistics, spatial data analytics and geostatistics. I hope these resources are helpful, Prof. Michael Pyrcz
95
star
5

2DayCourse

My 2-day short course on spatial data analytics and geostatistics. I hope these resources are helpful, Prof. Michael Pyrcz
82
star
6

GeoDataSets

Synthetic datasets for geoscience (geo)statistical modeling
71
star
7

MachineLearningCourse

My graduate level machine learning course, including student machine learning projects.
Jupyter Notebook
61
star
8

PGE383_SubsurfaceModeling

Graduate course on subsurface modeling
Jupyter Notebook
32
star
9

geostatsr

Geostatistical utilities and tutorial in R. For the tutorials I have included Rmarkdown html files.
HTML
32
star
10

GeostatsGuy

Information about me.
28
star
11

MachineLearning_StudentProjects

My graduate students complete Machine Learning projects that they have agreed to share.
Jupyter Notebook
24
star
12

Machine_Learning

1 Day Machine Learning Course
Jupyter Notebook
21
star
13

LectureExercises

The exercises from my Introduction to Geostatistics available on YouTube on the GeostatsGuy Lectures Channel.
R
19
star
14

5DayGeostats_DataAnalytics

5-day course on Geostatistics, Data Analytics and Machine Learning
Jupyter Notebook
19
star
15

MultivariateModeling

Short course on multivariate modeling
Jupyter Notebook
16
star
16

MLTrainingImages

Machine learning training images.
Python
15
star
17

InteractivePython

Jupyter Notebook
15
star
18

GeostatsLectures

(Geo)statistical course materials released for anyone to use (.pdf format). Enjoy! I'm happy to discuss.
15
star
19

GeostatsMachineLearning_Course

14
star
20

DataAnalytics_Geostatistics

2 Day short course on spatial stat analytics, geostatistics and machine learning.
Jupyter Notebook
12
star
21

2DayCourse_Exercises

Jupyter Notebook
12
star
22

SubsurfaceMachineLearning

Short course on subsurface data analytics and machine learning.
10
star
23

Geostats_ML_2Day

Two day course on geostats and machine learning
10
star
24

GeostatsPy_Course_2

Course on the GeostatsPy Python geostatistics package covering uncertainty modeling with declustering and simulation.
Jupyter Notebook
8
star
25

RandomTools

Random tools to support decision making in like
Jupyter Notebook
8
star
26

Undergraduate_Research

Undergraduate research projects.
Jupyter Notebook
6
star
27

GSLIB_MacOS

Executables for GSLIB on Mac OS
6
star
28

EnergyAI_2021_Hackathon

Jupyter Notebook
6
star
29

GeostatsPyDemos

Well-documented demonstrations of the GeostatsPy package for geostatistics and spatial data analytics.
6
star
30

PGE379_SubsurfaceMachineLearning

Course in subsurface machine learning.
4
star
31

Heterogeneity_Course

4
star
32

DIRECT

Digital Reservoir Characterization Technology Consortium, UT Austin
4
star
33

interactive_geostatr

A collection of interactive geostatistical tutorials in Jupyter Notebooks / Binder.
Jupyter Notebook
4
star
34

GSLIB_Windows

Static builds of GSLIB for Windows to solve issues with missing DLL files.
2
star
35

RepeatableResearch

Workflows for my published papers for repeatability.
Jupyter Notebook
2
star
36

DataScience_Interactive_Python

Python interactive dashboards for learning data science
Jupyter Notebook
2
star
37

GSLIBTools

FORTRAN tools to assist with building geostatistical workflows.
Fortran
1
star
38

MachineLearningDemos

well-documented demonstration Python Jupyter workflows for many common machine learning workflows
Jupyter Notebook
1
star
39

MachineLearningDemos_Book

Applied Machine Learning in Python e-Book
Jupyter Notebook
1
star