code: def internal_forecast(self, iInputDS, iHorizon):
      lAllLevelsDataset = self.create_all_levels_dataset(iInputDS)
      lForecast_DF = self.forecastAllModels(
          lAllLevelsDataset, iHorizon, self.mDateColumn
      )
      lCombinationMethods = self.mOptions.mHierarchicalCombinationMethod
      if type(lCombinationMethods) is not list:
          lCombinationMethods = [lCombinationMethods]
  
      for lMethod in lCombinationMethods:
          if lMethod == "BU":
              lForecast_DF_BU = self.computeBottomUpForecasts(
                  lForecast_DF
              )
              lForecast_DF = lForecast_DF_BU
  
          if lMethod == "TD":
              lForecast_DF_TD_AHP = self.computeTopDownForecasts(
                  lForecast_DF, self.mAvgHistProp, "AHP_TD"
              )
              lForecast_DF = lForecast_DF_TD_AHP
  
              lForecast_DF_TD_PHA = self.computeTopDownForecasts(
                  lForecast_DF, self.mPropHistAvg, "PHA_TD"
              )
              lForecast_DF = lForecast_DF_TD_PHA
  
          if lMethod == "MO":
              lForecast_DF_MO = self.computeMiddleOutForecasts(
                  lForecast_DF, self.mPropHistAvg, "MO"
              )
              lForecast_DF = lForecast_DF_MO
  
          if lMethod == "OC":
              lForecast_DF_OC = self.computeOptimalCombination(
                  lForecast_DF
              )
              lForecast_DF = lForecast_DF_OC
      return lForecast_DF
  
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 26 for calling the cSignalHierarchy obj's underlying member method code with example usage: obj.internal_forecast(iInputDS, iHorizon) and returns: lForecast_DF