class_docstr: Given a UserResourceCfDataframeModel this class creates and returns
  a new normalized UserResourceCfDataframeModel which has an anomaly score
  with a mean of 0.0 and standard deviation of 1.0 when applied on the given dataframe
code: def transform(
      self,
      user_res_cf_df_model: _UserResourceFeatureVectorMapping,
  ) -> _UserResourceFeatureVectorMapping:
      likelihood_col_token = "__likelihood__"
  
      dot = _make_dot()
  
      tenant_col = user_res_cf_df_model.tenant_col
      user_col = user_res_cf_df_model.user_col
      user_vec_col = user_res_cf_df_model.user_vec_col
      res_col = user_res_cf_df_model.res_col
      res_vec_col = user_res_cf_df_model.res_vec_col
  
      fixed_df = (
          self.access_df.join(
              user_res_cf_df_model.user_feature_vector_mapping_df,
              [tenant_col, user_col],
          )
          .join(
              user_res_cf_df_model.res_feature_vector_mapping_df,
              [tenant_col, res_col],
          )
          .select(
              tenant_col,
              user_col,
              user_vec_col,
              res_col,
              res_vec_col,
              dot(f.col(user_vec_col), f.col(res_vec_col)).alias(
                  likelihood_col_token,
              ),
          )
      )
  
      scaler_model = scalers.StandardScalarScaler(
          likelihood_col_token,
          tenant_col,
          user_vec_col,
      ).fit(fixed_df)
  
      per_group_stats: DataFrame = scaler_model.per_group_stats
      assert isinstance(per_group_stats, DataFrame)
  
      append2user_bias = self._make_append_bias(
          user_col,
          res_col,
          user_col,
          user_col,
          self.rank,
      )
      append2res_bias = self._make_append_bias(
          user_col,
          res_col,
          res_col,
          user_col,
          self.rank,
      )
  
      fixed_user_mapping_df = (
          user_res_cf_df_model.user_feature_vector_mapping_df.join(
              per_group_stats,
              tenant_col,
          ).select(
              tenant_col,
              user_col,
              append2user_bias(
                  f.col(user_vec_col),
                  f.lit(-1.0)
                  * f.col(
                      scalers.StandardScalarScalerConfig.mean_token
                  ),
                  f.lit(-1.0)
                  / f.when(
                      f.col(
                          scalers.StandardScalarScalerConfig.std_token
                      )
                      != 0.0,
                      f.col(
                          scalers.StandardScalarScalerConfig.std_token
                      ),
                  ).otherwise(f.lit(1.0)),
              ).alias(user_vec_col),
          )
      )
  
      fixed_res_mapping_df = (
          user_res_cf_df_model.res_feature_vector_mapping_df.join(
              per_group_stats,
              tenant_col,
          ).select(
              tenant_col,
              res_col,
              append2res_bias(f.col(res_vec_col), f.lit(0)).alias(
                  res_vec_col
              ),
          )
      )
  
      return user_res_cf_df_model.replace_mappings(
          fixed_user_mapping_df,
          fixed_res_mapping_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 3 for calling the ModelNormalizeTransformer obj's underlying member method code with example usage: obj.transform(user_res_cf_df_model) and returns: user_res_cf_df_model