Metadata-Version: 2.2
Name: soilspectfm
Version: 0.0.4
Summary: Soil infrared spectra preprocessing utilities
Home-page: https://github.com/franckalbinet/soilspectfm
Author: Franck Albinet
Author-email: franckalbinet@gmail.com
License: Apache Software License 2.0
Keywords: nbdev jupyter notebook python
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: Apache Software License
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: fastcore
Requires-Dist: scikit-learn
Requires-Dist: matplotlib
Requires-Dist: PyWavelets
Provides-Extra: dev
Requires-Dist: soilspecdata; extra == "dev"
Requires-Dist: nbdev; extra == "dev"
Requires-Dist: ipykernel; extra == "dev"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# SoilSpecTfm


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

> Spectral Processing Tools for Soil Spectroscopy

By translating specialized soil spectroscopy methods into the
[`scikit-learn`](https://scikit-learn.org/stable/) framework,
`SoilSpecTfm` and
[`SoilSpecData`](https://fr.anckalbi.net/soilspecdata/) connect this
niche domain with Python’s vast machine learning ecosystem, making
advanced ML/DL tools accessible to soil scientists.

Implemented transforms developed so far include:

- **Baseline corrections**:

  - [x]
    [`SNV`](https://franckalbinet.github.io/soilspectfm/core.html#snv):
    Standard Normal Variate
  - [x]
    [`MSC`](https://franckalbinet.github.io/soilspectfm/core.html#msc):
    Multiplicative Scatter Correction
  - [ ] `Detrend`: Detrend the spectrum (planned)
  - [ ] `ALS`: Asymmetric Least Squares detrend the spectrum (planned)

- **Derivatives**:

  - [x]
    [`TakeDerivative`](https://franckalbinet.github.io/soilspectfm/core.html#takederivative):
    Take derivative (1st, 2nd, etc.) of the spectrum and apply
    Savitzky-Golay smoothing
  - [ ] `GapSegmentDerivative`: (planned)

- **Smoothing**:

  - [x]
    [`WaveletDenoise`](https://franckalbinet.github.io/soilspectfm/core.html#waveletdenoise):
    Wavelet denoising
  - [x]
    [`SavGolSmooth`](https://franckalbinet.github.io/soilspectfm/core.html#savgolsmooth):
    Savitzky-Golay smoothing

- **Other transformations**:

  - [x]
    [`ToAbsorbance`](https://franckalbinet.github.io/soilspectfm/core.html#toabsorbance):
    Transform the spectrum to absorbance
  - [x]
    [`Resample`](https://franckalbinet.github.io/soilspectfm/core.html#resample):
    Resample the spectrum to a new wavenumber range

**Key Features**:

- Seamless integration with scikit-learn’s machine learning ecosystem
- Complement with [SoilSpecData](https://fr.anckalbi.net/soilspecdata/)
  package for soil spectroscopy workflows
- Pipeline-ready transformers with consistent API

All transformers follow scikit-learn conventions:

- Implement fit/transform interface
- Support get_params/set_params for GridSearchCV
- Provide detailed documentation and examples

## Installation

``` bash
pip install soilspectfm
```

## Quick Start

``` python
from soilspectfm.core import (SNV, 
                              TakeDerivative, 
                              ToAbsorbance, 
                              Resample, 
                              WaveletDenoise)

from sklearn.pipeline import Pipeline
```

### Loading OSSL dataset

Let’s use OSSL dataset as an example using
[SoilSpecData](https://fr.anckalbi.net/soilspecdata/) package.

``` python
from soilspecdata.datasets.ossl import get_ossl
```

``` python
ossl = get_ossl()
mir_data = ossl.get_mir()
```

### Preprocessing pipeline

Transforms are fully compatible with
[scikit-learn](https://scikit-learn.org/stable/) and can be used in a
pipeline as follows:

``` python
pipe = Pipeline([
    ('snv', SNV()), # Standard Normal Variate transformation
    ('denoise', WaveletDenoise()), # Wavelet denoising
    ('deriv', TakeDerivative(window_length=11, polyorder=2, deriv=1)) # First derivative
])

X_tfm = pipe.fit_transform(mir_data.spectra)
```

### Quick visualization

``` python
from soilspectfm.visualization import plot_spectra
from matplotlib import pyplot as plt
```

``` python
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 7))

ax1 = plot_spectra(
    mir_data.spectra, 
    mir_data.wavenumbers,
    ax=ax1,
    ascending=False,
    color='black',
    alpha=0.6,
    lw=0.5,
    xlabel='Wavenumber (cm$^{-1}$)',
    title='Raw Spectra'
)

ax2 = plot_spectra(
    X_tfm,
    mir_data.wavenumbers,
    ax=ax2,
    ascending=False,
    color='steelblue',
    alpha=0.6,
    lw=0.5,
    xlabel='Wavenumber (cm$^{-1}$)',
    title='SNV + Derivative (1st order) Transformed Spectra'
)

plt.tight_layout()
```

![](index_files/figure-commonmark/cell-7-output-1.png)

## Dependencies

- fastcore
- numpy
- scipy
- scikit-learn
- matplotlib

## Further references

- https://orange-spectroscopy.readthedocs.io/en/latest/widgets/preprocess-spectra.html

## Contributing

### Developer guide

If you are new to using `nbdev` here are some useful pointers to get you
started.

Install spectfm in Development mode:

``` sh
# make sure spectfm package is installed in development mode
$ pip install -e .

# make changes under nbs/ directory
# ...

# compile to have changes apply to spectfm
$ nbdev_prepare
```

## License

This project is licensed under the Apache2 License - see the LICENSE
file for details.

## Support

For questions and support, please [open an
issue](https://github.com/franckalbinet/spectfm/issues) on GitHub.
