code: def _fetch_symbol_iter(
      self,
      api_key,
      cache,
      symbol_map,
      calendar,
      start_session,
      end_session,
      data_frequency,
      retries,
  ):
      for asset_id, symbol in symbol_map.iteritems():
          # Record start time of iteration, compare at end of iteration to
          # adhere to the datas source's rate limit policy.
          start_time = pd.Timestamp.utcnow()
  
          # Fetch new data if cached data is absent or stale, otherwise
          # returns the cached data unaltered.  The `should_sleep` flag
          # indicates that an API call was attempted, and that we should be
          # ensure aren't exceeding our rate limit before proceeding to the
          # next symbol. If the raw_data is updated, it is cached before
          # being returned.
          raw_data, should_sleep = self._maybe_update_symbol_frame(
              start_time,
              api_key,
              cache,
              symbol,
              calendar,
              start_session,
              end_session,
              data_frequency,
              retries,
          )
  
          # TODO(cfromknecht) further data validation?
  
          # Pass asset_id and symbol data to writer.
          yield asset_id, raw_data
  
          # If an API call was made during this iteration and the time to
          # reach this point was less than the inter-request `wait_time`,
          # sleep until after enough time has elapsed to prevent getting rate
          # limited.
          if should_sleep:
              remaining = (
                  pd.Timestamp.utcnow() - start_time + self.wait_time
              )
              if remaining.value > 0:
                  sleep(remaining.value / 10**9)
  
imports: from itertools import count
  import tarfile
  from time import sleep
  from abc import abstractmethod, abstractproperty
  import logbook
  import pandas
  from .None import core
  from catalyst.utils.cli import item_show_count, maybe_show_progress
  from catalyst.utils.memoize import lazyval
  from catalyst.constants import LOG_LEVEL
label_desc: Use image node_id 24 for calling the BaseBundle obj's underlying member method code with example usage: obj._fetch_symbol_iter(api_key, cache, symbol_map, calendar, start_session, end_session, data_frequency, retries) without return types