class_docstr: The IntradayObserver observer that is compatible with the other `default`
  components.
  Parameters
  ----------
  portfolio : `Portfolio`
      The portfolio to be used to create the internal data feed mechanism.
  feed : `DataFeed`
      The feed to be used to collect observations to the observation window.
  renderer_feed : `DataFeed`
      The feed to be used for giving information to the renderer.
  stop_time : datetime.time
      The time at which the episode will stop.
  window_size : int
      The size of the observation window.
  min_periods : int
      The amount of steps needed to warmup the `feed`.
  randomize : bool
      Whether or not to select a random episode when reset.
  **kwargs : keyword arguments
      Additional keyword arguments for observer creation.
  Attributes
  ----------
  feed : `DataFeed`
      The master feed in charge of streaming the internal, external, and
      renderer data feeds.
  stop_time : datetime.time
      The time at which the episode will stop.
  window_size : int
      The size of the observation window.
  min_periods : int
      The amount of steps needed to warmup the `feed`.
  randomize : bool
      Whether or not a random episode is selected when reset.
  history : `ObservationHistory`
      The observation history.
  renderer_history : `List[dict]`
      The history of the renderer data feed.
class_docstr_tok: ["The","IntradayObserver","observer","that","is","compatible","with","the","other","`","default","`","components",".","Parameters","--","--","--","--","--","portfolio",":","`","Portfolio","`","The","portfolio","to","be","used","to","create","the","internal","data","feed","mechanism",".","feed",":","`","DataFeed","`","The","feed","to","be","used","to","collect","observations","to","the","observation","window",".","renderer_feed",":","`","DataFeed","`","The","feed","to","be","used","for","giving","information","to","the","renderer",".","stop_time",":","datetime.time","The","time","at","which","the","episode","will","stop",".","window_size",":","int","The","size","of","the","observation","window",".","min_periods",":","int","The","amount","of","steps","needed","to","warmup","the","`","feed","`",".","randomize",":","bool","Whether","or","not","to","select","a","random","episode","when","reset",".","*","*","kwargs",":","keyword","arguments","Additional","keyword","arguments","for","observer","creation",".","Attributes","--","--","--","--","--","feed",":","`","DataFeed","`","The","master","feed","in","charge","of","streaming","the","internal",",","external",",","and","renderer","data","feeds",".","stop_time",":","datetime.time","The","time","at","which","the","episode","will","stop",".","window_size",":","int","The","size","of","the","observation","window",".","min_periods",":","int","The","amount","of","steps","needed","to","warmup","the","`","feed","`",".","randomize",":","bool","Whether","or","not","a","random","episode","is","selected","when","reset",".","history",":","`","ObservationHistory","`","The","observation","history",".","renderer_history",":","`","List","[","dict","]","`","The","history","of","the","renderer","data","feed","."]
code: def __init__(
      self,
      portfolio: "Portfolio",
      feed: "DataFeed" = None,
      renderer_feed: "DataFeed" = None,
      stop_time: "datetime.time" = dt.time(16, 0, 0),
      window_size: int = 1,
      min_periods: int = None,
      randomize: bool = False,
      **kwargs,
  ) -> None:
      internal_group = Stream.group(
          _create_internal_streams(portfolio)
      ).rename("internal")
      external_group = Stream.group(feed.inputs).rename("external")
  
      if renderer_feed:
          renderer_group = Stream.group(renderer_feed.inputs).rename(
              "renderer"
          )
  
          self.feed = DataFeed(
              [internal_group, external_group, renderer_group]
          )
      else:
          self.feed = DataFeed([internal_group, external_group])
  
      self.stop_time = stop_time
      self.window_size = window_size
      self.min_periods = min_periods
      self.randomize = randomize
  
      self._observation_dtype = kwargs.get("dtype", np.float32)
      self._observation_lows = kwargs.get("observation_lows", -np.inf)
      self._observation_highs = kwargs.get("observation_highs", np.inf)
  
      self.history = ObservationHistory(window_size=window_size)
  
      initial_obs = self.feed.next()["external"]
      initial_obs.pop("timestamp", None)
      n_features = len(initial_obs.keys())
  
      self._observation_space = Box(
          low=self._observation_lows,
          high=self._observation_highs,
          shape=(self.window_size, n_features),
          dtype=self._observation_dtype,
      )
  
      self.feed = self.feed.attach(portfolio)
  
      self.renderer_history = []
  
      if self.randomize:
          self.num_episodes = 0
          while self.feed.has_next():
              ts = self.feed.next()["external"]["timestamp"]
              if ts.time() == self.stop_time:
                  self.num_episodes += 1
  
      self.feed.reset()
      self.warmup()
  
      self.stop = False
  
imports: from typing import List
  import datetime
  import numpy
  import pandas
  from gym.spaces import Box, Space
  from random import randrange
  from tensortrade.feed.core import Stream, NameSpace, DataFeed
  from tensortrade.oms.wallets import Wallet
  from tensortrade.env.generic import Observer
  from collections import OrderedDict
label_desc: Use image node_id 1 to create a new IntradayObserver object from inherited base classes: Observer with example: obj = IntradayObserver(portfolio, feed, renderer_feed, stop_time, window_size, min_periods, randomize)