code: def update_source_and_signals(self):
      # Remove old index
      self.csv = self.csv.reset_index(drop=True)
  
      # create bokeh data sources
      self.bokeh_source_orig = ColumnDataSource(self.csv)
  
      if self.bokeh_source is None:
          self.bokeh_source = ColumnDataSource(self.csv)
          self.update_x_axis_index()
      else:
          self.update_x_axis_index()
          # smooth the data if necessary
          self.change_averaging_window(
              self.signals_averaging_window, force=True
          )
  
      # create all the signals
      if len(self.signals.keys()) == 0:
          self.signals = {}
          unique_signal_names = []
          for name in self.csv.columns:
              if len(name.split("/")) == 1:
                  unique_signal_names.append(name)
              else:
                  unique_signal_names.append(
                      "/".join(name.split("/")[:-1])
                  )
          unique_signal_names = list(set(unique_signal_names))
          for signal_name in unique_signal_names:
              self.signals[signal_name] = Signal(
                  signal_name, self, self.plot
              )
  
file_path: coach/rl_coach/dashboard_components/signals_file_base.py
imports: import numpy
  from bokeh.models import ColumnDataSource
  from rl_coach.dashboard_components.signals import Signal
  from rl_coach.dashboard_components.globals import x_axis, x_axis_options, show_spinner
label_desc: Use image node_id 5 for calling the SignalsFileBase obj's underlying member method code with example usage: obj.update_source_and_signals() without return types