示例#1
0
    def adapt_filter(self, obs_mat):
        '''
        Adaptive filter by using a fixed observation matrix and dynamic transition
        matrix
        
        Parameters:
        ----
        obs_mat         :np.array() 
            the fixed observation matrix
        Return:
        ----
            the filtered result in dataframe
        '''
        from filterpy.kalman import KalmanFilter
        measure_dat = self.data['2017-05-01 01:00:00':].iloc[
            self.train_size:, :]
        #seperating lists
        train_lst = DataImporter.sepDat2(self.train_window, self.predict_size,
                                         measure_dat)
        measure_lst = DataImporter.sepDat(
            self.predict_size, measure_dat.iloc[self.train_window:, :])
        #estimating coefficients
        import warnings
        warnings.filterwarnings("ignore")
        param_lst = [
            VAR(i).fit(1, trend='nc').params.values for i in train_lst
        ]

        #calculating the kf results
        res_lst = []
        #initialize filter params
        kf = KalmanFilter(dim_x=self.dim, dim_z=self.dim)
        kf.x = self.init_val
        kf.P = self.init_prob
        kf.R = self.R
        kf.Q = self.Q
        kf.H = obs_mat
        #filtering
        for i in range(len(measure_lst)):
            #changing params of transition mat
            kf.F = param_lst[i].T
            #doing one batch
            x, p, _, _ = kf.batch_filter(measure_lst[i].values)
            res = pd.DataFrame(x)
            res.columns = self.data.columns
            res.index = measure_lst[i].index
            res_lst.append(res)

        return KFfilter.merge(pd.concat(res_lst), measure_dat)