code: def test_ZScoreNorm(self):
      def normalize(df):
          mean_train = np.nanmean(df.values, axis=0)
          std_train = np.nanstd(df.values, axis=0)
          ignore = std_train == 0
          for _i, _con in enumerate(ignore):
              if _con:
                  std_train[_i] = 1
                  mean_train[_i] = 0
          df.loc(axis=1)[df.columns] = (
              df.values - mean_train
          ) / std_train
          return df
  
      origin_df = D.features(
          [self.TEST_INST], ["$high", "$open", "$low", "$close"]
      ).tail(10)
      origin_df["test"] = 0
      df = origin_df.copy()
      zsn = ZScoreNorm(
          fields_group=None,
          fit_start_time="2021-05-31",
          fit_end_time="2021-06-11",
      )
      zsn.fit(df)
      zsn.__call__(df)
      origin_df = normalize(origin_df)
      assert (df == origin_df).all().all()
  
file_path: qlib/tests/data_mid_layer_tests/test_processor.py
imports: import unittest
  import numpy
  from qlib.data import D
  from qlib.tests import TestAutoData
  from qlib.data.dataset.processor import MinMaxNorm, ZScoreNorm, CSZScoreNorm, CSZFillna
label_desc: Use image node_id 2 for calling the TestProcessor obj's underlying member method code with example usage: obj.test_ZScoreNorm() and returns: df