code: def _check_dataframe(dv=None, between=None, within=None, subject=None,
                       effects=None, data=None):
      
      # Check that data is a dataframe
      if not isinstance(data, pd.DataFrame):
          raise ValueError('Data must be a pandas dataframe.')
      # Check that both dv and data are provided.
      if any(v is None for v in [dv, data]):
          raise ValueError('DV and data must be specified')
      # Check that dv is a numeric variable
      if data[dv].dtype.kind not in 'fi':
          raise ValueError('DV must be numeric.')
      # Check that effects is provided
      if effects not in ['within', 'between', 'interaction', 'all']:
          raise ValueError('Effects must be: within, between, interaction, all')
      # Check that within is a string or a list (rm_anova2)
      if effects == 'within' and not isinstance(within, (str, list)):
          raise ValueError('within must be a string or a list.')
      # Check that subject identifier is provided in rm_anova and friedman.
      if effects == 'within' and subject is None:
          raise ValueError('subject must be specified when effects=within')
      # Check that between is a string or a list (anova2)
      if effects == 'between' and not isinstance(between, (str,
                                                           list)):
          raise ValueError('between must be a string or a list.')
      # Check that both between and within are present for interaction
      if effects == 'interaction':
          for input in [within, between]:
              if not isinstance(input, (str, list)):
                  raise ValueError('within and between must be specified when '
                                   'effects=interaction')
docs: Check dataframe