import plpy import re class Formula(object): def __init__(self, y_str, x_str, coef_len): self.n_coef = coef_len self.y = y_str.replace('"','') self.x = self.parse(x_str) def parse(self, x_str): array_expr = re.compile(r'array[[](["a-z0-9_, .]+)[]]', flags=re.I) simple_col = re.compile(r'["a-z0-9_]+', flags=re.I) prefix = 'x' if array_expr.match(x_str) is not None: x_csv = array_expr.sub(r'\1', x_str) ret = [s.strip().replace('"','') for s in x_csv.split(',')] if len(ret) == self.n_coef: return ret else: pass # fall back to using 'x' elif simple_col.match(x_str) is not None: prefix = x_str.replace('"','') return ["{0}[{1}]".format(prefix, str(i+1)) for i in range(self.n_coef)] def rename(self, spec): if isinstance(spec, str): if spec.find('{') == 0: spec = spec.replace('{','').replace('}','') spec = [s.strip() for s in spec.split(',')] return self.rename(spec) if '~' in spec: (y, spec) = spec.split('~') y = y.strip() else: y = self.y if '+' in spec: x = [s.strip() for s in spec.split('+')] else: x = [s.strip() for s in spec.split(',')] if self.n_coef != len(x): plpy.warning("PMML warning: unexpected namespec '" + \ spec + "', using default names") else: self.y = y self.x = x else: if len(spec) == self.n_coef + 1: self.y = spec[0] self.x = spec[1:] elif len(spec) == self.n_coef: self.x = spec else: plpy.warning("PMML warning: unexpected namespec '" + \ str(spec) + "', using default names")