code: def fit(self, df_features) -> None:
      if (
          os.path.exists(self.feature_save_dir)
          and len(os.listdir(self.feature_save_dir)) != 0
      ):
          return
      os.makedirs(self.feature_save_dir)
      fetch_df = fetch_df_by_index(
          df_features,
          slice(self.fit_start_time, self.fit_end_time),
          level="datetime",
      )
      del df_features
      index = 0
      names = {}
      for name, dim in self.norm_groups.items():
          names[name] = slice(index, index + dim)
          index += dim
      for name, name_val in names.items():
          df_values = fetch_df.iloc(axis=1)[name_val].values
          if name.endswith("volume"):
              df_values = np.log1p(df_values)
          self.feature_mean = np.nanmean(df_values)
          np.save(
              self.feature_save_dir + name + "_mean.npy",
              self.feature_mean,
          )
          df_values = df_values - self.feature_mean
          self.feature_std = np.nanstd(np.absolute(df_values))
          np.save(
              self.feature_save_dir + name + "_std.npy",
              self.feature_std,
          )
          df_values = df_values / self.feature_std
          np.save(
              self.feature_save_dir + name + "_vmax.npy",
              np.nanmax(df_values),
          )
          np.save(
              self.feature_save_dir + name + "_vmin.npy",
              np.nanmin(df_values),
          )
      return
  
file_path: qlib/qlib/contrib/data/highfreq_processor.py
imports: import os
  import numpy
  import pandas
  from qlib.data.dataset.processor import Processor
  from qlib.data.dataset.utils import fetch_df_by_index
  from typing import Dict
label_desc: Use image node_id 2 for calling the HighFreqNorm obj's underlying member method code with example usage: obj.fit(df_features) without return types