Esempio n. 1
0
def dataworth_test():
    import os
    import numpy as np
    from pyemu import Schur
    w_dir = os.path.join("..", "verification", "Freyberg")
    forecasts = ["travel_time", "sw_gw_0", "sw_gw_1"]
    sc = Schur(jco=os.path.join(w_dir, "freyberg.jcb"),
               forecasts=forecasts,
               verbose=True)
    sc.pst.observation_data.index = sc.pst.observation_data.obsnme
    base_obs = sc.pst.nnz_obs_names
    zw_names = [
        name for name in sc.pst.zero_weight_obs_names if name not in forecasts
    ]
    #print(sc.get_removed_obs_importance(obslist_dict={"test":zw_names}))
    oname = "or00c00_0"
    names = {"test": oname}
    added = sc.get_added_obs_importance(base_obslist=base_obs,
                                        obslist_dict=names,
                                        reset_zero_weight=True)
    removed = sc.get_removed_obs_importance(obslist_dict=names)
    print("removed", removed)
    print("added", added)
    for fname in forecasts:
        diff = np.abs(removed.loc["test", fname] - added.loc["base", fname])
        assert diff < 0.01, "{0},{1},{2}".format(fname, removed.loc["test",
                                                                    fname],
                                                 added.loc["base", fname])

    names = {"test1": oname, "test2": ["or00c00_1", "or00c00_2"]}
    sc.next_most_important_added_obs(forecast="travel_time",
                                     obslist_dict=names,
                                     base_obslist=sc.pst.nnz_obs_names)
Esempio n. 2
0
def dataworth_test():
    import os
    import numpy as np
    from pyemu import Schur
    w_dir = os.path.join("..","..","verification","Freyberg")
    forecasts = ["travel_time","sw_gw_0","sw_gw_1"]
    sc = Schur(jco=os.path.join(w_dir,"freyberg.jcb"),forecasts=forecasts,verbose=True)
    sc.pst.observation_data.index = sc.pst.observation_data.obsnme
    base_obs = sc.pst.nnz_obs_names
    zw_names = [name for name in sc.pst.zero_weight_obs_names if name not in forecasts ]
    #print(sc.get_removed_obs_importance(obslist_dict={"test":zw_names}))
    oname = "or00c00_0"
    names = {"test":oname}
    added = sc.get_added_obs_importance(base_obslist=base_obs,
                                      obslist_dict=names,reset_zero_weight=True)
    removed = sc.get_removed_obs_importance(obslist_dict=names)
    print("removed",removed)
    print("added",added)
    for fname in forecasts:
        diff = np.abs(removed.loc["test",fname] - added.loc["base",fname])
        assert diff < 0.01,"{0},{1},{2}".format(fname,removed.loc["test",fname],added.loc["base",fname])

    names = {"test1":oname,"test2":["or00c00_1","or00c00_2"]}
    sc.next_most_important_added_obs(forecast="travel_time",obslist_dict=names,
                                     base_obslist=sc.pst.nnz_obs_names)
Esempio n. 3
0
def schur_test_nonpest():
    import numpy as np
    from pyemu import Matrix, Cov, Schur, Jco
    #non-pest
    pnames = ["p1","p2","p3"]
    onames = ["o1","o2","o3","o4"]
    npar = len(pnames)
    nobs = len(onames)
    j_arr = np.random.random((nobs,npar))
    jco = Jco(x=j_arr,row_names=onames,col_names=pnames)
    parcov = Cov(x=np.eye(npar),names=pnames)
    obscov = Cov(x=np.eye(nobs),names=onames)
    forecasts = "o2"

    s = Schur(jco=jco,parcov=parcov,obscov=obscov,forecasts=forecasts)
    print(s.get_parameter_summary())
    print(s.get_forecast_summary())

    #this should fail
    passed = False
    try:
        print(s.get_par_group_contribution())
        passed = True
    except Exception as e:
        print(str(e))
    if passed:
        raise Exception("should have failed")

    #this should fail
    passed = False
    try:
        print(s.get_removed_obs_group_importance())
        passed = True
    except Exception as e:
        print(str(e))
    if passed:
        raise Exception("should have failed")

    print(s.get_par_contribution({"group1":["p1","p3"]}))
    print(s.get_added_obs_importance({"group1": ["o1", "o3"]},reset_zero_weight=0.0))
    print(s.get_removed_obs_importance({"group1":["o1","o3"]}))

    forecasts = Matrix(x=np.random.random((1,npar)),row_names=[forecasts],col_names=pnames)

    sc = Schur(jco=jco,forecasts=forecasts.T,parcov=parcov,obscov=obscov)
    ffile = os.path.join("temp","forecasts.jcb")
    forecasts.to_binary(ffile)

    sc = Schur(jco=jco, forecasts=ffile, parcov=parcov, obscov=obscov)
