oxits 0.1.0

Time series classification and transformation library for Rust
Documentation
"""Generate golden test data for approximation module."""

import numpy as np
from pyts.approximation import (
    PiecewiseAggregateApproximation,
    SymbolicAggregateApproximation,
    DiscreteFourierTransform,
    MultipleCoefficientBinning,
    SymbolicFourierApproximation,
)


def generate():
    fixtures = []
    rng = np.random.RandomState(42)

    X = rng.randn(4, 16)

    # PAA (window_size=None required to use output_size in pyts)
    paa = PiecewiseAggregateApproximation(window_size=None, output_size=4)
    result = paa.transform(X)
    fixtures.append({
        "test_name": "paa_basic",
        "params": {"output_size": 4},
        "input": {"X": X.tolist()},
        "expected": {"output": result.tolist()},
        "tolerance": 1e-10,
    })

    # PAA with different output size
    paa = PiecewiseAggregateApproximation(window_size=None, output_size=8)
    result = paa.transform(X)
    fixtures.append({
        "test_name": "paa_8",
        "params": {"output_size": 8},
        "input": {"X": X.tolist()},
        "expected": {"output": result.tolist()},
        "tolerance": 1e-10,
    })

    # SAX — convert char output to numeric bin indices (a=0, b=1, ...)
    sax = SymbolicAggregateApproximation(n_bins=4, strategy="normal")
    result = sax.transform(X)
    result_numeric = [[ord(c) - ord('a') for c in row] for row in result.tolist()]
    fixtures.append({
        "test_name": "sax_basic",
        "params": {"n_bins": 4, "strategy": "normal"},
        "input": {"X": X.tolist()},
        "expected": {"output": result_numeric},
        "tolerance": 1e-10,
    })

    # DFT
    dft = DiscreteFourierTransform(n_coefs=6)
    dft.fit(X)
    result = dft.transform(X)
    fixtures.append({
        "test_name": "dft_basic",
        "params": {"n_coefs": 6},
        "input": {"X": X.tolist()},
        "expected": {"output": result.tolist()},
        "tolerance": 1e-8,
    })

    # DFT with norm_mean
    dft = DiscreteFourierTransform(n_coefs=6, norm_mean=True)
    dft.fit(X)
    result = dft.transform(X)
    fixtures.append({
        "test_name": "dft_norm_mean",
        "params": {"n_coefs": 6, "norm_mean": True},
        "input": {"X": X.tolist()},
        "expected": {"output": result.tolist()},
        "tolerance": 1e-8,
    })

    # MCB — convert char output to numeric bin indices
    mcb = MultipleCoefficientBinning(n_bins=4, strategy="quantile")
    result = mcb.fit_transform(X)
    result_numeric = [[ord(c) - ord('a') for c in row] for row in result.tolist()]
    fixtures.append({
        "test_name": "mcb_basic",
        "params": {"n_bins": 4, "strategy": "quantile"},
        "input": {"X": X.tolist()},
        "expected": {"output": result_numeric},
        "tolerance": 1e-10,
    })

    # SFA — convert char output to numeric bin indices
    sfa = SymbolicFourierApproximation(n_coefs=4, n_bins=4, strategy="quantile")
    result = sfa.fit_transform(X)
    result_numeric = [[ord(c) - ord('a') for c in row] for row in result.tolist()]
    fixtures.append({
        "test_name": "sfa_basic",
        "params": {"n_coefs": 4, "n_bins": 4, "strategy": "quantile"},
        "input": {"X": X.tolist()},
        "expected": {"output": result_numeric},
        "tolerance": 1e-8,
    })

    return fixtures