code: def computeBottomUpForecast(
      self, iForecast_DF, level, signal, iPrefix="BU"
  ):
      new_BU_forecast = None
      for col1 in sorted(self.mStructure[level][signal]):
          if new_BU_forecast is None:
              new_BU_forecast = iForecast_DF[col1 + "_Forecast"]
          else:
              new_BU_forecast = (
                  new_BU_forecast
                  + iForecast_DF[col1 + "_" + iPrefix + "_Forecast"]
              )
      if new_BU_forecast is None:
          new_BU_forecast = iForecast_DF[str(signal) + "_Forecast"]
      return new_BU_forecast
  
imports: import pandas
  import numpy
  from ..None import ForecastEngine
  from .None import Options
  from .None import Perf
  from .None import Utils
  from .None import Plots
  import time
label_desc: Use image node_id 20 for calling the cSignalHierarchy obj's underlying member method code with example usage: obj.computeBottomUpForecast(iForecast_DF, level, signal, iPrefix) and returns: new_BU_forecast