Skip to content
Snippets Groups Projects
test_functions.py 2.37 KiB
Newer Older
Bert Palm's avatar
Bert Palm committed
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import pytest
import numpy as np
import pandas as pd

from saqc.flagger.baseflagger import BaseFlagger
from saqc.flagger.dmpflagger import DmpFlagger
from saqc.flagger.simpleflagger import SimpleFlagger

from saqc.funcs.functions import flagRange, flagSesonalRange, forceFlags, clearFlags

TESTFLAGGERS = [
    BaseFlagger(['NIL', 'GOOD', 'BAD']),
    DmpFlagger(),
    SimpleFlagger()]
David Schäfer's avatar
David Schäfer committed
from test.common import initData, TESTFLAGGER
Bert Palm's avatar
Bert Palm committed


David Schäfer's avatar
David Schäfer committed
@pytest.fixture
def data():
    return initData(cols=1, start_date="2016-01-01", end_date="2018-12-31", freq="1D")


@pytest.fixture
def field(data):
    return data.columns[0]

Bert Palm's avatar
Bert Palm committed
    flags = flagger.initFlags(data)
    # test
    data, flags = flagRange(data, flags, field, flagger, min=10, max=90)
    flagged = flagger.isFlagged(flags[field])
    assert len(flags[flagged]) == 10 + 10


@pytest.mark.parametrize('flagger', TESTFLAGGERS)
def test_flagSesonalRange(flagger):
    # prepare
    field = 'testdata'
    index = pd.date_range(start='2011-01-01', end='2014-12-31', freq='1d')
Bert Palm's avatar
Bert Palm committed
    d = [(x % 2) * 50 for x in range(index.size)]
    data = pd.DataFrame(data={field: d}, index=index)
Bert Palm's avatar
Bert Palm committed
    flags = flagger.initFlags(data)

    # test
Bert Palm's avatar
Bert Palm committed
    kwargs = dict(min=1, max=100, startmonth=7, startday=1, endmonth=8, endday=31)
    data, flags = flagSesonalRange(data, flags, field, flagger, **kwargs)
Bert Palm's avatar
Bert Palm committed
    flagged = flagger.isFlagged(flags[field])
Bert Palm's avatar
Bert Palm committed
    assert len(flags[flagged]) == (31 + 31) * 4 / 2
Bert Palm's avatar
Bert Palm committed

    flags = flagger.initFlags(data)
Bert Palm's avatar
Bert Palm committed
    kwargs = dict(min=1, max=100, startmonth=12, startday=16, endmonth=1, endday=15)
    _, flags = flagSesonalRange(data, flags, field, flagger, **kwargs)
Bert Palm's avatar
Bert Palm committed
    flagged = flagger.isFlagged(flags[field])
Bert Palm's avatar
Bert Palm committed
    assert len(flags[flagged]) == 31 * 4 / 2
Bert Palm's avatar
Bert Palm committed


@pytest.mark.parametrize('flagger', TESTFLAGGER)
def test_clearFlags(data, field, flagger):
    orig = flagger.initFlags(data)
    flags = flagger.setFlags(orig.copy(), field, flag=flagger.BAD)
    _, cleared = clearFlags(data, flags, field, flagger)
    assert np.all(orig != flags)
    assert np.all(orig == cleared)
David Schäfer's avatar
David Schäfer committed
@pytest.mark.parametrize('flagger', TESTFLAGGER)
def test_forceFlags(data, flagger):
    field, *_ = data.columns
    flags = flagger.setFlags(flagger.initFlags(data), field)
David Schäfer's avatar
David Schäfer committed
    _, forced = forceFlags(data, flags, field, flagger, flag=flagger.GOOD)
    assert np.all(flagger.getFlags(orig) != flagger.getFlags(forced))