code: def computeTopDownForecasts(self, iForecast_DF, iProp, iPrefix):
      lForecast_DF_TD = iForecast_DF
      lLevelsReversed = sorted(self.mStructure.keys(), reverse=True)
      # print("TOPDOWN_STRUCTURE", self.mStructure)
      # print("TOPDOWN_LEVELS", lLevelsReversed)
      # highest levels (fully aggregated)
      lHighestLevel = lLevelsReversed[0]
      for signal in sorted(self.mStructure[lHighestLevel].keys()):
          lForecast_DF_TD[
              str(signal) + "_" + iPrefix + "_Forecast"
          ] = iForecast_DF[str(signal) + "_Forecast"]
      for level in lLevelsReversed:
          for signal in sorted(self.mStructure[level].keys()):
              for col in sorted(self.mStructure[level][signal]):
                  new_TD_forecast = (
                      lForecast_DF_TD[
                          str(signal) + "_" + iPrefix + "_Forecast"
                      ]
                      * iProp[signal][col]
                  )
                  lForecast_DF_TD[
                      str(col) + "_" + iPrefix + "_Forecast"
                  ] = new_TD_forecast
  
      # print(lForecast_DF_TD.head());
      # print(lForecast_DF_TD.tail());
  
      return lForecast_DF_TD
  
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 23 for calling the cSignalHierarchy obj's underlying member method code with example usage: obj.computeTopDownForecasts(iForecast_DF, iProp, iPrefix) and returns: lForecast_DF_TD