code: def parse_cache(self, full_df):
          
          data_model = {}
          levels = ['specimens', 'samples', 'sites', 'locations',
                    'ages', 'measurements', 'criteria', 'contribution',
                    'images']
          criteria_map = pd.DataFrame(full_df['criteria_map'])
          for level in levels:
              df = pd.DataFrame(full_df['tables'][level]['columns'])
              data_model[level] = df.transpose()
          # replace np.nan with None
          data_model[level] = data_model[level].where((pd.notnull(data_model[level])), None)
          return data_model, criteria_map
docs: Format the cached data model into a dictionary of DataFrames
          and a criteria map DataFrame.
  
          Parameters
          ----------
          full_df : DataFrame
              result of self.get_dm_offline()
  
          Returns
          ----------
          data_model : dictionary of DataFrames
          crit_map : DataFrame