Пример #1
0
def test_extrapolating_below(name, ipset_below):
    """Test that extrapolation raises an error"""
    if name in ("barycentric_interpolator", ):
        pytest.xfail(f"Method {name} does not support detecting extrapolation")

    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_below,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #2
0
def test_x_repeating(name, ipset_x_repeating):
    """Test that repeating values of x raises an error"""
    if name in ("linear", "barycentric_interpolator"):
        pytest.xfail(
            f"Method {name} does not support detecting inconsistent number of x and y values"
        )

    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_x_repeating,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #3
0
def test_num_x_y_different(name, ipset_num_x_y_different):
    """Test that inconsistent number of x and y values raises an error"""
    if name in ("interpolated_univariate_spline", ):
        pytest.xfail(
            f"Method {name} does not support detecting inconsistent number of x and y values"
        )

    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_num_x_y_different,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #4
0
def test_extrapolating_above_ok(name, ipset_above):
    """Test that extrapolation does not raise an error when bounds_error==False"""
    y_new = interpolation.interpolate(*ipset_above,
                                      kind=name,
                                      bounds_error=False,
                                      **IPARGS.get(name, {}))
    assert len(y_new) == len(ipset_above.x_new)
Пример #5
0
def test_interpolating_3d(name, ipset_y_3d):
    """Test that 3-dimensional interpolation returns 3-dimensional data"""
    if name in ("lagrange", ):
        pytest.xfail(f"Method {name} does not support 3-dimensional data")

    y_new = interpolation.interpolate(*ipset_y_3d,
                                      kind=name,
                                      **IPARGS.get(name, {}))
    assert y_new.ndim == 3
Пример #6
0
def test_interpolating_one_value(name, ipset_one_x_new):
    """Test that interpolating one value returns a scalar array"""
    if name in ("lagrange", ):
        pytest.xfail(f"Method {name} does not handle scalar data")

    y_new = interpolation.interpolate(*ipset_one_x_new,
                                      kind=name,
                                      **IPARGS.get(name, {}))
    assert y_new.ndim == 0
Пример #7
0
def _interpolate_meteorological_data(dset, data, rundate):
    """Calculate temperature, humidity and pressure at observation epochs

    Meteorological data are calculated at observation epochs by interpolating in the data given on the observation
    file for each station.

    Missing meteorological data are currently not handled.
    """
    rundate = datetime(rundate.year, rundate.month, rundate.day)
    for field, station in [(f, f[4:]) for f in data.keys()
                           if f.startswith("met_")]:
        log.debug(f"Meteorological data available for station {station}")

        met_time = data[field].pop("met_time")
        flat_list = [item for sublist in met_time for item in sublist]
        met_time_float = np.array([(flat_list[i] - rundate).total_seconds()
                                   for i in range(0, len(flat_list))])
        met_time_unique, met_index = np.unique(met_time_float,
                                               return_index=True)

        diff = len(met_time_float) - len(met_time_unique)
        if diff > 0:
            log.dev(f"Removed duplicate met data for station {station}")
            log.dev("Do this for the actual obs data also!")
        if len(met_time_unique) == 1:
            for met_type in data[field].keys():
                data[field][met_type] = np.repeat(data[field][met_type][0],
                                                  dset.num_obs)
            continue

        # Extrapolation one month before/after
        # (this is overkill, most of these values will be removed later when taking the diagonal)
        min_time = min(met_time_unique) - 31 * 86400
        max_time = max(met_time_unique) + 31 * 86400
        met_time_unique = np.hstack(
            (np.array(min_time), met_time_unique, np.array(max_time)))

        for met_type in data[field].keys():
            met_data_array = data[field][met_type]
            flat_list = [
                item for sublist in met_data_array for item in sublist
            ]
            met_data_array = np.array([flat_list[i] for i in met_index])
            met_data_array = np.hstack(
                (met_data_array[0], met_data_array, met_data_array[-1]))
            data[field][met_type] = interpolation.interpolate(met_time_unique,
                                                              met_data_array,
                                                              dset.obs_time,
                                                              kind="cubic")

    return data
Пример #8
0
def test_interpolating_2d(name, ipset_y_2d):
    """Test that 2-dimensional interpolation returns 2-dimensional data"""
    y_new = interpolation.interpolate(*ipset_y_2d,
                                      kind=name,
                                      **IPARGS.get(name, {}))
    assert y_new.ndim == 2
Пример #9
0
def test_interpolating_to_same_x(name, ipset_same_x):
    """Test that using x_new == x returns y_new == y"""
    y_new = interpolation.interpolate(*ipset_same_x,
                                      kind=name,
                                      **IPARGS.get(name, {}))
    assert np.allclose(y_new, ipset_same_x.y)
Пример #10
0
def test_lagrange_window_too_small(ipset):
    """Test that a window smaller than 3 raises an error"""
    window = 2
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset, kind="lagrange", window=window)
Пример #11
0
def test_lagrange_window_too_big(ipset):
    """Test that a window bigger than number of x raises an error"""
    window = len(ipset.x) + 1
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset, kind="lagrange", window=window)
Пример #12
0
def test_x_repeating(name, ipset_x_repeating):
    """Test that repeating values of x raises an error"""
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_x_repeating,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #13
0
def test_extrapolating_above_raise(name, ipset_above):
    """Test that extrapolation raises an error"""
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_above,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #14
0
def test_interpolating_y_0d(name, ipset_y_0d):
    """Test that 0-dimensional interpolation raises an error"""
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_y_0d,
                                  kind=name,
                                  **IPARGS.get(name, {}))
Пример #15
0
def test_interpolating_x_2d(name, ipset_x_2d):
    """Test that 2-dimensional x values raises an error"""
    with pytest.raises(ValueError):
        interpolation.interpolate(*ipset_x_2d,
                                  kind=name,
                                  **IPARGS.get(name, {}))