code: def computeBottomUpForecasts(self, iForecast_DF):
      lForecast_DF_BU = iForecast_DF
      # print("STRUCTURE " , self.mStructure.keys());
      for level in sorted(self.mStructure.keys()):
          for signal in sorted(self.mStructure[level].keys()):
              new_BU_forecast = self.computeBottomUpForecast(
                  lForecast_DF_BU, level, signal
              )
              lForecast_DF_BU[
                  str(signal) + "_BU_Forecast"
              ] = new_BU_forecast
  
      # print(lForecast_DF_BU.head());
      # print(lForecast_DF_BU.tail());
  
      return lForecast_DF_BU
  
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 21 for calling the cSignalHierarchy obj's underlying member method code with example usage: obj.computeBottomUpForecasts(iForecast_DF) and returns: lForecast_DF_BU