docstr: Compute the expected data (without adjustments) for the given
  window, k, and closes array.
  
  This uses talib.BBANDS to generate the expected data.
docstr_tok: ["Compute","the","expected","data","(","without","adjustments",")","for","the","given","window",",","k",",","and","closes","array",".","This","uses","talib.BBANDS","to","generate","the","expected","data","."]
code: def expected_bbands(self, window_length, k, closes):
      """Compute the expected data (without adjustments) for the given
      window, k, and closes array.
  
      This uses talib.BBANDS to generate the expected data.
      """
      lower_cols = []
      middle_cols = []
      upper_cols = []
  
      ndates, nassets = closes.shape
  
      for n in range(nassets):
          close_col = closes[:, n]
          if np.isnan(close_col).all():
              # ta-lib doesn't deal well with all nans.
              upper, middle, lower = [np.full(ndates, np.nan)] * 3
          else:
              upper, middle, lower = talib.BBANDS(
                  close_col,
                  window_length,
                  k,
                  k,
              )
  
          upper_cols.append(upper)
          middle_cols.append(middle)
          lower_cols.append(lower)
  
      # Stack all of our uppers, middles, lowers into three 2d arrays
      # whose columns are the sids. After that, slice off only the
      # rows we care about.
      where = np.s_[window_length - 1 :]
      uppers = np.column_stack(upper_cols)[where]
      middles = np.column_stack(middle_cols)[where]
      lowers = np.column_stack(lower_cols)[where]
      return uppers, middles, lowers
  
imports: from __future__ import division
  from nose_parameterized import parameterized
  from six.moves import range
  import numpy
  import pandas
  import talib
  from numpy.random import RandomState
  from zipline.lib.adjusted_array import AdjustedArray
  from zipline.pipeline.data import USEquityPricing
  from zipline.pipeline.factors import BollingerBands, Aroon, FastStochasticOscillator, IchimokuKinkoHyo, LinearWeightedMovingAverage, RateOfChangePercentage, TrueRange, MovingAverageConvergenceDivergenceSignal, AnnualizedVolatility, RSI
  from zipline.testing import check_allclose, parameter_space
  from zipline.testing.fixtures import ZiplineTestCase
  from zipline.testing.predicates import assert_equal
  from .base import BaseUSEquityPipelineTestCase
label_desc: Use image node_id 2 for calling the BollingerBandsTestCase obj's underlying member method code with example usage: obj.expected_bbands(window_length, k, closes) and returns: uppers,  middles,  lowers