Skip to content
Snippets Groups Projects
Commit efad181a authored by David Schäfer's avatar David Schäfer
Browse files

flag columns are now created if a variable is actually touched

parent f91ac835
No related branches found
No related tags found
No related merge requests found
......@@ -39,11 +39,12 @@ def flagNext(flagger: BaseFlagger, flags: pd.Series, n: int) -> pd.Series:
def runner(meta, flagger, data, flags=None, nodata=np.nan):
if flags is None:
# flags = pd.DataFrame(index=data.index)
flags = flagger.emptyFlags(data)
else:
if not all(flags.columns == flagger.emptyFlags(data.iloc[0]).columns):
raise TypeError("structure of given flag does not "
"correspond to flagger requirements")
# else:
# if not all(flags.columns == flagger.emptyFlags(data.iloc[0]).columns):
# raise TypeError("structure of given flag does not "
# "correspond to flagger requirements")
# NOTE:
# We need an index frequency in order to calculate ticks
......@@ -77,9 +78,14 @@ def runner(meta, flagger, data, flags=None, nodata=np.nan):
varname, start_date, end_date = configrow[fields]
func_name, flag_params = parseFlag(flag_test)
if flag_params.get(FlagParams.ASSIGN):
# NOTE:
# create a flag column if this is explicitly stated
# or if a variable is checked but no corresponding
# flag column exists
if (flag_params.get(FlagParams.ASSIGN) or
((varname in data) and (varname not in flags))):
dummy = pd.DataFrame(index=data.index, columns=[varname])
flags[varname] = flagger.emptyFlags(dummy)
flags = flags.join(flagger.initFlags(dummy))
if varname not in data:
continue
......@@ -104,18 +110,20 @@ def runner(meta, flagger, data, flags=None, nodata=np.nan):
raise NameError(
f"function name {func_name} is not definied (variable '{varname}, 'line: {idx + 1})")
# flag a timespan after the condition is met,
# duration given in 'flag_period'
flag_period = flag_params.pop(Params.FLAGPERIOD, None)
if flag_period:
flag_params[Params.FLAGVALUES] = _periodToTicks(flag_period, data.index.freq)
flag_params[Params.FLAGVALUES] = _periodToTicks(
flag_period, data.index.freq)
# flag a certain amount of values after condition is met,
# number given in 'flag_values'
flag_values = flag_params.pop(Params.FLAGVALUES, None)
if flag_values:
fchunk[varname] = flagNext(flagger, fchunk[varname], flag_values)
fchunk[varname] = flagNext(flagger,
fchunk[varname],
flag_values)
data.loc[start_date:end_date] = dchunk
flags.loc[start_date:end_date] = fchunk
......
......@@ -30,13 +30,16 @@ class BaseFlagger:
flags[:] = flag
return flags.values
def emptyFlags(self,
data: pd.DataFrame,
value: Optional[Number] = np.nan) -> pd.DataFrame:
def initFlags(self,
data: pd.DataFrame,
value: Optional[Number] = np.nan) -> pd.DataFrame:
out = data.copy()
out[:] = value
return out
def emptyFlags(self, data: pd.DataFrame) -> pd.DataFrame:
return pd.DataFrame(index=data.index)
def isFlagged(self, flags: ArrayLike, flag: T = None) -> ArrayLike:
if flag is None:
return (pd.notnull(flags) & (flags != self.no_flag))
......
......@@ -31,14 +31,27 @@ class DmpFlagger(BaseFlagger):
super().__init__(no_flag, flag)
self.flag_fields = [FlagFields.FLAG, FlagFields.CAUSE, FlagFields.COMMENT]
def emptyFlags(self, data, value="NIL", **kwargs):
def emptyFlags(self, data, **kwargs):
columns = pd.MultiIndex(
levels=[[], []],
labels=[[], []],
names=[ColumnLevels.VARIABLES, ColumnLevels.FLAGS])
return pd.DataFrame(index=data.index, columns=columns)
# def _getColumns(self, data):
# if isinstance(data, pd.DataFrame):
# return data.columns
# return [data.name]
def initFlags(self, data, value="NIL", **kwargs):
columns = data.columns if isinstance(data, pd.DataFrame) else [data.name]
columns = pd.MultiIndex.from_product(
[columns, self.flag_fields],
names=[ColumnLevels.VARIABLES, ColumnLevels.FLAGS])
return pd.DataFrame(data=value, columns=columns, index=data.index)
def setFlag(self, flags, flag=Flags.BAD, cause="NIL", comment="NIL", **kwargs):
def setFlag(self, flags, flag=Flags.BAD,
cause="NIL", comment="NIL", **kwargs):
self._isFlag(flag)
flags = self._reduceColumns(flags)
for field, f in zip(self.flag_fields, [flag, cause, comment]):
......
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