docstr: For each asset, get the close on the start and end dates of the chunk.
      If the data exists, the chunk ingestion is complete.
      If any data is missing we ingest the data.
  
  Parameters
  ----------
  assets: list[TradingPair]
      The assets is scope.
  start_dt: pd.Timestamp
      The chunk start date.
  end_dt: pd.Timestamp
      The chunk end date.
  data_frequency: str
  
  Returns
  -------
  list[TradingPair]
      The assets missing from the bundle
docstr_tok: ["For","each","asset",",","get","the","close","on","the","start","and","end","dates","of","the","chunk",".","If","the","data","exists",",","the","chunk","ingestion","is","complete",".","If","any","data","is","missing","we","ingest","the","data",".","Parameters","--","--","--","--","--","assets",":","list","[","TradingPair","]","The","assets","is","scope",".","start_dt",":","pd.Timestamp","The","chunk","start","date",".","end_dt",":","pd.Timestamp","The","chunk","end","date",".","data_frequency",":","str","Returns","--","--","--","-","list","[","TradingPair","]","The","assets","missing","from","the","bundle"]
code: def filter_existing_assets(
      self, assets, start_dt, end_dt, data_frequency
  ):
      """
      For each asset, get the close on the start and end dates of the chunk.
          If the data exists, the chunk ingestion is complete.
          If any data is missing we ingest the data.
  
      Parameters
      ----------
      assets: list[TradingPair]
          The assets is scope.
      start_dt: pd.Timestamp
          The chunk start date.
      end_dt: pd.Timestamp
          The chunk end date.
      data_frequency: str
  
      Returns
      -------
      list[TradingPair]
          The assets missing from the bundle
      """
      reader = self.get_reader(data_frequency)
      missing_assets = []
      for asset in assets:
          has_data = range_in_bundle(asset, start_dt, end_dt, reader)
  
          if not has_data:
              missing_assets.append(asset)
  
      return missing_assets
  
imports: import os
  import shutil
  from datetime import timedelta
  from functools import partial
  from itertools import chain
  from operator import is_not
  import numpy
  import pandas
  import pytz
  from catalyst import get_calendar
  from catalyst.assets._assets import TradingPair
  from catalyst.constants import DATE_TIME_FORMAT, AUTO_INGEST
  from catalyst.constants import LOG_LEVEL
  from catalyst.data.minute_bars import BcolzMinuteOverlappingData, BcolzMinuteBarMetadata
  from catalyst.exchange.exchange_bcolz import BcolzExchangeBarReader, BcolzExchangeBarWriter
  from catalyst.exchange.exchange_errors import EmptyValuesInBundleError, TempBundleNotFoundError, NoDataAvailableOnExchange, PricingDataNotLoadedError, DataCorruptionError, PricingDataValueError
  from catalyst.exchange.utils.bundle_utils import range_in_bundle, get_bcolz_chunk, get_df_from_arrays, get_assets
  from catalyst.exchange.utils.datetime_utils import get_start_dt, get_period_label, get_month_start_end, get_year_start_end
  from catalyst.exchange.utils.exchange_utils import get_exchange_folder, save_exchange_symbols, mixin_market_params, get_catalyst_symbol
  from catalyst.utils.cli import maybe_show_progress
  from catalyst.utils.paths import ensure_directory
  from logbook import Logger
  from pytz import UTC
  from six import itervalues
label_desc: Use image node_id 5 for calling the ExchangeBundle obj's underlying member method code with example usage: obj.filter_existing_assets(assets, start_dt, end_dt, data_frequency) and returns: missing_assets