Makes forecast with the estimated model

        Parameters
        ----------
        h : int (default : 5)
            How many steps ahead would you like to forecast?

        Returns
        ----------
        - pd.DataFrame with predictions

def predict(self, h=5):        
        """ Makes forecast with the estimated model

        Parameters
        ----------
        h : int (default : 5)
            How many steps ahead would you like to forecast?

        Returns
        ----------
        - pd.DataFrame with predictions
        """     

        if self.latent_variables.estimated is False:
            raise Exception("No latent variables estimated!")
        else:
            y_holder = self.y.copy() # holds past data and predicted data to create AR matrix
            full_X = self.X.copy()
            full_X = np.append(full_X,np.array([np.append(1.0, y_holder[-self.ar:][::-1])]), axis=0)
            Z = full_X

            for step in range(h):
                a, P = self._forecast_model(self.latent_variables.get_z_values(),Z,step)
                new_value = np.dot(Z[-1,:],a[:,self.y.shape[0]+step])
                y_holder = np.append(y_holder, new_value)
                Z = np.append(Z, np.array([np.append(1.0, y_holder[-self.ar:][::-1])]), axis=0)

            date_index = self.shift_dates(h)

            result = pd.DataFrame(y_holder[-h:])
            result.rename(columns={0:self.y_name}, inplace=True)
            result.index = date_index[-h:]

            return result