Source code for snowdrop.src.preprocessor.eval_formula
from snowdrop.src.preprocessor.symbolic import stringify, parse_string, list_variables, stringify_symbol
from snowdrop.src.preprocessor.codegen import to_source
from snowdrop.src.preprocessor.misc import CalibrationDict
from snowdrop.src.preprocessor.util import IfThen, IfThenElse, Positive, Negative
from numpy import log, exp
[docs]
def eval_formula(expr: str, dataframe=None, context=None):
"""
Evaluate expression.
Args:
expr: string
Symbolic expression to evaluate.
Example: `k(1)-delta*k(0)-i`
table: (optional) pandas dataframe
Each column is a time series, which can be indexeds.
context: dict or CalibrationDict
Context
"""
print("Evaluating: {}".format(expr))
if context is None:
dd = {} # context dictionary
elif isinstance(context, CalibrationDict):
dd = context.flat.copy()
else:
dd = context.copy()
# compat since normalize form for parameters doesn't match calib dict.
for k in [*dd.keys()]:
dd[stringify_symbol(k)] = dd[k]
expr_ast = parse_string(expr).value
variables = list_variables(expr_ast)
nexpr = stringify(expr_ast)
print(expr)
print(variables)
dd['log'] = log
dd['exp'] = exp
dd['IfThen'] = IfThen
dd['IfThenElse'] = IfThenElse
dd['Positive'] = Positive
dd['Negative'] = Negative
if dataframe is not None:
import pandas as pd
for (k, t) in variables:
dd[stringify_symbol((k, t))] = dataframe[k].shift(t)
dd['t'] = pd.Series(dataframe.index, index=dataframe.index)
expr = to_source(nexpr)
print(expr)
print(dd.keys())
res = eval(expr, dd)
return res