def test_apply():

    s1 = Stream([1, 4, 9, 16, 25], "s1")

    lag = s1.apply(np.sqrt).rename("apply")

    feed = DataFeed([lag])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["apply"]]

    assert values == [1, 2, 3, 4, 5]
def test_fillna():

    s = Stream([1, np.nan, -3, np.nan, 5], "s")

    m = s.fillna(-1).rename("fill")

    feed = DataFeed([m])
    feed.compile()

    expected = [1, -1, -3, -1, 5]
    actual = []
    while feed.has_next():
        actual += [feed.next()["fill"]]

    assert actual == expected
def test_clamp_max():

    s = Stream([1, -2, -3, 0, 5], "s")

    m = s.clamp_max(0).rename("clamp_max")

    feed = DataFeed([m])
    feed.compile()

    expected = [0, -2, -3, 0, 0]
    actual = []
    while feed.has_next():
        actual += [feed.next()["clamp_max"]]

    assert actual == expected
def test_lag():

    s1 = Stream([1, 2, 3, 4, 5]).rename("stream")
    assert s1.name == "stream"

    lag = s1.lag()
    assert lag.name == "Lag(stream,1)"

    feed = DataFeed([lag])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["Lag(stream,1)"]]

    assert values == [np.nan, 1, 2, 3, 4]
def test_max():

    s1 = Stream([1, 2, 3, 4], "s1")
    s2 = Stream([1, 4, 3, 2], "s2")

    m = s1.max(s2).rename("max")

    feed = DataFeed([m])
    feed.compile()

    expected = [1, 4, 3, 4]
    actual = []
    while feed.has_next():
        actual += [feed.next()["max"]]

    assert actual == expected
def test_emwmv_unbiased():

    # bias: True
    v = [np.nan, 2, np.nan, 6, 8, 5]
    s = Stream(v, "s")

    specs = [{
        "alpha": 0.68,
        "adjust": True,
        "ignore_na": True,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": True,
        "ignore_na": False,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": False,
        "ignore_na": True,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": False,
        "ignore_na": False,
        "min_periods": 3
    }]

    for spec in specs:
        d = spec.copy()
        d["warmup"] = d["min_periods"]
        del d["min_periods"]
        var = s.ewm(**d).var(bias=False).rename("var")

        feed = DataFeed([var])
        feed.compile()

        expected = list(pd.Series(v).ewm(**spec).var(bias=False))

        actual = []
        while feed.has_next():
            actual += [feed.next()["var"]]

        assert all(np.isclose(actual, expected))
def test_sub():

    s1 = Stream([2, 3, 4, 5, 6], "s1")
    assert s1.name == "s1"

    s2 = Stream([1, 2, 3, 4, 5], "s2")
    assert s2.name == "s2"

    s = s1 - s2
    assert s.name == "Subtract(s1,s2)"

    feed = DataFeed([s])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["Subtract(s1,s2)"]]

    assert values == [1, 1, 1, 1, 1]
def test_add():

    s1 = Stream([1, 2, 3, 4, 5], "s1")
    assert s1.name == "s1"

    s2 = Stream([1, 2, 3, 4, 5], "s2")
    assert s2.name == "s2"

    s = s1 + s2
    assert s.name == "Add(s1,s2)"

    feed = DataFeed([s])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["Add(s1,s2)"]]

    assert values == [2, 4, 6, 8, 10]
def test_ewa_beginning_na():
    # adjust: True, ignore_na: False
    v = [np.nan, 2, np.nan, 6, 8, 5]
    s = Stream(v).rename("s")

    specs = [{
        "alpha": 0.68,
        "adjust": True,
        "ignore_na": True,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": True,
        "ignore_na": False,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": False,
        "ignore_na": True,
        "min_periods": 3
    }, {
        "alpha": 0.68,
        "adjust": False,
        "ignore_na": False,
        "min_periods": 3
    }]

    for spec in specs:
        d = spec.copy()
        d["warmup"] = d["min_periods"]
        del d["min_periods"]
        mean = s.ewm(**d).mean().rename("mean")

        feed = DataFeed([mean])
        feed.compile()

        expected = list(pd.Series(v).ewm(**spec).mean())

        actual = []
        while feed.has_next():
            actual += [feed.next()["mean"]]

        assert all(np.isclose(actual, expected))
def test_log_returns():

    s1 = Stream([200.23, 198.35, 244.36, 266.30, 250.40], "price")
    assert s1.name == "price"

    lp = s1.log()
    lr = lp - lp.lag()

    feed = DataFeed([lr])
    feed.compile()

    while feed.has_next():
        print(feed.next())

    lr = s1.log().diff().rename("log_return")

    feed = DataFeed([lr])
    feed.compile()

    while feed.has_next():
        print(feed.next())
def test_truediv():
    s1 = Stream([2, 3, 4, 5, 6], "s1")
    s2 = Stream([2, 3, 4, 5, 6], "s2")

    s = (s1 / s2).rename("div")

    feed = DataFeed([s])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["div"]]

    assert values == [1, 1, 1, 1, 1]

    s1 = Stream([1, 1, 1, 1, 1], "s2")

    s = (5 / s1).rename("div")
    feed = DataFeed([s])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["div"]]

    assert values == [5, 5, 5, 5, 5]

    s1 = Stream([5, 5, 5, 5, 5], "s2")

    s = (s1 / 5).rename("div")
    feed = DataFeed([s])
    feed.compile()

    values = []
    while feed.has_next():
        values += [feed.next()["div"]]

    assert values == [1, 1, 1, 1, 1]
def test_ewma():

    # adjust: True, ignore_na: True
    v = [5, 2, 4, 6]
    s = Stream(v, "s")

    mean = s.ewm(alpha=0.68, adjust=True, ignore_na=True).mean().rename("mean")

    feed = DataFeed([mean])
    feed.compile()

    expected = list(
        pd.Series(v).ewm(alpha=0.68, adjust=True, ignore_na=True).mean())

    actual = []
    while feed.has_next():
        actual += [feed.next()["mean"]]

    assert all(np.isclose(actual, expected))

    # adjust: True, ignore_na: False
    v = [5, 2, np.nan, 6]
    s = Stream(v, "s")

    mean = s.ewm(alpha=0.68, adjust=True,
                 ignore_na=False).mean().rename("mean")

    feed = DataFeed([mean])
    feed.compile()

    expected = list(
        pd.Series(v).ewm(alpha=0.68, adjust=True, ignore_na=False).mean())

    actual = []
    while feed.has_next():
        actual += [feed.next()["mean"]]

    assert all(np.isclose(actual, expected))

    # adjust: True, ignore_na: False
    v = [5, 2, np.nan, 6]
    s = Stream(v, "s")

    mean = s.ewm(alpha=0.68, adjust=False,
                 ignore_na=True).mean().rename("mean")

    feed = DataFeed([mean])
    feed.compile()

    expected = list(
        pd.Series(v).ewm(alpha=0.68, adjust=False, ignore_na=True).mean())

    actual = []
    while feed.has_next():
        actual += [feed.next()["mean"]]

    assert all(np.isclose(actual, expected))

    # adjust: True, ignore_na: False
    v = [5, 2, np.nan, 6]
    s = Stream(v, "s")

    mean = s.ewm(alpha=0.68, adjust=False,
                 ignore_na=False).mean().rename("mean")

    feed = DataFeed([mean])
    feed.compile()

    expected = list(
        pd.Series(v).ewm(alpha=0.68, adjust=False, ignore_na=False).mean())

    actual = []
    while feed.has_next():
        actual += [feed.next()["mean"]]

    assert all(np.isclose(actual, expected))