docs: def uncertainity_equation(self, model_data_obj, E_measured, E_predicted, confidence_level):
          """
          model_data_obj      : Model_Data()
              An instance of Model_Data() which is a user defined class.
          E_measured          : pd.Series()
              Actual values of energy in the post-retrofit period.
          E_predicted         : pd.Series()
              Predicted values of energy in the post-retrofit period.
          confidence_level    : float
              Confidence level of uncertainity in decimal, i.e. 90% = 0.9
  
          """
          
          # Number of rows in baseline period
          n = model_data_obj.baseline_in.shape[0]
  
          # Number of columns in baseline period
          p = model_data_obj.baseline_in.shape[1]
          
          # Number of rows in post period
          m = E_measured.count()
          
          # t-stats value
          # CHECK: degrees of freedom = E_predicted.count() - 1?
          t = stats.t.ppf(confidence_level, E_predicted.count() - 1)
  
          # Rho - Autocorrelation coefficient
          residuals = E_measured - E_predicted 
          auto_corr = residuals.autocorr(lag=1)
          rho = pow(auto_corr, 0.5)
  
          # Effective number of points after accounting for autocorrelation
          n_prime = n * ((1 - rho) / (1 + rho))
          
          # Coefficient of variation of RMSE
          # CHECK: Is the denominator correct?
          cv_rmse = pow(sum(pow(E_measured - E_predicted, 2) / (n - p)), 0.5) / (sum(E_measured) / E_measured.count())
          
          # Bracket in the numerator - refer to page 20
          numerator_bracket = pow((n / n_prime) * (1 + (2 / n_prime)) * (1 / m), 0.5)
          
          # Esave should be absolute value? 
          f = abs(sum(E_measured - E_predicted) / sum(model_data_obj.y_true))
             
          # Main equation 
          uncertainity = t * ((1.26 * cv_rmse * numerator_bracket) / f)
          
          return uncertainity