예제 #1
0
def calc_residual3d_ts(x_tensor, y_tensor, window_train=10, window_test=5, keep_first_train_nan=False):
    data_xy = torch.cat((x_tensor, y_tensor), dim=2)
    
    train_xy = split_sample3d(data_xy, window=window_train, step=window_test, offset=0, keep_tail=False, merge_remain=False)
    test_xy = split_sample3d(data_xy, window=window_test, step=window_test, offset=window_train, keep_tail=False, merge_remain=True)
    
    if len(train_xy) > len(test_xy):
        train_xy = train_xy[:-abs(len(train_xy) - len(test_xy))]
    else:
        test_xy = test_xy[:-abs(len(train_xy) - len(test_xy))]
    
    train_x_list = [data[:, :,:-1] for data in train_xy]  # :-1
    train_y_list = [data[:, :, -1:] for data in train_xy]
    test_x_list = [data[:, :, :-1] for data in test_xy]
    test_y_list = [data[:, :, -1:] for data in test_xy]
    
    param_list = list(map(lambda x, y: get_algebra_coef_ts(x, y), train_x_list, train_y_list))
    residual_train_list = list(map(lambda x, y, p: get_residual_ts(x,y,p), train_x_list, train_y_list, param_list))
    residual_test_list = list(map(lambda x, y, p: get_residual_ts(x,y,p), test_x_list, test_y_list, param_list))
    if keep_first_train_nan:
        residual_train_list[0].fill_(float("nan"))
    resid_np = reduce(lambda x,y:torch.cat([x,y], dim=1), [residual_train_list[0]])
    resid_np = reduce(lambda x,y:torch.cat([x,y], dim=1), residual_test_list, resid_np) 
        
    return resid_np
예제 #2
0
def calc_residual3d_np(x_np, y_np, window_train=10, window_test=5, keep_first_train_nan=False):
    
    data_xy = np.concatenate((x_np, y_np), axis=2)
    # nan to num
    data_xy = np.nan_to_num(data_xy)
    
    train_xy = split_sample3d(data_xy, window=window_train, step=window_test, offset=0, keep_tail=False, merge_remain=False)
    test_xy = split_sample3d(data_xy, window=window_test, step=window_test, offset=window_train, keep_tail=False, merge_remain=True)
    
    if len(train_xy) > len(test_xy):
        train_xy = train_xy[:-abs(len(train_xy) - len(test_xy))]
    else:
        test_xy = test_xy[:-abs(len(train_xy) - len(test_xy))]
    
    train_x_list = [data[:, :,:-1] for data in train_xy]  # :-1
    train_y_list = [data[:, :, -1:] for data in train_xy]
    test_x_list = [data[:, :, :-1] for data in test_xy]
    test_y_list = [data[:, :, -1:] for data in test_xy]
    
    param_list = list(map(lambda x, y: get_algebra_coef_np(x, y), train_x_list, train_y_list))
    residual_train_list = list(map(lambda x, y, p: get_residual_np(x,y,p), train_x_list, train_y_list, param_list))
    residual_test_list = list(map(lambda x, y, p: get_residual_np(x,y,p), test_x_list, test_y_list, param_list))
    
    if keep_first_train_nan:
        residual_train_list[0].fill(np.nan)
    resid_np = reduce(lambda x,y:np.concatenate([x,y], axis=1), [residual_train_list[0]])
    resid_np = reduce(lambda x,y:np.concatenate([x,y], axis=1), residual_test_list, resid_np) 
        
    return resid_np
예제 #3
0
def forecast_residual3d_ts(x_tensor, y_tensor, window_train=10, window_test=5, keep_first_train_nan=False, split_end=True):
    # pdb.set_trace()
    data_xy = torch.cat((x_tensor, y_tensor), dim=2)
    
    train_xy = split_sample3d(data_xy, window=window_train, step=window_test, offset=0, keep_tail=False, merge_remain=False)
    test_xy = split_sample3d(data_xy, window=window_test, step=window_test, offset=window_train, keep_tail=False, merge_remain=True)
    
    if len(train_xy) > len(test_xy):
        if not split_end:
            train_xy = train_xy[:-abs(len(train_xy) - len(test_xy))]
        else:
            last_xy = test_xy[-1]
            splitted_last_xy = list(torch.split(last_xy, [window_test, last_xy.size()[1] - window_test], dim=1))
            test_xy = test_xy[:-1] + splitted_last_xy
    else:
        test_xy = test_xy[:-abs(len(train_xy) - len(test_xy))]

    train_x_list = [data[:, :,:-1] for data in train_xy]  # :-1
    train_y_list = [data[:, :, -1:] for data in train_xy]
    test_x_list = [data[:, :, :-1] for data in test_xy]
    test_y_list = [data[:, :, -1:] for data in test_xy]
    
    param_list = list(map(lambda x, y: get_algebra_coef_ts(x, y), train_x_list, train_y_list))
    #print('ts param shape:', param_list[0].shape)
    residual_train_list = list(map(lambda x, y, p: get_residual_ts(x,y,p), train_x_list, train_y_list, param_list))
    residual_test_list = list(map(lambda x, y, p: get_residual_ts(x,y,p), test_x_list, test_y_list, param_list))
    if keep_first_train_nan:
        residual_train_list[0].fill_(float("nan"))
    resid_ts = reduce(lambda x,y:torch.cat([x,y], dim=1), [residual_train_list[0]])
    resid_ts = reduce(lambda x,y:torch.cat([x,y], dim=1), residual_test_list, resid_ts) 
        
    return resid_ts
예제 #4
0
def calc_residual3d_ts(x_ts, y_ts, window=10, keep_first_nan=True):
    splitted_y = split_sample3d(y_ts, window=window, step=1, offset=0, keep_tail=False, merge_remain=True)
    splitted_x = split_sample3d(x_ts, window=window, step=1, offset=0, keep_tail=False, merge_remain=True)
    
    param_list = list(map(lambda x, y: get_algebra_coef_ts(x, y), splitted_x, splitted_y))
    residual_list_first = get_residual_ts(splitted_x[0], splitted_y[0], param_list[0])[:,:-1,:] # the first window-1 entries
    residual_list_rest = list(map(lambda x, y, p: get_residual_ts(x,y,p)[:,[-1],:], splitted_x, splitted_y, param_list))  
    if keep_first_nan:
         residual_list_first.fill_(float("nan"))
    resid_ts = reduce(lambda x,y:torch.cat([x,y], dim=1), [residual_list_first] + residual_list_rest)
    
    return resid_ts
예제 #5
0
def calc_residual3d_np(x_np, y_np, window=10, keep_first_nan=True):
    splitted_y = split_sample3d(y_np, window=window, step=1, offset=0, keep_tail=False, merge_remain=True)
    splitted_x = split_sample3d(x_np, window=window, step=1, offset=0, keep_tail=False, merge_remain=True)
    
    param_list = list(map(lambda x, y: get_algebra_coef_np(x, y), splitted_x, splitted_y))
    residual_list_first = get_residual_np(splitted_x[0], splitted_y[0], param_list[0])[:,:-1,:] # the first window-1 entries
    residual_list_rest = list(map(lambda x, y, p: get_residual_np(x,y,p)[:,[-1],:], splitted_x, splitted_y, param_list))  
    if keep_first_nan:
        residual_list_first.fill(np.nan)
    resid_np = reduce(lambda x,y:np.concatenate([x,y], axis=1), [residual_list_first] + residual_list_rest) 
    
    return resid_np