code: def fit(self, ctx: Context, train_data, validate_data=None):
      header = train_data.schema.columns.to_list()
      if self._header is None:
          self._header = header
          self._prev_selected_mask = pd.Series(
              np.ones(len(header)), dtype=bool, index=header
          )
  
      filter_out_col = self.param.get("filter_out_col", None)
      keep_col = self.param.get("keep_col", None)
      if filter_out_col is None:
          filter_out_col = []
      if keep_col is None:
          keep_col = []
      if len(filter_out_col) >= len(header):
          raise ValueError("`filter_out_col` should not be all columns")
      filter_out_col = set(filter_out_col)
      # keep_col = set(keep_col)
      missing_col = (filter_out_col.union(set(keep_col))).difference(
          set(self._prev_selected_mask.index)
      )
      if missing_col:
          raise ValueError(
              f"columns {missing_col} given in `filter_out_col` & `keep_col` "
              f"not found in `select_col` or header"
          )
      filter_out_mask = pd.Series(
          [
              False if col in filter_out_col else True
              for col in self._header
          ],
          index=self._header,
      )
      # keep_mask = [True if col in keep_col else False for col in self._header]
      selected_mask = self._prev_selected_mask & filter_out_mask
      selected_mask.loc[keep_col] = True
      self._selected_mask = selected_mask
      if self.keep_one:
          StandardSelection._keep_one(self._selected_mask, self._header)
  
imports: import copy
  import logging
  import math
  import random
  import numpy
  import pandas
  from fate.arch import Context
  from ..abc.module import HeteroModule, Module
label_desc: Use image node_id 5 for calling the ManualSelection obj's underlying member method code with example usage: obj.fit(ctx, train_data, validate_data) without return types