code: def cv(params, dtrain, num_boost_round=10, nfold=3, metrics=(),
         obj=None, feval=None, fpreproc=None, as_pandas=True,
         show_progress=None, show_stdv=True, seed=0):
      # pylint: disable = invalid-name
      
      results = []
      cvfolds = mknfold(dtrain, nfold, params, seed, metrics, fpreproc)
      for i in range(num_boost_round):
          for fold in cvfolds:
              fold.update(i, obj)
          res = aggcv([f.eval(i, feval) for f in cvfolds],
                      show_stdv=show_stdv, show_progress=show_progress,
                      as_pandas=as_pandas)
          results.append(res)
  
      if as_pandas:
          try:
              import pandas as pd
              results = pd.DataFrame(results)
          except ImportError:
              results = np.array(results)
      else:
          results = np.array(results)
  
      return results
docs: Cross-validation with given paramaters.
  
      Parameters
      ----------
      params : dict
          Booster params.
      dtrain : DMatrix
          Data to be trained.
      num_boost_round : int
          Number of boosting iterations.
      nfold : int
          Number of folds in CV.
      metrics : list of strings
          Evaluation metrics to be watched in CV.
      obj : function
          Custom objective function.
      feval : function
          Custom evaluation function.
      fpreproc : function
          Preprocessing function that takes (dtrain, dtest, param) and returns
          transformed versions of those.
      as_pandas : bool, default True
          Return pd.DataFrame when pandas is installed.
          If False or pandas is not installed, return np.ndarray
      show_progress : bool or None, default None
          Whether to display the progress. If None, progress will be displayed
          when np.ndarray is returned.
      show_stdv : bool, default True
          Whether to display the standard deviation in progress.
          Results are not affected, and always contains std.
      seed : int
          Seed used to generate the folds (passed to numpy.random.seed).
  
      Returns
      -------
      evaluation history : list(string)