docs: def deserialize(self, data, columns=None):
          """
          Deserializes SON to a DataFrame
  
          Parameters
          ----------
          data: SON data
          columns: None, or list of strings
              optionally you can deserialize a subset of the data in the SON. Index
              columns are ALWAYS deserialized, and should not be specified
  
          Returns
          -------
          pandas dataframe or series
          """
          if not data:
              return pd.DataFrame()
  
          meta = data[0][METADATA] if isinstance(data, list) else data[METADATA]
          index = INDEX in meta
  
          if columns:
              if index:
                  columns = columns[:]
                  columns.extend(meta[INDEX])
              if len(columns) > len(set(columns)):
                  raise Exception("Duplicate columns specified, cannot de-serialize")
  
          if not isinstance(data, list):
              df = self.converter.objify(data, columns)
          else:
              df = pd.concat([self.converter.objify(d, columns) for d in data], ignore_index=not index)
  
          if index:
              df = df.set_index(meta[INDEX])
          if meta[TYPE] == 'series':
              return df[df.columns[0]]
          return df