diff --git a/piker/calc.py b/piker/calc.py index d629b28c..ae813232 100644 --- a/piker/calc.py +++ b/piker/calc.py @@ -101,3 +101,30 @@ def percent_change( new: float, ) -> float: return pnl(init, new) * 100. + + +def diff_dict( + d1: dict, + d2: dict, + +) -> dict: + d1_keys = set(d1.keys()) + d2_keys = set(d2.keys()) + shared_keys = d1_keys.intersection(d2_keys) + shared_deltas = {o: (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]} + added_keys = d2_keys - d1_keys + added_deltas = {o: (None, d2[o]) for o in added_keys} + deltas = {**shared_deltas, **added_deltas} + return parse_deltas(deltas) + + +def parse_deltas(deltas: dict) -> dict: + res = {} + for k, v in deltas.items(): + if isinstance(v[0], dict): + tmp = diff_dict(v[0], v[1]) + if tmp: + res[k] = tmp + else: + res[k] = v[1] + return res