Skip to content

Derivatives

spectrakit.derivative.derivative_savgol

derivative_savgol(
    intensities: ndarray,
    window_length: int = DEFAULT_WINDOW_LENGTH,
    polyorder: int = DEFAULT_POLYORDER,
    deriv: int = DEFAULT_DERIV,
    delta: float = 1.0,
) -> np.ndarray

Compute spectral derivative using Savitzky-Golay filter.

Simultaneously smooths and differentiates spectral data. First and second derivatives are the most commonly used in chemometrics.

Parameters:

Name Type Description Default
intensities ndarray

Spectral intensities, shape (W,) or (N, W).

required
window_length int

Length of the filter window (must be odd and greater than polyorder).

DEFAULT_WINDOW_LENGTH
polyorder int

Order of the polynomial used to fit the samples.

DEFAULT_POLYORDER
deriv int

Order of the derivative to compute. Common values: 1 (first derivative) or 2 (second derivative).

DEFAULT_DERIV
delta float

Spacing of the samples to which the filter is applied. Used to scale the derivative by 1 / delta**deriv.

1.0

Returns:

Type Description
ndarray

Derivative spectrum, same shape as input.

Raises:

Type Description
SpectrumShapeError

If input is not 1-D or 2-D.

EmptySpectrumError

If input has zero elements.

ValueError

If parameters are invalid (window_length not odd, polyorder >= window_length, deriv < 0, delta <= 0).

Source code in src/spectrakit/derivative/savgol.py
def derivative_savgol(
    intensities: np.ndarray,
    window_length: int = DEFAULT_WINDOW_LENGTH,
    polyorder: int = DEFAULT_POLYORDER,
    deriv: int = DEFAULT_DERIV,
    delta: float = 1.0,
) -> np.ndarray:
    """Compute spectral derivative using Savitzky-Golay filter.

    Simultaneously smooths and differentiates spectral data. First and
    second derivatives are the most commonly used in chemometrics.

    Args:
        intensities: Spectral intensities, shape ``(W,)`` or ``(N, W)``.
        window_length: Length of the filter window (must be odd and
            greater than ``polyorder``).
        polyorder: Order of the polynomial used to fit the samples.
        deriv: Order of the derivative to compute. Common values:
            1 (first derivative) or 2 (second derivative).
        delta: Spacing of the samples to which the filter is applied.
            Used to scale the derivative by ``1 / delta**deriv``.

    Returns:
        Derivative spectrum, same shape as input.

    Raises:
        SpectrumShapeError: If input is not 1-D or 2-D.
        EmptySpectrumError: If input has zero elements.
        ValueError: If parameters are invalid (window_length not odd,
            polyorder >= window_length, deriv < 0, delta <= 0).
    """
    if window_length < 1 or window_length % 2 == 0:
        raise ValueError(f"window_length must be a positive odd integer, got {window_length}")
    if polyorder < 0:
        raise ValueError(f"polyorder must be non-negative, got {polyorder}")
    if polyorder >= window_length:
        raise ValueError(
            f"polyorder ({polyorder}) must be less than window_length ({window_length})"
        )
    if deriv < 0:
        raise ValueError(f"deriv must be non-negative, got {deriv}")
    if delta <= 0:
        raise ValueError(f"delta must be positive, got {delta}")

    intensities = ensure_float64(intensities)
    validate_1d_or_2d(intensities)
    warn_if_not_finite(intensities)

    return apply_along_spectra(
        _derivative_savgol_1d,
        intensities,
        window_length=window_length,
        polyorder=polyorder,
        deriv=deriv,
        delta=delta,
    )

spectrakit.derivative.derivative_gap_segment

derivative_gap_segment(
    intensities: ndarray,
    gap: int = DEFAULT_GAP,
    segment: int = DEFAULT_SEGMENT,
    deriv: int = DEFAULT_DERIV,
) -> np.ndarray

Compute gap-segment derivative (Norris-Williams method).

Averages over segment points then takes differences separated by gap points. Commonly used for NIR pre-treatment.

Parameters:

Name Type Description Default
intensities ndarray

Spectral intensities, shape (W,) or (N, W).

required
gap int

Gap size (number of points between segments).

DEFAULT_GAP
segment int

Segment size (number of points to average).

DEFAULT_SEGMENT
deriv int

Derivative order. 1 = first derivative, 2 = second.

DEFAULT_DERIV

Returns:

Type Description
ndarray

Derivative spectrum, same shape as input (padded with zeros

ndarray

at edges where the computation is undefined).

Raises:

Type Description
SpectrumShapeError

If input is not 1-D or 2-D.

EmptySpectrumError

If input has zero elements.

ValueError

If deriv is not 1 or 2.

Source code in src/spectrakit/derivative/gap_segment.py
def derivative_gap_segment(
    intensities: np.ndarray,
    gap: int = DEFAULT_GAP,
    segment: int = DEFAULT_SEGMENT,
    deriv: int = DEFAULT_DERIV,
) -> np.ndarray:
    """Compute gap-segment derivative (Norris-Williams method).

    Averages over ``segment`` points then takes differences separated
    by ``gap`` points. Commonly used for NIR pre-treatment.

    Args:
        intensities: Spectral intensities, shape ``(W,)`` or ``(N, W)``.
        gap: Gap size (number of points between segments).
        segment: Segment size (number of points to average).
        deriv: Derivative order. 1 = first derivative, 2 = second.

    Returns:
        Derivative spectrum, same shape as input (padded with zeros
        at edges where the computation is undefined).

    Raises:
        SpectrumShapeError: If input is not 1-D or 2-D.
        EmptySpectrumError: If input has zero elements.
        ValueError: If ``deriv`` is not 1 or 2.
    """
    if deriv not in (1, 2):
        raise ValueError(f"deriv must be 1 or 2, got {deriv}")
    if gap < 1:
        raise ValueError(f"gap must be >= 1, got {gap}")
    if segment < 1:
        raise ValueError(f"segment must be >= 1, got {segment}")

    intensities = ensure_float64(intensities)
    validate_1d_or_2d(intensities)
    warn_if_not_finite(intensities)

    return apply_along_spectra(
        _derivative_gap_segment_1d,
        intensities,
        gap=gap,
        segment=segment,
        deriv=deriv,
    )