class_docstr: This is the AccessAnomaly, a pyspark.ml.Estimator which
  creates the AccessAnomalyModel which is a pyspark.ml.Transformer
code: def _enrich_and_normalize(self, indexed_df: DataFrame) -> DataFrame:
      tenant_col = self.tenant_col
      indexed_user_col = self.indexed_user_col
      indexed_res_col = self.indexed_res_col
      scaled_likelihood_col = self.scaled_likelihood_col
  
      if not self.apply_implicit_cf:
          complementset_factor = self.complementset_factor
          neg_score = self.neg_score
          assert (
              complementset_factor is not None and neg_score is not None
          )
  
          comp_df = (
              ComplementAccessTransformer(
                  tenant_col,
                  [indexed_user_col, indexed_res_col],
                  complementset_factor,
              )
              .transform(indexed_df)
              .withColumn(scaled_likelihood_col, f.lit(neg_score))
          )
      else:
          comp_df = None
  
      scaled_df = self._get_scaled_df(indexed_df).select(
          tenant_col,
          indexed_user_col,
          indexed_res_col,
          scaled_likelihood_col,
      )
  
      return (
          scaled_df.union(comp_df) if comp_df is not None else scaled_df
      )
  
imports: import os
  from typing import List, Optional, Tuple
  from synapse.ml.cyber.anomaly.complement_access import ComplementAccessTransformer
  from synapse.ml.cyber.feature import indexers, scalers
  from synapse.ml.cyber.utils import spark_utils
  import numpy
  from pyspark import SQLContext
  from pyspark.ml import Estimator, Transformer
  from pyspark.ml.param.shared import Param, Params
  from pyspark.ml.recommendation import ALS
  from pyspark.sql import DataFrame, functions, types
label_desc: Use image node_id 8 for calling the AccessAnomaly obj's underlying member method code with example usage: obj._enrich_and_normalize(indexed_df) and returns: unknown