docs: def get_data(source, fields='*', env=None, first_row=0, count=-1, schema=None):
    """ A utility function to get a subset of data from a Table, Query, Pandas dataframe or List.
  
    Args:
      source: the source of the data. Can be a Table, Pandas DataFrame, List of dictionaries or
          lists, or a string, in which case it is expected to be the name of a table in BQ.
      fields: a list of fields that we want to return as a list of strings, comma-separated string,
          or '*' for all.
      env: if the data source is a Query module, this is the set of variable overrides for
          parameterizing the Query.
      first_row: the index of the first row to return; default 0. Onl;y used if count is non-negative.
      count: the number or rows to return. If negative (the default), return all rows.
      schema: the schema of the data. Optional; if supplied this can be used to help do type-coercion.
  
    Returns:
      A tuple consisting of a dictionary and a count; the dictionary has two entries: 'cols'
      which is a list of column metadata entries for Google Charts, and 'rows' which is a list of
      lists of values. The count is the total number of rows in the source (independent of the
      first_row/count parameters).
  
    Raises:
      Exception if the request could not be fulfilled.
    """
  
    ipy = IPython.get_ipython()
    if env is None:
      env = {}
    env.update(ipy.user_ns)
    if isinstance(source, basestring):
      source = datalab.utils.get_item(ipy.user_ns, source, source)
      if isinstance(source, basestring):
        source = datalab.bigquery.Table(source)
  
    if isinstance(source, types.ModuleType) or isinstance(source, datalab.data.SqlStatement):
      source = datalab.bigquery.Query(source, values=env)
  
    if isinstance(source, list):
      if len(source) == 0:
        return _get_data_from_empty_list(source, fields, first_row, count, schema)
      elif isinstance(source[0], dict):
        return _get_data_from_list_of_dicts(source, fields, first_row, count, schema)
      elif isinstance(source[0], list):
        return _get_data_from_list_of_lists(source, fields, first_row, count, schema)
      else:
        raise Exception("To get tabular data from a list it must contain dictionaries or lists.")
    elif isinstance(source, pandas.DataFrame):
      return _get_data_from_dataframe(source, fields, first_row, count, schema)
    elif (isinstance(source, google.datalab.bigquery.Query) or
          isinstance(source, google.datalab.bigquery.Table)):
      return google.datalab.utils.commands._utils.get_data(
          source, fields, env, first_row, count, schema)
    elif isinstance(source, datalab.bigquery.Query):
      return _get_data_from_table(source.results(), fields, first_row, count, schema)
    elif isinstance(source, datalab.bigquery.Table):
      return _get_data_from_table(source, fields, first_row, count, schema)
    else:
      raise Exception("Cannot chart %s; unsupported object type" % source)