Skip to content

Commit d2b76e8

Browse files
mfleminghenrikingo
andauthored
Add more change point details to JSON output (#18)
Co-authored-by: Henrik Ingo <[email protected]>
1 parent 7a8caec commit d2b76e8

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

hunter/analysis.py

+29
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,39 @@ def backward_rel_change(self):
3333
"""Relative change from right to left"""
3434
return self.mean_1 / self.mean_2 - 1.0
3535

36+
def forward_change_percent(self) -> float:
37+
return self.forward_rel_change() * 100.0
38+
39+
def backward_change_percent(self) -> float:
40+
return self.backward_rel_change() * 100.0
41+
3642
def change_magnitude(self):
3743
"""Maximum of absolutes of rel_change and rel_change_reversed"""
3844
return max(abs(self.forward_rel_change()), abs(self.backward_rel_change()))
3945

46+
def mean_before(self):
47+
return self.mean_1
48+
49+
def mean_after(self):
50+
return self.mean_2
51+
52+
def stddev_before(self):
53+
return self.std_1
54+
55+
def stddev_after(self):
56+
return self.std_2
57+
58+
def to_json(self):
59+
return {
60+
"forward_change_percent": f"{self.forward_change_percent():-0f}",
61+
"magnitude": f"{self.change_magnitude():-0f}",
62+
"mean_before": f"{self.mean_before():-0f}",
63+
"stddev_before": f"{self.stddev_before():-0f}",
64+
"mean_after": f"{self.mean_after():-0f}",
65+
"stddev_after": f"{self.stddev_after():-0f}",
66+
"pvalue": f"{self.pvalue:-0f}",
67+
}
68+
4069

4170
@dataclass
4271
class ChangePoint:

hunter/series.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,31 @@ def backward_change_percent(self) -> float:
5959
def magnitude(self):
6060
return self.stats.change_magnitude()
6161

62+
def mean_before(self):
63+
return self.stats.mean_1
64+
65+
def mean_after(self):
66+
return self.stats.mean_2
67+
68+
def stddev_before(self):
69+
return self.stats.std_1
70+
71+
def stddev_after(self):
72+
return self.stats.std_2
73+
74+
def pvalue(self):
75+
return self.stats.pvalue
76+
6277
def to_json(self):
6378
return {
6479
"metric": self.metric,
6580
"forward_change_percent": f"{self.forward_change_percent():.0f}",
81+
"magnitude": f"{self.magnitude():-0f}",
82+
"mean_before": f"{self.mean_before():-0f}",
83+
"stddev_before": f"{self.stddev_before():-0f}",
84+
"mean_after": f"{self.mean_after():-0f}",
85+
"stddev_after": f"{self.stddev_after():-0f}",
86+
"pvalue": f"{self.pvalue():-0f}",
6687
}
6788

6889

@@ -78,7 +99,11 @@ class ChangePointGroup:
7899
changes: List[ChangePoint]
79100

80101
def to_json(self):
81-
return {"time": self.time, "changes": [cp.to_json() for cp in self.changes]}
102+
return {
103+
"time": self.time,
104+
"attributes": self.attributes,
105+
"changes": [cp.to_json() for cp in self.changes],
106+
}
82107

83108

84109
class Series:

tests/report_test.py

+32-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,38 @@ def test_json_report(report):
5454
obj = json.loads(output)
5555
expected = {
5656
"test_name_from_config": [
57-
{"time": 4, "changes": [{"metric": "series2", "forward_change_percent": "-11"}]},
58-
{"time": 6, "changes": [{"metric": "series1", "forward_change_percent": "-49"}]},
57+
{
58+
"time": 4,
59+
"changes": [
60+
{
61+
"metric": "series2",
62+
"forward_change_percent": "-11",
63+
"magnitude": "0.124108",
64+
"mean_after": "1.801429",
65+
"mean_before": "2.025000",
66+
"pvalue": "0.000000",
67+
"stddev_after": "0.026954",
68+
"stddev_before": "0.011180",
69+
}
70+
],
71+
"attributes": {},
72+
},
73+
{
74+
"time": 6,
75+
"changes": [
76+
{
77+
"metric": "series1",
78+
"forward_change_percent": "-49",
79+
"magnitude": "0.977513",
80+
"mean_after": "0.504000",
81+
"mean_before": "0.996667",
82+
"pvalue": "0.000000",
83+
"stddev_after": "0.025768",
84+
"stddev_before": "0.067495",
85+
}
86+
],
87+
"attributes": {},
88+
},
5989
]
6090
}
6191
assert isinstance(obj, dict)

0 commit comments

Comments
 (0)