22from __future__
import annotations
24__all__ = (
"makeColumnExpressionAction", )
29from typing
import Mapping, MutableMapping, Set, Type, Union, Optional, Any, Iterable
31from numpy
import log10
as log
32from numpy
import (cos, sin, cosh, sinh)
35from ..configurableActions
import ConfigurableActionField
36from ._baseDataFrameActions
import DataFrameAction
39OPERATORS = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
40 ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
43EXTRA_MATH = {
"cos": cos,
"sin": sin,
"cosh": cosh,
"sinh": sinh,
"log": log}
64 val = self.visit(node.operand)
65 return OPERATORS[type(node.op)](val)
68 lhs = self.visit(node.left)
69 rhs = self.visit(node.right)
70 return OPERATORS[type(node.op)](lhs, rhs)
73 if node.func.id
in self.
variablesvariables:
74 function = self.visit(node.func)
75 return function(self.visit(node.args[0]))
77 raise ValueError(
"String not recognized")
80 raise ValueError(
"String not recognized")
84 exprDefaults: Optional[Mapping[str, Union[DataFrameAction,
85 Type[DataFrameAction]]]] =
None,
87 ) -> Type[DataFrameAction]:
88 node = ast.parse(expr, mode=
'eval')
91 names: Set[str] = set()
92 for elm
in ast.walk(node):
93 if isinstance(elm, ast.Name):
97 names -= EXTRA_MATH.keys()
99 fields: Mapping[str, ConfigurableActionField] = {}
101 if exprDefaults
is not None and (value := exprDefaults.get(name))
is not None:
102 kwargs = {
"default": value}
109 def __call__(self, df: pd.DataFrame, **kwargs) -> pd.Series:
112 values_map[name] = getattr(self, name)(df, **kwargs)
115 return parser.visit(node.body)
118 def columns(self) -> Iterable[str]:
120 yield from getattr(self, name).columns
122 dct: MutableMapping[str, Any] = {
"__call__": __call__,
"columns": property(columns)}
123 if docstring
is not None:
124 dct[
'__doc__'] = docstring
127 return type(className, (DataFrameAction, ), dct)
def visit_NameConstant(self, node)
def visit_UnaryOp(self, node)
def visit_Num(self, node)
def visit_Call(self, node)
def __init__(self, **kwargs)
def visit_BinOp(self, node)
def visit_Name(self, node)
def generic_visit(self, node)
Type[DataFrameAction] makeColumnExpressionAction(str className, str expr, Optional[Mapping[str, Union[DataFrameAction, Type[DataFrameAction]]]] exprDefaults=None, str docstring=None)