def test_le(s1_fix, s2_fix): calc = s1_fix <= s2_fix expected = Stairs(initial_value=1) expected.layer(1, 2, -1) expected.layer(2.5, 7, -1) assert calc.identical(expected), "LE calculation not what it should be" assert expected.identical(calc), "LE calculation not what it should be"
def test_eq_2(s1_fix, s2_fix): calc = s1_fix == s2_fix expected = Stairs(initial_value=1) expected.layer(-4, -2, -1) expected.layer(1, 10, -1) assert calc.identical(expected), "EQ calculation not what it should be" assert expected.identical(calc), "EQ calculation not what it should be"
def test_gt(s1_fix, s2_fix): calc = s1_fix > s2_fix expected = Stairs(initial_value=0) expected.layer(1, 2) expected.layer(2.5, 7) assert calc.identical(expected), "GT calculation not what it should be" assert expected.identical(calc), "GT calculation not what it should be"
def test_invert(s2_fix): int_seq = s2_fix calc = ~int_seq expected = Stairs(initial_value=1) expected.layer(-2, 7, -1) expected.layer(8, 10, -1) assert calc.identical(expected), "Invert calculation not what it should be" assert expected.identical(calc), "Invert calculation not what it should be"
def s1(closed="left"): int_seq1 = Stairs(initial_value=0, closed=closed) int_seq1.layer(1, 10, 2) int_seq1.layer(-4, 5, -1.75) int_seq1.layer(3, 5, 2.5) int_seq1.layer(6, 7, -2.5) int_seq1.layer(7, 10, -2.5) return int_seq1
def test_ge(s1_fix, s2_fix): calc = s1_fix >= s2_fix expected = Stairs(initial_value=1) expected.layer(-4, -2, -1) expected.layer(2, 2.5, -1) expected.layer(7, 10, -1) assert calc.identical(expected), "GE calculation not what it should be" assert expected.identical(calc), "GE calculation not what it should be"
def test_lt(s1_fix, s2_fix): calc = s1_fix < s2_fix expected = Stairs(initial_value=0) expected.layer(-4, -2) expected.layer(2, 2.5) expected.layer(7, 10) assert calc.identical(expected), "LT calculation not what it should be" assert expected.identical(calc), "LT calculation not what it should be"
def test_make_boolean(s2_fix): int_seq = s2_fix calc = int_seq.make_boolean() expected = Stairs() expected.layer(-2, 7, 1) expected.layer(8, 10, 1) assert calc.identical(expected), "Boolean calculation not what it should be" assert expected.identical(calc), "Boolean calculation not what it should be"
def IS1(): int_seq1 = Stairs(initial_value=0) int_seq1.layer(1, 10, 2) int_seq1.layer(-4, 5, -1.75) int_seq1.layer(3, 5, 2.5) int_seq1.layer(6, 7, -2.5) int_seq1.layer(7, 10, -2.5) return int_seq1
def test_ne(s1_fix, s2_fix): calc = s1_fix != s2_fix expected = Stairs(initial_value=0) expected.layer(-4, -2, 1) expected.layer(1, 10, 1) assert calc.identical( expected), "NOT EQUAL calculation not what it should be" assert expected.identical( calc), "NOT EQUAL calculation not what it should be"
def test_layer2(init_value): intervals_to_add = [(-2, 1, 1), (3, 5, 2), (1, 5, -1), (-5, -3, 3)] int_seq = Stairs(initial_value=init_value) int_seq2 = Stairs(initial_value=init_value) for interval in intervals_to_add: int_seq.layer(*interval) starts, ends, values = list(zip(*intervals_to_add)) int_seq2.layer(starts, ends, values) assert int_seq.identical(int_seq2) assert int_seq2.identical(int_seq)
def test_or(s3_fix, s4_fix): calc = s3_fix | s4_fix expected = Stairs(initial_value=0) expected.layer(-11, -7.5) expected.layer(-7, 0.5) expected.layer(1, 7) expected.layer(8.5, 9) expected.layer(9.5, 10) assert calc.identical(expected), "OR calculation not what it should be" assert expected.identical(calc), "OR calculation not what it should be"
def test_layer1(init_value): intervals_to_add = [(-2, 1), (3, 5), (1, 5), (-5, -3), (None, 0), (0, None)] int_seq = Stairs(initial_value=init_value) int_seq2 = Stairs(initial_value=init_value) for start, end in intervals_to_add: int_seq.layer(start, end) starts, ends = list(zip(*intervals_to_add)) starts = [{None: np.nan}.get(x, x) for x in starts] ends = [{None: np.nan}.get(x, x) for x in ends] int_seq2.layer(starts, ends) assert int_seq.identical(int_seq2) assert int_seq2.identical(int_seq)
def s1(date_func): int_seq1 = Stairs(initial_value=0) int_seq1.layer( timestamp(2020, 1, 1, date_func=date_func), timestamp(2020, 1, 10, date_func=date_func), 2, ).layer( timestamp(2019, 12, 27, date_func=date_func), timestamp(2020, 1, 5, date_func=date_func), -1.75, ) int_seq1.layer( timestamp(2020, 1, 3, date_func=date_func), timestamp(2020, 1, 5, date_func=date_func), 2.5, ) int_seq1.layer( timestamp(2020, 1, 6, date_func=date_func), timestamp(2020, 1, 7, date_func=date_func), -2.5, ) int_seq1.layer( timestamp(2020, 1, 7, date_func=date_func), timestamp(2020, 1, 10, date_func=date_func), -2.5, ) return int_seq1
def s2(date_func): int_seq2 = Stairs(initial_value=0) int_seq2.layer( timestamp(2020, 1, 1, date_func=date_func), timestamp(2020, 1, 7, date_func=date_func), -2.5, ) int_seq2.layer( timestamp(2020, 1, 8, date_func=date_func), timestamp(2020, 1, 10, date_func=date_func), 5, ) int_seq2.layer( timestamp(2020, 1, 2, date_func=date_func), timestamp(2020, 1, 5, date_func=date_func), 4.5, ) int_seq2.layer( timestamp(2020, 1, 2, 12, date_func=date_func), timestamp(2020, 1, 4, date_func=date_func), -2.5, ).layer( timestamp(2019, 12, 29, date_func=date_func), timestamp(2020, 1, 1, date_func=date_func), -1.75, ) return int_seq2
def test_shift(date_func): ans = Stairs(initial_value=0) ans.layer( timestamp(2020, 1, 2, date_func=date_func), timestamp(2020, 1, 11, date_func=date_func), 2, ) ans.layer( timestamp(2020, 1, 4, date_func=date_func), timestamp(2020, 1, 6, date_func=date_func), 2.5, ) ans.layer( timestamp(2020, 1, 7, date_func=date_func), timestamp(2020, 1, 8, date_func=date_func), -2.5, ) ans.layer( timestamp(2020, 1, 8, date_func=date_func), timestamp(2020, 1, 11, date_func=date_func), -2.5, ) result = s1(date_func).shift(pd.Timedelta(24, unit="H")) assert bool(result == ans) assert_expected_type(result, date_func)
def s2(): int_seq2 = Stairs(initial_value=0) int_seq2.layer(1, 7, -2.5) int_seq2.layer(8, 10, 5) int_seq2.layer(2, 5, 4.5) int_seq2.layer(2.5, 4, -2.5) int_seq2.layer(-2, 1, -1.75) return int_seq2
def s4(): # boolean int_seq = Stairs(initial_value=0) int_seq.layer(-11, 9, 1) int_seq.layer(-9.5, -8, -1) int_seq.layer(-7.5, -7, -1) int_seq.layer(0, 3, -1) int_seq.layer(6, 6.5, -1) int_seq.layer(7, 8.5, -1) return int_seq
def test_and(s3_fix, s4_fix): calc = s3_fix & s4_fix expected = Stairs(initial_value=0) expected.layer(-10, -9.5) expected.layer(-7, -5) expected.layer(-2, 0) expected.layer(3.5, 6) expected.layer(6.5, 7) assert calc.identical(expected), "AND calculation not what it should be" assert expected.identical(calc), "AND calculation not what it should be"
def test_two_adjacent_finite_interval_same_value(init_value, endpoints, value): e = 0.0001 int_seq = Stairs(initial_value=init_value) point1, point2, point3 = endpoints int_seq.layer(point1, point2, value) int_seq.layer(point2, point3, value) assert int_seq.number_of_steps == 2, "Expected result to be 3 intervals" assert _compare_iterables( int_seq.step_points, (point1, point3)), "Finite endpoints are not what is expected" assert (int_seq(float("-inf")) == init_value ), "Adding finite interval should not change initial value" assert (int_seq(float("inf")) == init_value ), "Adding finite interval should not change final value" assert int_seq(point1 - e) == init_value assert int_seq(point1) == init_value + value assert int_seq(point2) == init_value + value assert int_seq(point3 - e) == init_value + value assert int_seq(point3) == init_value
def test_one_finite_interval(init_value, added_interval): e = 0.0001 int_seq = Stairs(initial_value=init_value) int_seq.layer(*added_interval) start, end, value = _expand_interval_definition(*added_interval) assert int_seq.number_of_steps == 2 - ( end is None ), "One finite interval added to initial infinite interval should result in 3 intervals" assert _compare_iterables( int_seq.step_points, (start, end)), "Finite endpoints are not what is expected" assert (int_seq(float("-inf")) == init_value ), "Adding finite interval should not change initial value" assert int_seq(float("inf")) == init_value + value * ( end is None), "Adding finite interval should not change final value" assert int_seq(start - e) == init_value assert int_seq(start) == init_value + value assert int_seq(start + e) == init_value + value if end is not None: assert int_seq(end - e) == init_value + value assert int_seq(end) == init_value
def test_two_overlapping_finite_interval(init_value, endpoints, value, delta): e = 0.0001 int_seq = Stairs(initial_value=init_value) point1, point2, point3, point4 = endpoints int_seq.layer(point1, point3, value) int_seq.layer(point2, point4, value + delta) assert int_seq.number_of_steps == 4, "Expected result to be 5 intervals" assert _compare_iterables( int_seq.step_points, (point1, point2, point3, point4)), "Finite endpoints are not what is expected" assert (int_seq(float("-inf")) == init_value ), "Adding finite interval should not change initial value" assert (int_seq(float("inf")) == init_value ), "Adding finite interval should not change final value" assert int_seq(point1 - e) == init_value assert int_seq(point1) == init_value + value assert int_seq(point2) == init_value + 2 * value + delta assert int_seq(point3 - e) == init_value + 2 * value + delta assert int_seq(point3) == init_value + value + delta assert int_seq(point4 - e) == init_value + value + delta assert int_seq(point4) == init_value
def s3(): # boolean int_seq = Stairs(initial_value=0) int_seq.layer(-10, 10, 1) int_seq.layer(-8, -7, -1) int_seq.layer(-5, -2, -1) int_seq.layer(0.5, 1, -1) int_seq.layer(3, 3.5, -1) int_seq.layer(7, 9.5, -1) return int_seq
def s3(date_func): # boolean int_seq = Stairs(initial_value=0) int_seq.layer( timestamp(2020, 1, 10, date_func=date_func), timestamp(2020, 1, 30, date_func=date_func), 1, ) int_seq.layer( timestamp(2020, 1, 12, date_func=date_func), timestamp(2020, 1, 13, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 15, date_func=date_func), timestamp(2020, 1, 18, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 20, 12, date_func=date_func), timestamp(2020, 1, 21, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 23, date_func=date_func), timestamp(2020, 1, 23, 12, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 27, date_func=date_func), timestamp(2020, 1, 29, 12, date_func=date_func), -1, ) return int_seq
def s4(date_func): # boolean int_seq = Stairs(initial_value=0) int_seq.layer( timestamp(2020, 1, 9, date_func=date_func), timestamp(2020, 1, 29, date_func=date_func), 1, ) int_seq.layer( timestamp(2020, 1, 10, 12, date_func=date_func), timestamp(2020, 1, 12, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 12, 12, date_func=date_func), timestamp(2020, 1, 13, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 20, date_func=date_func), timestamp(2020, 1, 23, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 26, date_func=date_func), timestamp(2020, 1, 26, 12, date_func=date_func), -1, ) int_seq.layer( timestamp(2020, 1, 27, date_func=date_func), timestamp(2020, 1, 28, 12, date_func=date_func), -1, ) return int_seq