code: def estimate(self):
      # print(self.mSignalFrame.columns);
      # print(self.mSignalFrame[self.mTime].head());
      self.checkDateAndSignalTypes()
  
      self.mRowNumberColumn = "row_number"
      self.mNormalizedTimeColumn = self.mTime + "_Normalized"
  
      self.analyzeSeasonals()
  
      lEstim = self.mSplit.getEstimPart(self.mSignalFrame)
      self.mTimeMin = lEstim[self.mTime].min()
      self.mTimeMax = lEstim[self.mTime].max()
      if self.isPhysicalTime():
          self.mTimeMin = np.datetime64(self.mTimeMin.to_pydatetime())
          self.mTimeMax = np.datetime64(self.mTimeMax.to_pydatetime())
      self.mTimeMinMaxDiff = self.mTimeMax - self.mTimeMin
      self.mEstimCount = lEstim.shape[0]
      # print(self.mTimeMin, self.mTimeMax , self.mTimeMinMaxDiff , (self.mTimeMax - self.mTimeMin)/self.mTimeMinMaxDiff)
      self.computeTimeDelta()
      self.mSignalFrame[
          self.mNormalizedTimeColumn
      ] = self.compute_normalize_date_column(
          self.mSignalFrame[self.mTime]
      )
      self.dump()
  
imports: import pandas
  import numpy
  from .None import Utils
  from .None import TimeSeries_Cutting
label_desc: Use image node_id 16 for calling the cTimeInfo obj's underlying member method code with example usage: obj.estimate() without return types