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]
def kind(self, kind): if not kind or kind == 'unknown': raise ValueError( "`EvaluatedFactor` instances must have a known kind.") self._kind = Factor.Kind(kind)