code: def get_cv(self) -> BaseCrossValidator:
      if self.cv_type == CVType.time_series:
          return TimeSeriesSplit(n_splits=self.n_folds)
      elif self.cv_type == CVType.blocked_time_series:
          return BlockedTimeSeriesSplit(
              n_splits=self.n_folds, test_size=self.test_size
          )
      elif self.cv_type == CVType.group_k_fold and self.shuffle_kfold:
          return GroupShuffleSplit(
              n_splits=self.n_folds,
              test_size=self.test_size,
              random_state=self.random_state,
          )
      elif self.cv_type == CVType.group_k_fold:
          return GroupKFold(n_splits=self.n_folds)
      else:
          return KFold(
              n_splits=self.n_folds,
              shuffle=self.shuffle_kfold,
              random_state=self.random_state,
          )
  
file_path: upgini/src/upgini/utils/cv_utils.py
imports: from typing import Any, Dict, Optional, Union
  import pandas
  from sklearn.model_selection import BaseCrossValidator, KFold, TimeSeriesSplit, GroupKFold, GroupShuffleSplit
  from upgini.metadata import CVType
  from upgini.utils.blocked_time_series import BlockedTimeSeriesSplit
label_desc: Use image node_id 3 for calling the CVConfig obj's underlying member method code with example usage: obj.get_cv() and returns: TimeSeriesSplit, BlockedTimeSeriesSplit, GroupShuffleSplit, GroupKFold, KFold