code: def __init__(self, name, parent, plot):
      self.name = name
      self.full_name = "{}/{}".format(parent.filename, self.name)
      self.plot = plot
      self.selected = False
      self.color = random.choice(Dark2[8])
      self.line = None
      self.scatter = None
      self.bands = None
      self.bokeh_source = parent.bokeh_source
      self.min_val = 0
      self.max_val = 0
      self.axis = "default"
      self.sub_signals = []
      for name in self.bokeh_source.data.keys():
          if (
              len(name.split("/")) == 1 and name == self.name
          ) or "/".join(name.split("/")[:-1]) == self.name:
              self.sub_signals.append(name)
      if len(self.sub_signals) > 1:
          self.mean_signal = squeeze_list(
              [
                  name
                  for name in self.sub_signals
                  if "Mean" in name.split("/")[-1]
              ]
          )
          self.stdev_signal = squeeze_list(
              [
                  name
                  for name in self.sub_signals
                  if "Stdev" in name.split("/")[-1]
              ]
          )
          self.min_signal = squeeze_list(
              [
                  name
                  for name in self.sub_signals
                  if "Min" in name.split("/")[-1]
              ]
          )
          self.max_signal = squeeze_list(
              [
                  name
                  for name in self.sub_signals
                  if "Max" in name.split("/")[-1]
              ]
          )
      else:
          self.mean_signal = squeeze_list(self.name)
          self.stdev_signal = None
          self.min_signal = None
          self.max_signal = None
      self.has_bollinger_bands = False
      if (
          self.mean_signal
          and self.stdev_signal
          and self.min_signal
          and self.max_signal
      ):
          self.has_bollinger_bands = True
      self.show_bollinger_bands = False
      self.bollinger_bands_source = None
      self.update_range()
  
file_path: coach/rl_coach/dashboard_components/signals.py
imports: import random
  import numpy
  from bokeh.models import ColumnDataSource
  from bokeh.palettes import Dark2
  from rl_coach.dashboard_components.globals import show_spinner, hide_spinner, current_color
  from rl_coach.utils import squeeze_list
label_desc: Use image node_id 1 to create a new Signal object  with example: obj = Signal(name, parent, plot)