docstr: Public API method that returns a scalar value representing the value
  of the desired asset's field at either the given dt.
  
  Parameters
  ----------
  assets : Asset, ContinuousFuture, or iterable of same.
      The asset or assets whose data is desired.
  field : {'open', 'high', 'low', 'close', 'volume',
           'price', 'last_traded'}
      The desired field of the asset.
  dt : pd.Timestamp
      The timestamp for the desired value.
  data_frequency : str
      The frequency of the data to query; i.e. whether the data is
      'daily' or 'minute' bars
  
  Returns
  -------
  value : float, int, or pd.Timestamp
      The spot value of ``field`` for ``asset`` The return type is based
      on the ``field`` requested. If the field is one of 'open', 'high',
      'low', 'close', or 'price', the value will be a float. If the
      ``field`` is 'volume' the value will be a int. If the ``field`` is
      'last_traded' the value will be a Timestamp.
  
  Bitfinex timeframes
  -------------------
  Available values: '1m', '5m', '15m', '30m', '1h', '3h', '6h', '12h',
   '1D', '7D', '14D', '1M'
docstr_tok: ["Public","API","method","that","returns","a","scalar","value","representing","the","value","of","the","desired","asset","'s","field","at","either","the","given","dt",".","Parameters","--","--","--","--","--","assets",":","Asset",",","ContinuousFuture",",","or","iterable","of","same",".","The","asset","or","assets","whose","data","is","desired",".","field",":","{","'open","'",",","'high","'",",","'low","'",",","'close","'",",","'volume","'",",","'price","'",",","'last_traded","'","}","The","desired","field","of","the","asset",".","dt",":","pd.Timestamp","The","timestamp","for","the","desired","value",".","data_frequency",":","str","The","frequency","of","the","data","to","query",";","i.e",".","whether","the","data","is","'daily","'","or","'minute","'","bars","Returns","--","--","--","-","value",":","float",",","int",",","or","pd.Timestamp","The","spot","value","of","``","field","``","for","``","asset","``","The","return","type","is","based","on","the","``","field","``","requested",".","If","the","field","is","one","of","'open","'",",","'high","'",",","'low","'",",","'close","'",",","or","'price","'",",","the","value","will","be","a","float",".","If","the","``","field","``","is","'volume","'","the","value","will","be","a","int",".","If","the","``","field","``","is","'last_traded","'","the","value","will","be","a","Timestamp",".","Bitfinex","timeframes","--","--","--","--","--","--","--","--","--","-","Available","values",":","'1m","'",",","'5m","'",",","'15m","'",",","'30m","'",",","'1h","'",",","'3h","'",",","'6h","'",",","'12h","'",",","'1D","'",",","'7D","'",",","'14D","'",",","'1M","'"]
code: def get_spot_value(
      self, assets, field, dt=None, data_frequency="minute"
  ):
      """
      Public API method that returns a scalar value representing the value
      of the desired asset's field at either the given dt.
  
      Parameters
      ----------
      assets : Asset, ContinuousFuture, or iterable of same.
          The asset or assets whose data is desired.
      field : {'open', 'high', 'low', 'close', 'volume',
               'price', 'last_traded'}
          The desired field of the asset.
      dt : pd.Timestamp
          The timestamp for the desired value.
      data_frequency : str
          The frequency of the data to query; i.e. whether the data is
          'daily' or 'minute' bars
  
      Returns
      -------
      value : float, int, or pd.Timestamp
          The spot value of ``field`` for ``asset`` The return type is based
          on the ``field`` requested. If the field is one of 'open', 'high',
          'low', 'close', or 'price', the value will be a float. If the
          ``field`` is 'volume' the value will be a int. If the ``field`` is
          'last_traded' the value will be a Timestamp.
  
      Bitfinex timeframes
      -------------------
      Available values: '1m', '5m', '15m', '30m', '1h', '3h', '6h', '12h',
       '1D', '7D', '14D', '1M'
      """
      if field not in BASE_FIELDS:
          raise KeyError("Invalid column: {}".format(field))
  
      tickers = self.tickers(assets)
      if field == "close" or field == "price":
          return [tickers[asset]["last"] for asset in tickers]
  
      elif field == "volume":
          return [tickers[asset]["volume"] for asset in tickers]
  
      else:
          raise NoValueForField(field=field)
  
imports: import abc
  from abc import ABCMeta, abstractmethod, abstractproperty
  from datetime import timedelta
  from time import sleep
  import numpy
  import pandas
  from catalyst.constants import LOG_LEVEL
  from catalyst.data.data_portal import BASE_FIELDS
  from catalyst.exchange.exchange_bundle import ExchangeBundle
  from catalyst.exchange.exchange_errors import MismatchingQuoteCurrencies, SymbolNotFoundOnExchange, PricingDataNotLoadedError, NoDataAvailableOnExchange, NoValueForField, NoCandlesReceivedFromExchange, TickerNotFoundError, NotEnoughCashError
  from catalyst.exchange.utils.datetime_utils import get_delta, get_periods_range, get_periods, get_start_dt, get_frequency, get_candles_number_from_minutes
  from catalyst.exchange.utils.exchange_utils import get_exchange_symbols, resample_history_df, has_bundle, get_candles_df
  from logbook import Logger
label_desc: Use image node_id 14 for calling the Exchange obj's underlying member method code with example usage: obj.get_spot_value(assets, field, dt, data_frequency) and returns: unknown, unknown