class_docstr: A portfolio of wallets on exchanges.
  
  Parameters
  ----------
  base_instrument : `Instrument`
      The exchange instrument used to measure value and performance statistics.
  wallets : `List[WalletType]`
      The wallets to be used in the portfolio.
  order_listener : `OrderListener`
      The order listener to set for all orders executed by this portfolio.
  performance_listener : `Callable[[OrderedDict], None]`
      The performance listener to send all portfolio updates to.
class_docstr_tok: ["A","portfolio","of","wallets","on","exchanges",".","Parameters","--","--","--","--","--","base_instrument",":","`","Instrument","`","The","exchange","instrument","used","to","measure","value","and","performance","statistics",".","wallets",":","`","List","[","WalletType","]","`","The","wallets","to","be","used","in","the","portfolio",".","order_listener",":","`","OrderListener","`","The","order","listener","to","set","for","all","orders","executed","by","this","portfolio",".","performance_listener",":","`","Callable","[","[","OrderedDict","]",",","None","]","`","The","performance","listener","to","send","all","portfolio","updates","to","."]
docstr: Updates the performance metrics.
  
  Parameters
  ----------
  data : dict
      The data produced from the observer feed that is used to
      update the performance metrics.
docstr_tok: ["Updates","the","performance","metrics",".","Parameters","--","--","--","--","--","data",":","dict","The","data","produced","from","the","observer","feed","that","is","used","to","update","the","performance","metrics","."]
code: def on_next(self, data: dict) -> None:
      """Updates the performance metrics.
  
      Parameters
      ----------
      data : dict
          The data produced from the observer feed that is used to
          update the performance metrics.
      """
      data = data["internal"]
  
      if not self._keys:
          self._keys = self._find_keys(data)
  
      index = self.clock.step
      performance_data = {k: data[k] for k in self._keys}
      performance_data["base_symbol"] = self.base_instrument.symbol
      performance_step = OrderedDict()
      performance_step[index] = performance_data
  
      net_worth = data["net_worth"]
  
      if self._performance is None:
          self._performance = performance_step
          self._initial_net_worth = net_worth
          self._net_worth = net_worth
      else:
          self._performance.update(performance_step)
          self._net_worth = net_worth
  
      if self.performance_listener:
          self.performance_listener(performance_step)
  
imports: import re
  from typing import Callable, Tuple, List, TypeVar
  from tensortrade.core import Component, TimedIdentifiable
  from tensortrade.oms.exchanges import Exchange
  from tensortrade.oms.orders import OrderListener
  from tensortrade.oms.instruments import Instrument, Quantity, ExchangePair
  from tensortrade.oms.wallets.wallet import Wallet
  from tensortrade.oms.wallets.ledger import Ledger
  from collections import OrderedDict
label_desc: Use image node_id 23 for calling the Portfolio obj's underlying member method code with example usage: obj.on_next(data) without return types