def test_dim_collision():
    """y and x_new have overlapping dims besides the interpolation dim"""
    y = DataArray([[10, 20], [11, 28]],
                  dims=["y", "x"],
                  coords={
                      "x": [1, 2],
                      "y": ["y1", "y2"]
                  })
    x_new = DataArray([1, 1], dims=["y"])
    tck = splrep(y, "x", 1)
    with pytest.raises(ValueError) as excinfo:
        splev(x_new, tck)
    assert (str(excinfo.value) == "Overlapping dims between interpolated "
            "array and x_new: y")
def test_transpose(transpose, contiguous):
    """Test that the interpolation dim does not need to be on axis 0"""
    y = DataArray(
        [[10, 20], [30, 40], [50, 60]],
        dims=["y", "x"],
        coords={
            "x": [1, 2],
            "y": ["y1", "y2", "y3"]
        },
    )
    expect = DataArray(
        [[15.0, 35.0, 55.0], [10.0, 30.0, 50.0]],
        dims=["x", "y"],
        coords={
            "x": [1.5, 1.0],
            "y": ["y1", "y2", "y3"]
        },
    )

    if transpose:
        y = y.T
    if contiguous:
        y = apply_ufunc(np.ascontiguousarray, y)

    tck = splrep(y, "x", 1)
    y_new = splev([1.5, 1.0], tck)
    assert_equal(expect, y_new)
def test_extrapolate(extrapolate, expect):
    """Test all possible extrapolate parameters"""
    x = np.arange(10)
    y = DataArray(np.sin(x), dims=["x"], coords={"x": x})
    x_new = [-1, 10]
    expect = DataArray(expect, dims=["x"], coords={"x": x_new})

    tck = splrep(y, "x", k=3)
    y_new = splev(x_new, tck, extrapolate=extrapolate)
    assert_allclose(expect, y_new, atol=1e-6, rtol=0)
def test_1d(x_new, expect):
    """
    - Test 1d case
    - Test auto-casting of various types of x_new
    """
    y = DataArray([10, 20, 30, 40, 50, 60],
                  dims=["x"],
                  coords={"x": [1, 2, 3, 4, 5, 6]})
    tck = splrep(y, "x", k=1)
    y_new = splev(x_new, tck)
    assert_equal(y_new, expect)
    assert y_new.chunks == expect.chunks
def test_nonfloat(x_dtype, x_new_dtype):
    """Test numeric x that isn't float64"""
    x = np.array([0, 100])

    y = DataArray((x * 3).astype(x_dtype),
                  dims=["x"],
                  coords={"x": x.astype(x_dtype)})
    x_new = np.array([50]).astype(x_new_dtype)
    expect = DataArray([150.0], dims=["x"], coords={"x": x_new})

    tck = splrep(y, "x", k=1)
    y_new = splev(x_new, tck)
    assert_equal(expect, y_new)
def test_dates(x_dtype, x_new_dtype):
    """
    - Test mismatched date formats on x and x_new
    - Test clip extrapolation on test_dates
    """
    y = DataArray(
        [10, 20],
        dims=["x"],
        coords={"x": np.array(["2000-01-01", "2001-01-01"]).astype(x_dtype)},
    )
    x_new = np.array(["2000-04-20", "2002-07-28"]).astype(x_new_dtype)
    expect = DataArray([13.00546448, 20.0],
                       dims=["x"],
                       coords={"x": x_new.astype("<M8[ns]")})

    tck = splrep(y, "x", k=1)
    y_new = splev(x_new, tck, extrapolate="clip")
    assert_allclose(expect, y_new, atol=1e-6, rtol=0)
def test_0d(k, expect):
    """
    - Test different orders
    - Test unsorted x
    - Test what happens when a series contains NaN
    """
    y = DataArray(
        [[10, 20, 30, 40, 50, 60], [11, 28, 39, 55, 15, -2],
         [np.nan, 2, 3, 4, 5, 6]],
        dims=["y", "x"],
        coords={
            "x": [1, 2, 3, 4, 5, 6],
            "y": ["y1", "y2", "y3"]
        },
    )
    tck = splrep(y, "x", k)
    expect = DataArray(expect,
                       dims=["y"],
                       coords={
                           "x": 4.5,
                           "y": ["y1", "y2", "y3"]
                       }).astype(float)
    assert_allclose(splev(4.5, tck), expect, rtol=0, atol=1e-6)
def test_nd(chunk_y, chunk_x_new, expect_chunks_tck, expect_chunks_y_new):
    """
    - Test ND y vs. ND x_new
    - Test dask
    """
    y = DataArray(
        [[10, 20, 30, 40, 50, 60], [11, 28, 39, 55, 15, -2]],
        dims=["y", "x"],
        coords={
            "x": [1, 2, 3, 4, 5, 6],
            "y": ["y1", "y2"]
        },
    )
    x_new = DataArray(
        [[3.5, 4.5], [1.5, 5.5]],
        dims=["w", "z"],
        coords={
            "w": [100, 200],
            "z": ["foo", "bar"]
        },
    )
    expect_tck = Dataset(
        data_vars={
            "t": ("__t__", [1.0, 1.0, 1.0, 1.0, 3.0, 4.0, 6.0, 6.0, 6.0, 6.0]),
            "c": (
                ("x", "y"),
                [
                    [10.0, 11.0],
                    [16.666667, 33.118519],
                    [26.666667, 20.762963],
                    [43.333333, 84.003704],
                    [53.333333, -25.251852],
                    [60.0, -2],
                ],
            ),
        },
        coords={
            "x": [1, 2, 3, 4, 5, 6],
            "y": ["y1", "y2"]
        },
        attrs={
            "spline_dim": "x",
            "k": 3
        },
    )

    expect_y_new = DataArray(
        [
            [[35.0, 51.0375], [45.0, 39.69583333]],
            [[15.0, 22.72083333], [55.0, -3.945833]],
        ],
        dims=["w", "z", "y"],
        coords={
            "w": [100, 200],
            "y": ["y1", "y2"],
            "z": ["foo", "bar"],
        },
    )

    if chunk_y:
        y = y.chunk({"y": 1})
    if chunk_x_new:
        x_new = x_new.chunk(1)

    tck = splrep(y, "x", k=3)
    assert_allclose(tck.compute(), expect_tck, atol=1e-6, rtol=0)
    y_new = splev(x_new, tck)
    assert_allclose(y_new.compute(), expect_y_new, atol=1e-6, rtol=0)

    assert tck.chunks == expect_chunks_tck
    assert y_new.chunks == expect_chunks_y_new