Skip to content
Snippets Groups Projects
Commit 8781fec9 authored by Bert Palm's avatar Bert Palm 🎇
Browse files

fixed flagtools.py, added missing docstrings

parent 7fa14a13
No related branches found
No related tags found
4 merge requests!271Static expansion of regular expressions,!260Follow-Up Translations,!237Flagger Translations,!232WIP: Fuzzy testing
......@@ -11,64 +11,76 @@ from saqc.common import *
from saqc.lib.types import *
from saqc.core.register import register
from saqc.flagger import Flagger
import warnings
@register(masking='field', module="flagtools")
def clearFlags(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs) -> Tuple[DictOfSeries, Flagger]:
flagger = flagger.clearFlags(field, **kwargs)
return data, flagger
@register(masking='field', module="flagtools")
def forceFlags(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: Any, **kwargs) -> Tuple[DictOfSeries, Flagger]:
flagger = flagger.clearFlags(field).setFlags(field, flag=flag, inplace=True, **kwargs)
return data, flagger
@register(masking='field', module="flagtools")
def flagDummy(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs) -> Tuple[DictOfSeries, Flagger]:
def forceFlags(
data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: float, **kwargs
) -> Tuple[DictOfSeries, Flagger]:
"""
Function does nothing but returning data and flagger.
Set whole column to a flag value.
Parameters
----------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
data : DictOfSeries
data container
field : str
The fieldname of the column, holding the data-to-be-flagged.
flagger : saqc.flagger.Flagger
A flagger object, holding flags and additional informations related to `data`.
columns name that holds the data
flagger : Flagger
flagger object
flag : float
flag to set
kwargs : dict
unused
Returns
-------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
flagger : saqc.flagger.Flagger
The flagger object, holding flags and additional Informations related to `data`.
data : DictOfSeries
flagger : Flagger
See Also
--------
clearFlags : set whole column to UNFLAGGED
flagUnflagged : set flag value at all unflagged positions
"""
flagger[:, field] = flag
return data, flagger
@register(masking='field', module="flagtools")
def flagForceFail(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs):
# masking='none' is sufficient because call is redirected
@register(masking='none', module="flagtools")
def clearFlags(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs) -> Tuple[DictOfSeries, Flagger]:
"""
Function raises a runtime error.
Set whole column to UNFLAGGED.
Parameters
----------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
data : DictOfSeries
data container
field : str
The fieldname of the column, holding the data-to-be-flagged.
flagger : saqc.flagger.Flagger
A flagger object, holding flags and additional informations related to `data`.
columns name that holds the data
flagger : Flagger
flagger object
kwargs : dict
unused
Returns
-------
data, flagger: DictOfSeries, Flagger
See Also
--------
forceFlags : set whole column to a flag value
flagUnflagged : set flag value at all unflagged positions
"""
raise RuntimeError("Works as expected :D")
return forceFlags(data, field, flagger, flag=UNFLAGGED, **kwargs)
@register(masking='field', module="flagtools")
def flagUnflagged(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: Optional[Any]=None, **kwargs) -> Tuple[DictOfSeries, Flagger]:
def flagUnflagged(
data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: float, **kwargs
) -> Tuple[DictOfSeries, Flagger]:
"""
Function sets the GOOD flag to all values flagged better then GOOD.
If there is an entry 'flag' in the kwargs dictionary passed, the
......@@ -82,9 +94,10 @@ def flagUnflagged(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag:
The fieldname of the column, holding the data-to-be-flagged.
flagger : saqc.flagger.Flagger
A flagger object, holding flags and additional informations related to `data`.
flag : float
flag value to set, has NO default
kwargs : Dict
If kwargs contains 'flag' entry, kwargs['flag] is set, if no entry 'flag' is present,
'UNFLAGGED' is set.
unused
Returns
-------
......@@ -92,15 +105,19 @@ def flagUnflagged(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag:
A dictionary of pandas.Series, holding all the data.
flagger : saqc.flagger.Flagger
The flagger object, holding flags and additional Informations related to `data`.
"""
flag = GOOD if flag is None else flag
flagger = flagger.setFlags(field, flag=flag, **kwargs)
See Also
--------
clearFlags : set whole column to UNFLAGGED
forceFlags : set whole column to a flag value
"""
unflagged = flagger[field].isna() | (flagger[field] == UNFLAGGED)
flagger[unflagged, field] = flag
return data, flagger
@register(masking='field', module="flagtools")
def flagGood(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: Optional[Any]=None, **kwargs) -> Tuple[DictOfSeries, Flagger]:
def flagGood(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs) -> Tuple[DictOfSeries, Flagger]:
"""
Function sets the GOOD flag to all values flagged better then GOOD.
......@@ -119,9 +136,9 @@ def flagGood(data: DictOfSeries, field: ColumnName, flagger: Flagger, flag: Opti
A dictionary of pandas.Series, holding all the data.
flagger : saqc.flagger.Flagger
The flagger object, holding flags and additional Informations related to `data`.
"""
return flagUnflagged(data, field, flagger, flag=flag, **kwargs)
warnings.warn("'flagGood' is deprecated and does nothing, use 'flagUnflagged' instead", DeprecationWarning)
return data, flagger
@register(masking='field', module="flagtools")
......@@ -165,7 +182,8 @@ def flagManual(
Returns
-------
data, flagger: original data, modified flagger
data : original data
flagger : modified flagger
Examples
--------
......@@ -181,7 +199,7 @@ def flagManual(
Bear in mind that only exact timestamps apply, any offset will result in ignoring
the timestamp.
>>> _, fl = flagManual(data, field, flagger, mdata, mflag=1, method='ontime')
>>> fl.isFlagged(field)
>>> fl[field] > UNFLAGGED
2000-01-31 False
2000-02-01 True
2000-02-02 False
......@@ -194,7 +212,7 @@ def flagManual(
With the 'right-open' method, the mdata is forward fill:
>>> _, fl = flagManual(data, field, flagger, mdata, mflag=1, method='right-open')
>>> fl.isFlagged(field)
>>> fl[field] > UNFLAGGED
2000-01-31 False
2000-02-01 True
2000-02-02 True
......@@ -206,7 +224,7 @@ def flagManual(
With the 'left-open' method, backward filling is used:
>>> _, fl = flagManual(data, field, flagger, mdata, mflag=1, method='left-open')
>>> fl.isFlagged(field)
>>> fl[field] > UNFLAGGED
2000-01-31 False
2000-02-01 False
2000-02-02 True
......@@ -226,13 +244,19 @@ def flagManual(
raise ValueError("mdata has no index")
if method == "plain":
if hasindex:
mdata = mdata.to_numpy()
if len(mdata) != len(dat):
raise ValueError("mdata must have same length then data")
mdata = pd.Series(mdata, index=dat.index)
# reindex will do the job later
elif method == "ontime":
pass # reindex will do the job later
pass
elif method in ["left-open", "right-open"]:
mdata = mdata.reindex(dat.index.union(mdata.index))
......@@ -243,10 +267,59 @@ def flagManual(
# <--t0](<--t1](<-- (bfill)
if method == "left-open":
mdata = mdata.bfill()
else:
raise ValueError(method)
mask = mdata == mflag
mask = mask.reindex(dat.index).fillna(False)
flagger = flagger.setFlags(field=field, loc=mask, **kwargs)
flagger[mask, field] = kwargs['flag']
return data, flagger
@register(masking='none', module="flagtools")
def flagDummy(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs) -> Tuple[DictOfSeries, Flagger]:
"""
Function does nothing but returning data and flagger.
Parameters
----------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
field : str
The fieldname of the column, holding the data-to-be-flagged.
flagger : saqc.flagger.Flagger
A flagger object, holding flags and additional informations related to `data`.
Returns
-------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
flagger : saqc.flagger.Flagger
The flagger object, holding flags and additional Informations related to `data`.
"""
return data, flagger
@register(masking='none', module="flagtools")
def flagForceFail(data: DictOfSeries, field: ColumnName, flagger: Flagger, **kwargs):
"""
Function raises a runtime error.
Parameters
----------
data : dios.DictOfSeries
A dictionary of pandas.Series, holding all the data.
field : str
The fieldname of the column, holding the data-to-be-flagged.
flagger : saqc.flagger.Flagger
A flagger object, holding flags and additional informations related to `data`.
Raises
------
RuntimeError : always
"""
raise RuntimeError("Works as expected :D")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment