code: def _hetero_split(self, df: DataFrame):
      if self._role == "guest":
          homo_splits = self._homo_split(df, return_indexer=True)
          for _, iter_ctx in self._ctx.sub_ctx("KFold").ctxs_range(
              self._n_splits
          ):
              (
                  train_frame,
                  test_frame,
                  train_indexer,
                  test_indexer,
              ) = next(homo_splits)
  
              iter_ctx.hosts.put(
                  "fold_indexes", (train_indexer, test_indexer)
              )
  
              yield train_frame, test_frame
      else:
          for _, iter_ctx in self._ctx.sub_ctx("KFold").ctxs_range(
              self._n_splits
          ):
              train_indexer, test_indexer = iter_ctx.guest.get(
                  "fold_indexes"
              )
              train_frame = df.loc(train_indexer, preserve_order=True)
              test_frame = df.loc(test_indexer, preserve_order=True)
  
              yield train_frame, test_frame
  
file_path: FATE/python/fate/arch/dataframe/utils/_k_fold.py
imports: from .._dataframe import DataFrame
  from sklearn.model_selection import KFold
label_desc: Use image node_id 3 for calling the KFold obj's underlying member method code with example usage: obj._hetero_split(df) without return types