docs: def call(self, lowstrike, highstrike, expiry):
          """
          Metrics for evaluating a bull call spread.
          
          The metrics returned can easily be translated into bear
          spread metrics. The difference is only whether one buys
          the call at the lower strike and sells at the higher
          (bull call spread) or sells at the lower while buying
          at the higher (bear call spread). The metrics
          dataframe shows values for a bull call spread, where
          the transaction is a debit. A bear call spread
          is created by *selling* a bull call spread, so the transaction
          amount is the same, but it
          is a credit rather than a debit.
  
          Parameters
          ------------
          lowstrike : numeric
              Lower strike price.
          highstrike : numeric
              Higher strike sprice.
          expiry : date or date str (e.g. '2015-01-01')
              Expiration date.
  
          Returns
          ------------
          metrics : DataFrame
  
          Notes
          -----
          Cf. Lawrence McMillan, Options as a Strategic Investment, 5th ed., pp. 157ff.
  
          See Also
          --------
          :meth:`put`
          """
          assert lowstrike < highstrike
          _rows = {}
          _prices = {}
          _opttype = 'call'
          for _strike in (lowstrike, highstrike):
              _rows[_strike] = _relevant_rows(self.data, (_strike, expiry, _opttype,),
                      "No key for {} strike {} {}".format(expiry, _strike, _opttype))
              _prices[_strike] = _getprice(_rows[_strike])
          _eq = _rows[lowstrike].loc[:, 'Underlying_Price'].values[0]
          _qt = _rows[lowstrike].loc[:, 'Quote_Time'].values[0]
          _debit = _prices[lowstrike] - _prices[highstrike]
          _breakeven = lowstrike + _debit
          if _breakeven > highstrike:
              _breakeven = np.nan
          _maxprof = highstrike - lowstrike -_debit
          _index = ['Low Strike Call', 'High Strike Call', 'Debit',  'Break_Even',
                  'Max Profit', 'Underlying_Price', 'Quote_Time']
          _vals = np.array([_prices[lowstrike], _prices[highstrike], _debit,
                  _breakeven, _maxprof, _eq, _qt])
          return pd.DataFrame(_vals, index=_index, columns=['Value'])