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`

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'])