code: def computeMiddleOutForecasts(self, iForecast_DF, iProp, iPrefix):
      lLevels = self.mStructure.keys()
      lMidLevel = len(lLevels) // 2
      lForecast_DF_MO = iForecast_DF
      # lower levels .... top-down starting from the middle.
      levels_below = sorted(
          [
              level
              for level in self.mStructure.keys()
              if (level <= lMidLevel)
          ],
          reverse=True,
      )
      # print("MIDDLE_OUT_STRUCTURE", self.mStructure)
      # print("MIDDLE_OUT_LEVELS", levels_below)
      # mid-lewvel : do nothing ????
      for signal in sorted(self.mStructure[lMidLevel].keys()):
          lForecast_DF_MO[
              str(signal) + "_" + iPrefix + "_Forecast"
          ] = iForecast_DF[str(signal) + "_Forecast"]
      #
      for level in levels_below:
          for signal in sorted(self.mStructure[level].keys()):
              for col in sorted(self.mStructure[level][signal]):
                  new_MO_forecast = (
                      lForecast_DF_MO[
                          str(signal) + "_" + iPrefix + "_Forecast"
                      ]
                      * iProp[signal][col]
                  )
                  lForecast_DF_MO[
                      str(col) + "_" + iPrefix + "_Forecast"
                  ] = new_MO_forecast
      # higher levels .... bottom-up starting from the middle
      for level in range(lMidLevel + 1, len(self.mStructure.keys())):
          for signal in sorted(self.mStructure[level].keys()):
              new_MO_forecast = self.computeBottomUpForecast(
                  lForecast_DF_MO, level, signal, iPrefix
              )
              lForecast_DF_MO[
                  str(signal) + "_" + iPrefix + "_Forecast"
              ] = new_MO_forecast
  
      # print(lForecast_DF_MO.head());
      # print(lForecast_DF_MO.tail());
  
      return lForecast_DF_MO
  
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 24 for calling the cSignalHierarchy obj's underlying member method code with example usage: obj.computeMiddleOutForecasts(iForecast_DF, iProp, iPrefix) and returns: lForecast_DF_MO