Esempio n. 1
0
    def _evaluate_factor(self, factor, spec, drop_rows):
        if factor.expr not in self.factor_cache:
            if factor.eval_method.value == 'lookup':
                value = self._lookup(factor.expr)
            elif factor.eval_method.value == 'python':
                value = self._evaluate(factor.expr, factor.metadata, spec)
            elif factor.eval_method.value == 'literal':
                value = EvaluatedFactor(factor,
                                        self._evaluate(factor.expr,
                                                       factor.metadata, spec),
                                        kind='constant')
            else:
                raise FactorEvaluationError(
                    f"Evaluation method {factor.eval_method.value} not recognised for factor {factor.expr}."
                )

            if not isinstance(value, EvaluatedFactor):
                if isinstance(value, dict) and '__kind__' in value:
                    kind = value['__kind__']
                    spans_intercept = value.get('__spans_intercept__', False)
                elif self._is_categorical(value):
                    kind = 'categorical'
                    spans_intercept = True
                else:
                    kind = 'numerical'
                    spans_intercept = False
                if factor.kind is not Factor.Kind.UNKNOWN and factor.kind.value != kind:
                    if factor.kind.value == 'categorical':
                        kind = factor.kind.value
                    else:
                        raise FactorEncodingError(
                            f"Factor is expecting to be of kind '{factor.kind.value}' but is actually of kind '{kind}'."
                        )
                if factor.expr in spec.encoder_state and Factor.Kind(
                        kind) is not spec.encoder_state[factor.expr][0]:
                    raise FactorEncodingError(
                        f"Factor kind `{kind}` does not match model specification of `{spec.encoder_state[factor.expr][0]}`."
                    )
                value = EvaluatedFactor(
                    factor=factor,
                    values=value,
                    kind=kind,
                    spans_intercept=spans_intercept,
                )
            self._check_for_nulls(factor.expr, value.values, spec.na_action,
                                  drop_rows)
            self.factor_cache[factor.expr] = value
        return self.factor_cache[factor.expr]
Esempio n. 2
0
 def kind(self, kind):
     if not kind or kind == 'unknown':
         raise ValueError(
             "`EvaluatedFactor` instances must have a known kind.")
     self._kind = Factor.Kind(kind)