Skip to content
Snippets Groups Projects
test_modelling.py 3.35 KiB
Newer Older
#! /usr/bin/env python
# -*- coding: utf-8 -*-

Bert Palm's avatar
Bert Palm committed
# see test/functs/fixtures.py for global fixtures "course_..."
Bert Palm's avatar
Bert Palm committed
import dios
Bert Palm's avatar
Bert Palm committed
from saqc.flagger import initFlagsLike
from saqc.funcs.tools import mask
from saqc.funcs.residues import calculatePolynomialResidues, calculateRollingResidues
Bert Palm's avatar
Bert Palm committed
from tests.fixtures import *
Bert Palm's avatar
Bert Palm committed

David Schäfer's avatar
David Schäfer committed

@pytest.mark.parametrize("dat", [pytest.lazy_fixture("course_2")])
Bert Palm's avatar
Bert Palm committed
def test_modelling_polyFit_forRegular(dat):
David Schäfer's avatar
David Schäfer committed
    data, _ = dat(freq="10min", periods=30, initial_level=0, final_level=100, out_val=-100)
    # add some nice sine distortion
David Schäfer's avatar
David Schäfer committed
    data = data + 10 * np.sin(np.arange(0, len(data.indexes[0])))
    data = dios.DictOfSeries(data)
Bert Palm's avatar
Bert Palm committed
    flagger = initFlagsLike(data)
    result1, _ = calculatePolynomialResidues(data, "data", flagger, 11, 2, numba=False)
    result2, _ = calculatePolynomialResidues(data, "data", flagger, 11, 2, numba=True)
David Schäfer's avatar
David Schäfer committed
    assert (result1["data"] - result2["data"]).abs().max() < 10 ** -10
    result3, _ = calculatePolynomialResidues(data, "data", flagger, "110min", 2, numba=False)
David Schäfer's avatar
David Schäfer committed
    assert result3["data"].equals(result1["data"])
    result4, _ = calculatePolynomialResidues(data, "data", flagger, 11, 2, numba=True, min_periods=11)
David Schäfer's avatar
David Schäfer committed
    assert (result4["data"] - result2["data"]).abs().max() < 10 ** -10
    result5, _ = calculatePolynomialResidues(data, "data", flagger, 11, 2, numba=True, min_periods=9)
David Schäfer's avatar
David Schäfer committed
    assert result5["data"].iloc[10:19].isna().all()

@pytest.mark.parametrize("dat", [pytest.lazy_fixture("course_2")])
Bert Palm's avatar
Bert Palm committed
def test_modelling_rollingMean_forRegular(dat):
David Schäfer's avatar
David Schäfer committed
    data, _ = dat(freq="10min", periods=30, initial_level=0, final_level=100, out_val=-100)
    data = dios.DictOfSeries(data)
Bert Palm's avatar
Bert Palm committed
    flagger = initFlagsLike(data)
Bert Palm's avatar
Bert Palm committed
    calculateRollingResidues(data, "data", flagger, 5, func=np.mean, eval_flags=True, min_periods=0, center=True)
    calculateRollingResidues(data, "data", flagger, 5, func=np.mean, eval_flags=True, min_periods=0, center=False)

@pytest.mark.parametrize("dat", [pytest.lazy_fixture("course_1")])
Bert Palm's avatar
Bert Palm committed
def test_modelling_mask(dat):
    data, _ = dat()
    data = dios.DictOfSeries(data)
Bert Palm's avatar
Bert Palm committed
    flagger = initFlagsLike(data)
    data_seasonal, flagger_seasonal = mask(data, "data", flagger, mode='periodic', period_start="20:00",
                                           period_end="40:00", include_bounds=False)
Bert Palm's avatar
Bert Palm committed
    flaggs = flagger_seasonal["data"]
    assert flaggs[np.logical_and(20 <= flaggs.index.minute, 40 >= flaggs.index.minute)].isna().all()
    data_seasonal, flagger_seasonal = mask(data, "data", flagger, mode='periodic', period_start="15:00:00",
                                           period_end="02:00:00")
Bert Palm's avatar
Bert Palm committed
    flaggs = flagger_seasonal["data"]
    assert flaggs[np.logical_and(15 <= flaggs.index.hour, 2 >= flaggs.index.hour)].isna().all()
    data_seasonal, flagger_seasonal = mask(data, "data", flagger, mode='periodic', period_start="03T00:00:00",
                                           period_end="10T00:00:00")
Bert Palm's avatar
Bert Palm committed
    flaggs = flagger_seasonal["data"]
    assert flaggs[np.logical_and(3 <= flaggs.index.hour, 10 >= flaggs.index.hour)].isna().all()

    mask_ser = pd.Series(False, index=data["data"].index)
    mask_ser[::5] = True
    data["mask_ser"] = mask_ser
Bert Palm's avatar
Bert Palm committed
    flagger = initFlagsLike(data)
    data_masked, flagger_masked = mask(data, "data", flagger, mode='mask_var', mask_var="mask_ser")
Bert Palm's avatar
Bert Palm committed
    flaggs = flagger_masked["data"]
Bert Palm's avatar
Bert Palm committed
    assert flaggs[data_masked['mask_ser']].isna().all()