code: def validate(self, grid):
          
          grid_name = str(grid.GetName())
          dmodel = self.contribution.dmodel
          reqd_headers = dmodel.get_reqd_headers(grid_name)
          df = self.contribution.tables[grid_name].df
          df = df.replace('', np.nan) # python does not view empty strings as null
          if df.empty:
              return {}
          col_names = set(df.columns)
          missing_headers = set(reqd_headers) - col_names
          present_headers = set(reqd_headers) - set(missing_headers)
          non_null_headers = df.dropna(how='all', axis='columns').columns
          null_reqd_headers = present_headers - set(non_null_headers)
          if any(missing_headers) or any (null_reqd_headers):
              warnings = {'missing required column(s)': sorted(missing_headers),
                          'no data in required column(s)': sorted(null_reqd_headers)}
          else:
              warnings = {}
          return warnings
docs: Using the MagIC data model, generate validation errors on a MagicGrid.
  
          Parameters
          ----------
          grid : dialogs.magic_grid3.MagicGrid
                 The MagicGrid to be validated
  
          Returns
          ---------
          warnings: dict
                    Empty dict if no warnings, otherwise a dict with format {name of problem: [problem_columns]}