code: def fit(self, ctx: Context, input_data: DataFrame):
      if len(ctx.hosts) > 1:
          raise ValueError(
              f"feature correlation only support one host, but {len(ctx.hosts)} hosts exist."
          )
      # standardize data
      ctx.mpc.init()
      if self.select_cols is None:
          self.select_cols = input_data.schema.columns
      to_compute_data = input_data[self.select_cols]
      data = to_compute_data.as_tensor()
      n = data.shape[0]
      num_features = data.shape[1]
      data_mean = torch.mean(data, dim=0)
      data_std = torch.std(data, dim=0)
      data = (data - data_mean) / data_std
      local_corr = torch.matmul(data.T, data) / (n - 1)
      # remainds_index = [i for i in range(data_std.shape[0]) if data_std[i] > 0]
      self.local_corr = pd.DataFrame(
          local_corr, columns=self.select_cols, index=self.select_cols
      )
  
      if self.calc_local_vif:
          logger.info(
              "calc_local_vif enabled, calculate vif for local features"
          )
          local_vif = self.vif_from_pearson_matrix(local_corr)
          # fixed_local_vif = self.fix_vif(local_vif, remainds_index, num_features)
          # self.vif = fixed_local_vif
          local_vif_list = [vif.item() for vif in local_vif]
          self.vif = pd.DataFrame(
              local_vif_list, columns=["vif"], index=self.select_cols
          )
      else:
          logger.info("calc_local_vif disabled, skip local vif")
  
      if not self.local_only:
          rank_a, rank_b = ctx.guest.rank, ctx.hosts[0].rank
          anonymous_header = [
              input_data.schema.anonymous_columns[
                  input_data.schema.columns.get_loc(col)
              ]
              for col in self.select_cols
          ]
          self.select_anonymous_cols = anonymous_header
          if ctx.is_on_guest:
              ctx.hosts.put("anonymous_header", anonymous_header)
              a_header = input_data.schema.columns
              b_header = ctx.hosts.get("anonymous_header")[0]
          else:
              ctx.guest.put("anonymous_header", anonymous_header)
              a_header = ctx.guest.get("anonymous_header")
              b_header = input_data.schema.columns
  
          with ctx.mpc.communicator.new_group(
              ranks=[rank_a, rank_b], name="pearson_correlation"
          ):
              x = ctx.mpc.lazy_encrypt(lambda: data.T, src=rank_a)
              y = ctx.mpc.lazy_encrypt(lambda: data, src=rank_b)
              remote_corr = x.matmul(y).get_plain_text() / (n - 1)
              self.remote_corr = pd.DataFrame(
                  remote_corr, columns=b_header, index=a_header
              )
  
file_path: FATE/python/fate/ml/statistics/pearson_correlation.py
imports: import logging
  import pandas
  import torch
  from fate.arch import Context
  from fate.arch.dataframe import DataFrame
  from ..abc.module import Module
label_desc: Use image node_id 2 for calling the PearsonCorrelation obj's underlying member method code with example usage: obj.fit(ctx, input_data) without return types