22 from __future__
import annotations
24 __all__ = (
"makeColumnExpressionAction", )
29 from typing
import Mapping, MutableMapping, Set, Type, Union, Optional, Any, Iterable
31 from numpy
import log10
as log
32 from numpy
import (cos, sin, cosh, sinh)
35 from ..configurableActions
import ConfigurableActionField
36 from ._baseDataFrameActions
import DataFrameAction
39 OPERATORS = {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,
43 EXTRA_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)