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

bugfix:

- newly assigned variables are only written into the flags DataFrame
- if we used such a variable in a dsl function down the line, the lookup failed
parent 74eb0450
No related branches found
No related tags found
1 merge request!17Transformer bugfix
......@@ -15,10 +15,10 @@ from saqc.core.evaluator.checker import ConfigChecker
from saqc.core.evaluator.transformer import ConfigTransformer
def _dslIsFlagged(flagger, data, flag=None, comparator=None):
def _dslIsFlagged(flagger, field, flag=None, comparator=None):
if comparator is None:
return flagger.isFlagged(data.name, flag=flag)
return flagger.isFlagged(data.name, flag=flag, comparator=comparator)
return flagger.isFlagged(field, flag=flag)
return flagger.isFlagged(field, flag=flag, comparator=comparator)
def initLocalEnv(data: pd.DataFrame, field: str, flagger: BaseFlagger, nodata: float) -> Dict[str, Any]:
......@@ -26,7 +26,6 @@ def initLocalEnv(data: pd.DataFrame, field: str, flagger: BaseFlagger, nodata: f
return {
"data": data,
"field": field,
"this": field,
"flagger": flagger,
"NAN": np.nan,
"NODATA": nodata,
......@@ -42,7 +41,11 @@ def initLocalEnv(data: pd.DataFrame, field: str, flagger: BaseFlagger, nodata: f
"sum": np.nansum,
"std": np.nanstd,
"len": len,
"variables": set(data.columns.tolist() + flagger.getFlags().columns.tolist()),
# NOTE:
# the following pairs are only needed for the tree transformation
"nolookup": set(["isflagged"]), # no variable lookup for flagger based functions,
"variables": set(flagger.getFlags().columns.tolist()),
"this": field,
}
......
......@@ -2,17 +2,31 @@
# -*- coding: utf-8 -*-
import ast
from saqc.core.config import Params
from typing import Dict, Any
from contextlib import contextmanager
from saqc.core.config import Params
class DslTransformer(ast.NodeTransformer):
def __init__(self, environment: Dict[str, Any]):
self.environment = environment
self.arguments = set()
self.lookup = True
@contextmanager
def doLookup(self, value):
self.lookup = value
yield
self.lookup = True
def visit_Call(self, node):
return ast.Call(func=node.func, args=[self.visit(arg) for arg in node.args], keywords=[])
with self.doLookup(node.func.id not in self.environment["nolookup"]):
node = self.generic_visit(
ast.Call(func=node.func, args=node.args, keywords=[])
)
return node
def visit_Name(self, node):
name = node.id
......@@ -21,10 +35,13 @@ class DslTransformer(ast.NodeTransformer):
name = self.environment["field"]
if name in self.environment["variables"]:
value = ast.Constant(value=name)
node = ast.Subscript(
value=ast.Name(id="data", ctx=ast.Load()), slice=ast.Index(value=value), ctx=ast.Load(),
)
if self.lookup:
value = ast.Constant(value=name)
node = ast.Subscript(
value=ast.Name(id="data", ctx=ast.Load()), slice=ast.Index(value=value), ctx=ast.Load(),
)
else:
node = ast.Str(s=name)
self.arguments.add(name)
return node
......
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