Esempio n. 1
0
    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
Esempio n. 3
0
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