dict_rb.update(append_dict) return df_MCI if remove_PDO: lowpass = '******' keys_ext = [f'PDO{lowpass}bw'] rg.list_import_ts = [('PDO', os.path.join(data_dir, 'df_PDOs.h5'))] else: keys_ext = ['0..0..z500_sp'] alpha_level = .05 # freqs = [15, 30] columns = functions_pp.flatten([[f'{f}-d', f'{f}-d SST->RW', f'{f}-d RW->SST'] for f in freqs]) csvfilenameMCI = os.path.join(rg.path_outmain, name_MCI_csv) df_MCI = pd.DataFrame(np.concatenate([ np.repeat(west_east, rg.n_spl)[None, :], np.repeat(period, rg.n_spl)[None, :] ], axis=0).T, columns=['target', 'period']) dict_rb = { 'Target': west_east, 'Period': period, 'Seed': 's{}'.format(rg.kwrgs_traintest['seed']) } for f in freqs[:]:
def cond_forecast_table(df_test, df_forcings, score_func_list, n_boot=0): quantiles = [.15, .25] metricsused = np.array([m.__name__ for m in score_func_list]) forcings = df_forcings.columns if forcings.size > 1: # loop over forcings n_boot = 0 index_level1 = forcings else: index_level1 = np.arange(n_boot) cond_df = np.zeros( (metricsused.size, index_level1.size, len(quantiles) * 2)) name_fc = 'test' for i, met in enumerate(metricsused): # j = 0 for j, col_forc in enumerate(forcings): df_forcing = df_forcings[col_forc] for k, l in enumerate(range(0, 4, 2)): q = quantiles[k] low = df_forcing < df_forcing.quantile(q) high = df_forcing > df_forcing.quantile(1 - q) mask_anomalous = np.logical_or(low, high) # anomalous Boundary forcing condfc = df_test[mask_anomalous.values] condfc = condfc.rename({'causal': name_fc}, axis=1) cond_verif_tuple_ano = fc_utils.get_scores( condfc, score_func_list=score_func_list, n_boot=n_boot, score_per_test=False, blocksize=1, rng_seed=seed) df_train_m, df_test_s_m, df_test_m, df_boot = cond_verif_tuple_ano rg.cond_verif_tuple_ano = cond_verif_tuple_ano if forcings.size > 1: cond_df[i, j, l] = df_test_m[df_test_m.columns[0][0]].loc[0][met] else: cond_df[i, :, l] = df_boot[df_boot.columns[0][0]][met] # mild boundary forcing larger_low = df_forcing > df_forcing.quantile(.5 - q) smaller_high = df_forcing < df_forcing.quantile(.5 + q) mask_mild = np.logical_and(larger_low, smaller_high) condfc = df_test[mask_mild.values] condfc = condfc.rename({'causal': name_fc}, axis=1) cond_verif_tuple_mild = fc_utils.get_scores( condfc, score_func_list=score_func_list, n_boot=n_boot, score_per_test=False, blocksize=1, rng_seed=seed) df_train_m, df_test_s_m, df_test_m, df_boot = cond_verif_tuple_mild rg.cond_verif_tuple_mild = cond_verif_tuple_mild if forcings.size > 1: cond_df[i, j, l + 1] = df_test_m[df_test_m.columns[0][0]].loc[0][met] else: cond_df[i, :, l + 1] = df_boot[df_boot.columns[0][0]][met] columns = [[f'strong {int(q*200)}%', f'weak {int(q*200)}%'] for q in quantiles] df_cond_fc = pd.DataFrame( cond_df.reshape((len(metricsused) * index_level1.size, -1)), index=pd.MultiIndex.from_product([list(metricsused), index_level1]), columns=functions_pp.flatten(columns)) return df_cond_fc
def cond_forecast_table(rg_list, score_func_list, n_boot=0): df_test_m = rg_list[0].verification_tuple[2] quantiles = [.15, .25] metrics = df_test_m.columns.levels[1] if n_boot > 0: cond_df = np.zeros( (metrics.size, len(rg_list), len(quantiles) * 2, n_boot)) else: cond_df = np.zeros((metrics.size, len(rg_list), len(quantiles) * 2)) for i, met in enumerate(metrics): for j, rg in enumerate(rg_list): PacAtl_ts = rg.df_forcing prediction = rg.prediction_tuple[0] df_test = functions_pp.get_df_test(prediction, df_splits=rg.df_splits) # df_test_m = rg.verification_tuple[2] # cond_df[i, j, 0] = df_test_m[df_test_m.columns[0][0]].loc[0][met] for k, l in enumerate(range(0, 4, 2)): q = quantiles[k] low = PacAtl_ts < PacAtl_ts.quantile(q) high = PacAtl_ts > PacAtl_ts.quantile(1 - q) mask_anomalous = np.logical_or(low, high) # anomalous Boundary forcing condfc = df_test[mask_anomalous.values] # condfc = condfc.rename({'causal':periodnames[i]}, axis=1) cond_verif_tuple = fc_utils.get_scores( condfc, score_func_list=score_func_list, n_boot=n_boot, score_per_test=False, blocksize=1, rng_seed=1) df_train_m, df_test_s_m, df_test_m, df_boot = cond_verif_tuple rg.cond_verif_tuple = cond_verif_tuple if n_boot == 0: cond_df[i, j, l] = df_test_m[df_test_m.columns[0][0]].loc[0][met] else: cond_df[i, j, l, :] = df_boot[df_boot.columns[0][0]][met] # mild boundary forcing higher_low = PacAtl_ts > PacAtl_ts.quantile(.5 - q) lower_high = PacAtl_ts < PacAtl_ts.quantile(.5 + q) mask_anomalous = np.logical_and(higher_low, lower_high) # changed 11-5-21 condfc = df_test[mask_anomalous.values] # condfc = condfc.rename({'causal':periodnames[i]}, axis=1) cond_verif_tuple = fc_utils.get_scores( condfc, score_func_list=score_func_list, n_boot=n_boot, score_per_test=False, blocksize=1, rng_seed=1) df_train_m, df_test_s_m, df_test_m, df_boot = cond_verif_tuple if n_boot == 0: cond_df[i, j, l + 1] = df_test_m[df_test_m.columns[0][0]].loc[0][met] else: cond_df[i, j, l + 1, :] = df_boot[df_boot.columns[0][0]][met] columns = [[f'strong {int(q*200)}%', f'weak {int(q*200)}%'] for q in quantiles] columns = functions_pp.flatten(columns) if n_boot > 0: columns = pd.MultiIndex.from_product([columns, list(range(n_boot))]) df_cond_fc = pd.DataFrame(cond_df.reshape( (len(metrics) * len(rg_list), -1)), index=pd.MultiIndex.from_product([ list(metrics), [rg.fc_month for rg in rg_list] ]), columns=columns) return df_cond_fc