code: def convert_type(df, columns):
      
      # taken in part from the dplython package
      out_df = df.copy()
      for col in columns:
          column_values = pd.Series(out_df[col].unique())
          column_values = column_values[~column_values.isnull()]
          # empty
          if len(column_values) == 0:
              continue
          # boolean
          if set(column_values.values) < {'True', 'False'}:
              out_df[col] = out_df[col].map({'True': True, 'False': False})
              continue
          # numeric
          if pd.to_numeric(column_values, errors='coerce').isnull().sum() == 0:
              out_df[col] = pd.to_numeric(out_df[col], errors='ignore')
              continue
          # datetime
          if pd.to_datetime(column_values, errors='coerce').isnull().sum() == 0:
              out_df[col] = pd.to_datetime(out_df[col], errors='ignore',
                                           infer_datetime_format=True)
              continue
  
      return out_df
docs: Helper function that attempts to convert columns into their appropriate
      data type.