class_docstr: An group of named tables with identical column definitions. Supports
  (almost) all the same operations as :class:`.Table`. When executed on a
  :class:`TableSet`, any operation that would have returned a new
  :class:`.Table` instead returns a new :class:`TableSet`. Any operation
  that would have returned a single value instead returns a dictionary of
  values.
  
  TableSet is implemented as a subclass of :class:`.MappedSequence`
  
  :param tables:
      A sequence :class:`Table` instances.
  :param keys:
      A sequence of keys corresponding to the tables. These may be any type
      except :class:`int`.
  :param key_name:
      A name that describes the grouping properties. Used as the column
      header when the groups are aggregated. Defaults to the column name that
      was grouped on.
  :param key_type:
      An instance some subclass of :class:`.DataType`. If not provided it
      will default to a :class`.Text`.
  :param _is_fork:
      Used internally to skip certain validation steps when data
      is propagated from an existing tablset.
class_docstr_tok: ["An","group","of","named","tables","with","identical","column","definitions",".","Supports","(","almost",")","all","the","same","operations","as",":","class",":","`",".Table","`",".","When","executed","on","a",":","class",":","`","TableSet","`",",","any","operation","that","would","have","returned","a","new",":","class",":","`",".Table","`","instead","returns","a","new",":","class",":","`","TableSet","`",".","Any","operation","that","would","have","returned","a","single","value","instead","returns","a","dictionary","of","values",".","TableSet","is","implemented","as","a","subclass","of",":","class",":","`",".MappedSequence","`",":","param","tables",":","A","sequence",":","class",":","`","Table","`","instances",".",":","param","keys",":","A","sequence","of","keys","corresponding","to","the","tables",".","These","may","be","any","type","except",":","class",":","`","int","`",".",":","param","key_name",":","A","name","that","describes","the","grouping","properties",".","Used","as","the","column","header","when","the","groups","are","aggregated",".","Defaults","to","the","column","name","that","was","grouped","on",".",":","param","key_type",":","An","instance","some","subclass","of",":","class",":","`",".DataType","`",".","If","not","provided","it","will","default","to","a",":","class","`",".Text","`",".",":","param","_is_fork",":","Used","internally","to","skip","certain","validation","steps","when","data","is","propagated","from","an","existing","tablset","."]
docstr: Print the tableset's structure via :meth:`TableSet.print_structure`.
docstr_tok: ["Print","the","tableset","'s","structure","via",":","meth",":","`","TableSet.print_structure","`","."]
code: def __str__(self):
      """
      Print the tableset's structure via :meth:`TableSet.print_structure`.
      """
      structure = StringIO()
  
      self.print_structure(output=structure)
  
      return structure.getvalue()
  
imports: from io import StringIO
  from itertools import zip_longest
  from agate.data_types import Text
  from agate.mapped_sequence import MappedSequence
  from agate.tableset.aggregate import aggregate
  from agate.tableset.bar_chart import bar_chart
  from agate.tableset.column_chart import column_chart
  from agate.tableset.from_csv import from_csv
  from agate.tableset.from_json import from_json
  from agate.tableset.having import having
  from agate.tableset.line_chart import line_chart
  from agate.tableset.merge import merge
  from agate.tableset.print_structure import print_structure
  from agate.tableset.proxy_methods import bins, compute, denormalize, distinct, exclude, find, group_by, homogenize, join, limit, normalize, order_by, pivot, select, where
  from agate.tableset.scatterplot import scatterplot
  from agate.tableset.to_csv import to_csv
  from agate.tableset.to_json import to_json
label_desc: Use image node_id 2 for calling the TableSet obj's underlying member method code with example usage: obj.__str__() and returns: structure