From 59cb29a16031db7f357c24e8abe1c6d48ad2012a Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Wed, 8 Jul 2026 21:35:55 +0100 Subject: [PATCH 01/12] feat(#34): implemented cumulative return metric --- src/argus/analytics/metrics/trend_metrics.py | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 5622acb..747f969 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -73,3 +73,26 @@ def get_min_max_rates(df: pd.DataFrame) -> dict: min_max["max_date"].append(df.loc[max_id, "date"]) min_max["max_rate"].append(df.loc[max_id, "rate"]) return min_max + + +def get_cumulative_return(df:pd.DataFrame,start_date:str,end_date:str)->float: + + if df.empty: + return 0.0 + start_row=df.loc[df["date"]==start_date] + end_row=df.loc[df["date"]==end_date] + + if start_row.empty or end_row.empty: + return 0.0 + + start_rate=float(start_row["rate"].iloc[0]) + end_rate=float(end_row["rate"].iloc[0]) + + if start_rate == 0.0: + return 0 + + return (end_rate - start_rate)/start_rate*100 + + + + From da3b31da760cc972708caf01fa50a6ea7b92f232 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Wed, 8 Jul 2026 21:36:49 +0100 Subject: [PATCH 02/12] test(#34): added cumulative return test --- tests/test_trend_metrics.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index fe175bd..1350b87 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -1,10 +1,12 @@ import pandas as pd import pandas.testing as pdt import numpy as np +import pytest from argus.analytics.metrics.trend_metrics import ( add_daily_percentage_change, add_rolling_average, get_min_max_rates, + get_cumulative_return, ) @@ -60,3 +62,12 @@ def test_get_min_max_(): result_dict = get_min_max_rates(test_df) assert result_dict == min_max + +def test_get_cumulative_return(): + test_timesseries = { + "date": ["2026-05-01", "2026-05-02", "2026-05-03"], + "rate": [1.00, 1.10, 1.21], + } + test_df=pd.DataFrame(test_timesseries) + resault=get_cumulative_return(test_df,"2026-05-01","2026-05-02") + assert resault == pytest.approx(10.0) From 669f34f158e4aebb96f5dc7d9c2ac4f147c8f62b Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:01:29 +0100 Subject: [PATCH 03/12] feat(#34): implemented strongest/weakest day --- src/argus/analytics/metrics/trend_metrics.py | 32 +++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 747f969..51a21b0 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -93,6 +93,36 @@ def get_cumulative_return(df:pd.DataFrame,start_date:str,end_date:str)->float: return (end_rate - start_rate)/start_rate*100 - +def get_strongest_weakest_days(df: pd.DataFrame, start_date: str, end_date: str) -> dict: + period_df = df[(df["date"] >= start_date) & (df["date"] <= end_date)] + + if period_df.empty or len(period_df) < 2: + return { + "strongest_day": {"date": None, "pct_change": 0.0}, + "weakest_day": {"date": None, "pct_change": 0.0} + } + + pct_series = pd.Series(period_df["rate"]).pct_change() * 100 + valid_pct = pct_series.dropna() + + if valid_pct.empty: + return { + "strongest_day": {"date": None, "pct_change": 0.0}, + "weakest_day": {"date": None, "pct_change": 0.0} + } + + max_idx = valid_pct.idxmax() + min_idx = valid_pct.idxmin() + + return { + "strongest_day": { + "date": period_df.loc[max_idx, "date"], + "pct_change": round(float(pct_series.loc[max_idx]), 2) + }, + "weakest_day": { + "date": period_df.loc[min_idx, "date"], + "pct_change": round(float(pct_series.loc[min_idx]), 2) + } + } From 1e5da52ccc5ce625930d44a7ab48c53965c7841f Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:02:10 +0100 Subject: [PATCH 04/12] test(#34): added test for strongest/weakest day --- tests/test_trend_metrics.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index 1350b87..9eb1350 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -7,6 +7,7 @@ add_rolling_average, get_min_max_rates, get_cumulative_return, + get_strongest_weakest_days, ) @@ -71,3 +72,17 @@ def test_get_cumulative_return(): test_df=pd.DataFrame(test_timesseries) resault=get_cumulative_return(test_df,"2026-05-01","2026-05-02") assert resault == pytest.approx(10.0) + +def test_get_strongest_weakest_days(): + test_timeseries = { + "date": ["2026-05-01", "2026-05-02", "2026-05-03", "2026-05-04"], + "rate": [1.00, 1.20, 1.14, 2.00], + } + test_df = pd.DataFrame(test_timeseries) + + result = get_strongest_weakest_days(test_df, "2026-05-01", "2026-05-03") + + assert result == { + "strongest_day": {"date": "2026-05-02", "pct_change": 20.0}, + "weakest_day": {"date": "2026-05-03", "pct_change": -5.0} + } From 728664bd5b701465783c25e95916a4d9d1e1935a Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:12:59 +0100 Subject: [PATCH 05/12] fix(#34): fixed type return --- src/argus/analytics/metrics/trend_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 51a21b0..1baf528 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -89,7 +89,7 @@ def get_cumulative_return(df:pd.DataFrame,start_date:str,end_date:str)->float: end_rate=float(end_row["rate"].iloc[0]) if start_rate == 0.0: - return 0 + return 0.0 return (end_rate - start_rate)/start_rate*100 From b5bc9a7243a4d1389afef362c02487ad0e7e3e13 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:14:19 +0100 Subject: [PATCH 06/12] feat(#34): implemented rolling_volatility --- src/argus/analytics/metrics/trend_metrics.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 1baf528..9c20f21 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -125,4 +125,14 @@ def get_strongest_weakest_days(df: pd.DataFrame, start_date: str, end_date: str) } } +def add_rolling_volatility(df: pd.DataFrame, window: int = 3) -> pd.DataFrame: + result = df.copy() + + daily_returns = result["rate"].pct_change() * 100 + + result["rolling_volatility"] = daily_returns.rolling(window=window, min_periods=1).std() + + result["rolling_volatility"] = result["rolling_volatility"].fillna(0.0) + + return result From 5a5804d5a4777763f9475e9423b572b2a131a1e0 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:16:37 +0100 Subject: [PATCH 07/12] test(#34): added test for rolling_volatility --- tests/test_trend_metrics.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index 9eb1350..a302899 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -8,6 +8,7 @@ get_min_max_rates, get_cumulative_return, get_strongest_weakest_days, + add_rolling_volatility ) @@ -86,3 +87,20 @@ def test_get_strongest_weakest_days(): "strongest_day": {"date": "2026-05-02", "pct_change": 20.0}, "weakest_day": {"date": "2026-05-03", "pct_change": -5.0} } + +def test_is_rolling_volatility_added(): + test_timeseries = { + "date": ["2026-05-01", "2026-05-02", "2026-05-03"], + "rate": [1.00, 2.00, 1.00], + } + test_df = pd.DataFrame(test_timeseries) + + expect_result = { + "date": ["2026-05-01", "2026-05-02", "2026-05-03"], + "rate": [1.00, 2.00, 1.00], + "rolling_volatility": [0.0, 0.0, 106.06601717798213] + } + expect_df = pd.DataFrame(expect_result) + result_df = add_rolling_volatility(test_df, window=2) + + pdt.assert_frame_equal(result_df, expect_df) From 1ae7d4c0d9be65f054263176aac2e3b98e80e3cc Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:33:22 +0100 Subject: [PATCH 08/12] test(#34): added edge case test (Stronges/weakest day, Cuulative return) --- tests/test_trend_metrics.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index a302899..5cf4979 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -74,6 +74,11 @@ def test_get_cumulative_return(): resault=get_cumulative_return(test_df,"2026-05-01","2026-05-02") assert resault == pytest.approx(10.0) + # Egde case + empty_df = pd.DataFrame(columns=["date", "rate"]) + result = get_cumulative_return(empty_df, "2026-05-01", "2026-05-02") + assert result == 0.0 + def test_get_strongest_weakest_days(): test_timeseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03", "2026-05-04"], @@ -88,6 +93,18 @@ def test_get_strongest_weakest_days(): "weakest_day": {"date": "2026-05-03", "pct_change": -5.0} } + #Edge case + flat_timeseries = { + "date": ["2026-05-01", "2026-05-02", "2026-05-03"], + "rate": [1.15, 1.15, 1.15], + } + flat_df = pd.DataFrame(flat_timeseries) + result = get_strongest_weakest_days(flat_df, "2026-05-01", "2026-05-03") + assert result == { + "strongest_day": {"date": "2026-05-02", "pct_change": 0.0}, + "weakest_day": {"date": "2026-05-02", "pct_change": 0.0} + } + def test_is_rolling_volatility_added(): test_timeseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03"], From 37779bde767ac65b41afdcd8a55b655647f8b78d Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:58:11 +0100 Subject: [PATCH 09/12] refactor(#34): used loc to access ptc_series instead of pd.Series --- src/argus/analytics/metrics/trend_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 9c20f21..94f1bde 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -102,7 +102,7 @@ def get_strongest_weakest_days(df: pd.DataFrame, start_date: str, end_date: str) "weakest_day": {"date": None, "pct_change": 0.0} } - pct_series = pd.Series(period_df["rate"]).pct_change() * 100 + pct_series = period_df.loc[:, "rate"].pct_change() * 100 valid_pct = pct_series.dropna() if valid_pct.empty: From d8e9070039d3ffa4e8d31e8db2759bc0af5c17b3 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Thu, 9 Jul 2026 13:59:49 +0100 Subject: [PATCH 10/12] refactor(#34): formatting the changes using ruff --- src/argus/analytics/metrics/trend_metrics.py | 55 +++++++++++--------- tests/test_trend_metrics.py | 27 +++++----- 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index 94f1bde..fa2f2eb 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -75,64 +75,69 @@ def get_min_max_rates(df: pd.DataFrame) -> dict: return min_max -def get_cumulative_return(df:pd.DataFrame,start_date:str,end_date:str)->float: - +def get_cumulative_return(df: pd.DataFrame, start_date: str, end_date: str) -> float: + if df.empty: return 0.0 - start_row=df.loc[df["date"]==start_date] - end_row=df.loc[df["date"]==end_date] - + start_row = df.loc[df["date"] == start_date] + end_row = df.loc[df["date"] == end_date] + if start_row.empty or end_row.empty: return 0.0 - start_rate=float(start_row["rate"].iloc[0]) - end_rate=float(end_row["rate"].iloc[0]) + start_rate = float(start_row["rate"].iloc[0]) + end_rate = float(end_row["rate"].iloc[0]) if start_rate == 0.0: return 0.0 - return (end_rate - start_rate)/start_rate*100 + return (end_rate - start_rate) / start_rate * 100 -def get_strongest_weakest_days(df: pd.DataFrame, start_date: str, end_date: str) -> dict: + +def get_strongest_weakest_days( + df: pd.DataFrame, start_date: str, end_date: str +) -> dict: period_df = df[(df["date"] >= start_date) & (df["date"] <= end_date)] - + if period_df.empty or len(period_df) < 2: return { "strongest_day": {"date": None, "pct_change": 0.0}, - "weakest_day": {"date": None, "pct_change": 0.0} + "weakest_day": {"date": None, "pct_change": 0.0}, } - + pct_series = period_df.loc[:, "rate"].pct_change() * 100 valid_pct = pct_series.dropna() - + if valid_pct.empty: return { "strongest_day": {"date": None, "pct_change": 0.0}, - "weakest_day": {"date": None, "pct_change": 0.0} + "weakest_day": {"date": None, "pct_change": 0.0}, } - + max_idx = valid_pct.idxmax() min_idx = valid_pct.idxmin() - + return { "strongest_day": { "date": period_df.loc[max_idx, "date"], - "pct_change": round(float(pct_series.loc[max_idx]), 2) + "pct_change": round(float(pct_series.loc[max_idx]), 2), }, "weakest_day": { "date": period_df.loc[min_idx, "date"], - "pct_change": round(float(pct_series.loc[min_idx]), 2) - } + "pct_change": round(float(pct_series.loc[min_idx]), 2), + }, } + def add_rolling_volatility(df: pd.DataFrame, window: int = 3) -> pd.DataFrame: result = df.copy() - + daily_returns = result["rate"].pct_change() * 100 - - result["rolling_volatility"] = daily_returns.rolling(window=window, min_periods=1).std() - + + result["rolling_volatility"] = daily_returns.rolling( + window=window, min_periods=1 + ).std() + result["rolling_volatility"] = result["rolling_volatility"].fillna(0.0) - - return result + return result diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index 5cf4979..a3cf161 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -8,7 +8,7 @@ get_min_max_rates, get_cumulative_return, get_strongest_weakest_days, - add_rolling_volatility + add_rolling_volatility, ) @@ -65,13 +65,14 @@ def test_get_min_max_(): assert result_dict == min_max + def test_get_cumulative_return(): test_timesseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03"], "rate": [1.00, 1.10, 1.21], } - test_df=pd.DataFrame(test_timesseries) - resault=get_cumulative_return(test_df,"2026-05-01","2026-05-02") + test_df = pd.DataFrame(test_timesseries) + resault = get_cumulative_return(test_df, "2026-05-01", "2026-05-02") assert resault == pytest.approx(10.0) # Egde case @@ -79,21 +80,22 @@ def test_get_cumulative_return(): result = get_cumulative_return(empty_df, "2026-05-01", "2026-05-02") assert result == 0.0 + def test_get_strongest_weakest_days(): test_timeseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03", "2026-05-04"], - "rate": [1.00, 1.20, 1.14, 2.00], + "rate": [1.00, 1.20, 1.14, 2.00], } test_df = pd.DataFrame(test_timeseries) - + result = get_strongest_weakest_days(test_df, "2026-05-01", "2026-05-03") - + assert result == { "strongest_day": {"date": "2026-05-02", "pct_change": 20.0}, - "weakest_day": {"date": "2026-05-03", "pct_change": -5.0} + "weakest_day": {"date": "2026-05-03", "pct_change": -5.0}, } - #Edge case + # Edge case flat_timeseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03"], "rate": [1.15, 1.15, 1.15], @@ -102,22 +104,23 @@ def test_get_strongest_weakest_days(): result = get_strongest_weakest_days(flat_df, "2026-05-01", "2026-05-03") assert result == { "strongest_day": {"date": "2026-05-02", "pct_change": 0.0}, - "weakest_day": {"date": "2026-05-02", "pct_change": 0.0} + "weakest_day": {"date": "2026-05-02", "pct_change": 0.0}, } + def test_is_rolling_volatility_added(): test_timeseries = { "date": ["2026-05-01", "2026-05-02", "2026-05-03"], "rate": [1.00, 2.00, 1.00], } test_df = pd.DataFrame(test_timeseries) - + expect_result = { "date": ["2026-05-01", "2026-05-02", "2026-05-03"], "rate": [1.00, 2.00, 1.00], - "rolling_volatility": [0.0, 0.0, 106.06601717798213] + "rolling_volatility": [0.0, 0.0, 106.06601717798213], } expect_df = pd.DataFrame(expect_result) result_df = add_rolling_volatility(test_df, window=2) - + pdt.assert_frame_equal(result_df, expect_df) From 9897c86b00b5d0d8351851dfc3661b37ae8e1e99 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 11 Jul 2026 16:12:23 +0100 Subject: [PATCH 11/12] fix(#34): followed other metrics style --- src/argus/analytics/metrics/trend_metrics.py | 30 ++++++-------------- tests/test_trend_metrics.py | 12 ++++---- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/argus/analytics/metrics/trend_metrics.py b/src/argus/analytics/metrics/trend_metrics.py index fa2f2eb..40e857c 100644 --- a/src/argus/analytics/metrics/trend_metrics.py +++ b/src/argus/analytics/metrics/trend_metrics.py @@ -75,18 +75,12 @@ def get_min_max_rates(df: pd.DataFrame) -> dict: return min_max -def get_cumulative_return(df: pd.DataFrame, start_date: str, end_date: str) -> float: - +def get_cumulative_return(df: pd.DataFrame) -> float: if df.empty: return 0.0 - start_row = df.loc[df["date"] == start_date] - end_row = df.loc[df["date"] == end_date] - - if start_row.empty or end_row.empty: - return 0.0 - start_rate = float(start_row["rate"].iloc[0]) - end_rate = float(end_row["rate"].iloc[0]) + start_rate = float(df["rate"].iloc[0]) + end_rate = float(df["rate"].iloc[-1]) if start_rate == 0.0: return 0.0 @@ -94,18 +88,14 @@ def get_cumulative_return(df: pd.DataFrame, start_date: str, end_date: str) -> f return (end_rate - start_rate) / start_rate * 100 -def get_strongest_weakest_days( - df: pd.DataFrame, start_date: str, end_date: str -) -> dict: - period_df = df[(df["date"] >= start_date) & (df["date"] <= end_date)] - - if period_df.empty or len(period_df) < 2: +def get_strongest_weakest_days(df: pd.DataFrame) -> dict: + if df.empty or len(df) < 2: return { "strongest_day": {"date": None, "pct_change": 0.0}, "weakest_day": {"date": None, "pct_change": 0.0}, } - pct_series = period_df.loc[:, "rate"].pct_change() * 100 + pct_series = df.loc[:, "rate"].pct_change() * 100 valid_pct = pct_series.dropna() if valid_pct.empty: @@ -119,11 +109,11 @@ def get_strongest_weakest_days( return { "strongest_day": { - "date": period_df.loc[max_idx, "date"], + "date": df.loc[max_idx, "date"], "pct_change": round(float(pct_series.loc[max_idx]), 2), }, "weakest_day": { - "date": period_df.loc[min_idx, "date"], + "date": df.loc[min_idx, "date"], "pct_change": round(float(pct_series.loc[min_idx]), 2), }, } @@ -131,13 +121,9 @@ def get_strongest_weakest_days( def add_rolling_volatility(df: pd.DataFrame, window: int = 3) -> pd.DataFrame: result = df.copy() - daily_returns = result["rate"].pct_change() * 100 - result["rolling_volatility"] = daily_returns.rolling( window=window, min_periods=1 ).std() - result["rolling_volatility"] = result["rolling_volatility"].fillna(0.0) - return result diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index a3cf161..a0a2d60 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -72,12 +72,12 @@ def test_get_cumulative_return(): "rate": [1.00, 1.10, 1.21], } test_df = pd.DataFrame(test_timesseries) - resault = get_cumulative_return(test_df, "2026-05-01", "2026-05-02") - assert resault == pytest.approx(10.0) + resault = get_cumulative_return(test_df) + assert resault == pytest.approx(21.0) # Egde case empty_df = pd.DataFrame(columns=["date", "rate"]) - result = get_cumulative_return(empty_df, "2026-05-01", "2026-05-02") + result = get_cumulative_return(empty_df) assert result == 0.0 @@ -88,10 +88,10 @@ def test_get_strongest_weakest_days(): } test_df = pd.DataFrame(test_timeseries) - result = get_strongest_weakest_days(test_df, "2026-05-01", "2026-05-03") + result = get_strongest_weakest_days(test_df) assert result == { - "strongest_day": {"date": "2026-05-02", "pct_change": 20.0}, + "strongest_day": {'date': '2026-05-04', 'pct_change': 75.44}, "weakest_day": {"date": "2026-05-03", "pct_change": -5.0}, } @@ -101,7 +101,7 @@ def test_get_strongest_weakest_days(): "rate": [1.15, 1.15, 1.15], } flat_df = pd.DataFrame(flat_timeseries) - result = get_strongest_weakest_days(flat_df, "2026-05-01", "2026-05-03") + result = get_strongest_weakest_days(flat_df) assert result == { "strongest_day": {"date": "2026-05-02", "pct_change": 0.0}, "weakest_day": {"date": "2026-05-02", "pct_change": 0.0}, From cb8a6c99f02d17e27de3112ad8187270b42430a0 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 11 Jul 2026 16:21:37 +0100 Subject: [PATCH 12/12] style(#34): formatting the code --- tests/test_trend_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_trend_metrics.py b/tests/test_trend_metrics.py index a0a2d60..5a3caac 100644 --- a/tests/test_trend_metrics.py +++ b/tests/test_trend_metrics.py @@ -91,7 +91,7 @@ def test_get_strongest_weakest_days(): result = get_strongest_weakest_days(test_df) assert result == { - "strongest_day": {'date': '2026-05-04', 'pct_change': 75.44}, + "strongest_day": {"date": "2026-05-04", "pct_change": 75.44}, "weakest_day": {"date": "2026-05-03", "pct_change": -5.0}, }