Esempio n. 4
0
def dataworth_next_test():
    import os
    import numpy as np
    from pyemu import Schur
    w_dir = os.path.join("..", "verification", "Freyberg")
    #w_dir = os.path.join("..","..","examples","freyberg")
    forecasts = ["sw_gw_0", "sw_gw_1"]
    sc = Schur(jco=os.path.join(w_dir, "freyberg.jcb"),
               forecasts=forecasts,
               verbose=True)
    next_test = sc.next_most_important_added_obs(
        forecast="sw_gw_0",
        base_obslist=sc.pst.nnz_obs_names,
        obslist_dict={"test": sc.pst.nnz_obs_names})
    # the returned dataframe should only have one row since the 'base' case
    # should be the same as the 'test' case
    assert next_test.shape[0] == 1

    obs = sc.pst.observation_data
    obs.index = obs.obsnme
    row_groups = obs.groupby([
        lambda x: x.startswith("or"), lambda x: x in sc.pst.nnz_obs_names,
        lambda x: x[:4]
    ]).groups
    obslist_dict = {}
    for key, idxs in row_groups.items():
        if not key[0] or key[1]:
            continue
        obslist_dict[key[2]] = list(idxs)

    imp_df = sc.get_added_obs_importance(base_obslist=sc.pst.nnz_obs_names,
                                         obslist_dict=obslist_dict,
                                         reset_zero_weight=1.0)
    next_test = sc.next_most_important_added_obs(
        forecast="sw_gw_0",
        base_obslist=sc.pst.nnz_obs_names,
        obslist_dict=obslist_dict,
        reset_zero_weight=1.0,
        niter=4)
    print(next_test)
    print(imp_df.sort_index())
    assert next_test.shape[0] == 4
Esempio n. 5
0
def dataworth_next_test():
    import os
    import numpy as np
    from pyemu import Schur
    w_dir = os.path.join("..","..","verification","Freyberg")
    #w_dir = os.path.join("..","..","examples","freyberg")
    forecasts = ["sw_gw_0","sw_gw_1"]
    sc = Schur(jco=os.path.join(w_dir,"freyberg.jcb"),forecasts=forecasts,verbose=True)
    next_test = sc.next_most_important_added_obs(forecast="sw_gw_0",
                                           base_obslist=sc.pst.nnz_obs_names,
                                           obslist_dict={"test":sc.pst.nnz_obs_names})
    # the returned dataframe should only have one row since the 'base' case
    # should be the same as the 'test' case
    assert next_test.shape[0] == 1

    obs = sc.pst.observation_data
    obs.index = obs.obsnme
    row_groups = obs.groupby([lambda x: x.startswith("or"), lambda x: x in sc.pst.nnz_obs_names,
                              lambda x: x[:4]]).groups
    obslist_dict = {}
    for key,idxs in row_groups.items():
        if not key[0] or key[1]:
            continue
        obslist_dict[key[2]] = idxs

    imp_df = sc.get_added_obs_importance(base_obslist=sc.pst.nnz_obs_names,
                                         obslist_dict=obslist_dict,
                                         reset_zero_weight=1.0)
    next_test = sc.next_most_important_added_obs(forecast="sw_gw_0",
                                                 base_obslist=sc.pst.nnz_obs_names,
                                                 obslist_dict=obslist_dict,
                                                 reset_zero_weight=1.0,
                                                 niter=4)
    print(next_test)
    print(imp_df.sort_index())
    assert next_test.shape[0] == 4