code: def option_chain(self, date=None, tz=None):
      if date is None:
          options = self._download_options()
      else:
          if not self._expirations:
              self._download_options()
          if date not in self._expirations:
              raise ValueError(
                  f"Expiration `{date}` cannot be found. "
                  f"Available expirations are: [{', '.join(self._expirations)}]"
              )
          date = self._expirations[date]
          options = self._download_options(date)
  
      return _namedtuple("Options", ["calls", "puts", "underlying"])(
          **{
              "calls": self._options2df(options["calls"], tz=tz),
              "puts": self._options2df(options["puts"], tz=tz),
              "underlying": options["underlying"],
          }
      )
  
imports: from __future__ import print_function
  import datetime
  from collections import namedtuple
  import pandas
  from .base import TickerBase
label_desc: Use image node_id 5 for calling the Ticker obj's underlying member method code with example usage: obj.option_chain(date, tz) and returns: _namedtuple