From 20442683b4fba857b3c50649c6b6bf7554f47bb0 Mon Sep 17 00:00:00 2001 From: Saleh Mir Date: Sat, 28 Dec 2024 22:12:30 +0330 Subject: [PATCH] refactor(timeframe): move timeframe_to_one_minutes function to utils - Removed the timeframe_to_one_minutes function from helpers.py and added it to utils.py for better organization. - Updated the function to include detailed docstring for clarity on its usage and supported timeframes. - Adjusted test cases to reflect the new location of the function, ensuring comprehensive coverage in tests. --- jesse/helpers.py | 33 --------------------------------- jesse/utils.py | 43 +++++++++++++++++++++++++++++++++++++++++++ tests/test_helpers.py | 15 --------------- tests/test_utils.py | 15 +++++++++++++++ 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/jesse/helpers.py b/jesse/helpers.py index 5a3907006..308a7d24d 100644 --- a/jesse/helpers.py +++ b/jesse/helpers.py @@ -859,39 +859,6 @@ def _print_error(msg: str) -> None: print(color('====================================', 'red')) -@lru_cache -def timeframe_to_one_minutes(timeframe: str) -> int: - from jesse.enums import timeframes - from jesse.exceptions import InvalidTimeframe - - dic = { - timeframes.MINUTE_1: 1, - timeframes.MINUTE_3: 3, - timeframes.MINUTE_5: 5, - timeframes.MINUTE_15: 15, - timeframes.MINUTE_30: 30, - timeframes.MINUTE_45: 45, - timeframes.HOUR_1: 60, - timeframes.HOUR_2: 60 * 2, - timeframes.HOUR_3: 60 * 3, - timeframes.HOUR_4: 60 * 4, - timeframes.HOUR_6: 60 * 6, - timeframes.HOUR_8: 60 * 8, - timeframes.HOUR_12: 60 * 12, - timeframes.DAY_1: 60 * 24, - timeframes.DAY_3: 60 * 24 * 3, - timeframes.WEEK_1: 60 * 24 * 7, - timeframes.MONTH_1: 60 * 24 * 30, - } - - try: - return dic[timeframe] - except KeyError: - all_timeframes = [timeframe for timeframe in class_iter(timeframes)] - raise InvalidTimeframe( - f'Timeframe "{timeframe}" is invalid. Supported timeframes are {", ".join(all_timeframes)}.') - - def timestamp_to_arrow(timestamp: int) -> arrow.arrow.Arrow: return arrow.get(timestamp / 1000) diff --git a/jesse/utils.py b/jesse/utils.py index e4c0170d1..9770f0c9e 100644 --- a/jesse/utils.py +++ b/jesse/utils.py @@ -345,3 +345,46 @@ def calculate_alpha_beta(returns1: np.ndarray, returns2: np.ndarray) -> tuple: alpha = model.params[0] # Intercept (alpha) beta = model.params[1] # Slope (beta) return alpha, beta + + +def timeframe_to_one_minutes(timeframe: str) -> int: + """ + Converts a given timeframe to its equivalent in minutes. + + :param timeframe: str - The timeframe to convert. Supported timeframes include: + - '1m', '3m', '5m', '15m', '30m', '45m', '1h', '2h', '3h', '4h', '6h', '8h', '12h', + '1d', '3d', '1w', '1M'. + :return: int - The equivalent number of minutes for the given timeframe. + + :raises InvalidTimeframe: If the provided timeframe is not supported. + """ + from jesse.enums import timeframes + from jesse.exceptions import InvalidTimeframe + + dic = { + timeframes.MINUTE_1: 1, + timeframes.MINUTE_3: 3, + timeframes.MINUTE_5: 5, + timeframes.MINUTE_15: 15, + timeframes.MINUTE_30: 30, + timeframes.MINUTE_45: 45, + timeframes.HOUR_1: 60, + timeframes.HOUR_2: 60 * 2, + timeframes.HOUR_3: 60 * 3, + timeframes.HOUR_4: 60 * 4, + timeframes.HOUR_6: 60 * 6, + timeframes.HOUR_8: 60 * 8, + timeframes.HOUR_12: 60 * 12, + timeframes.DAY_1: 60 * 24, + timeframes.DAY_3: 60 * 24 * 3, + timeframes.WEEK_1: 60 * 24 * 7, + timeframes.MONTH_1: 60 * 24 * 30, + } + + try: + return dic[timeframe] + except KeyError: + all_timeframes = [timeframe for timeframe in jh.class_iter(timeframes)] + raise InvalidTimeframe( + f'Timeframe "{timeframe}" is invalid. Supported timeframes are {", ".join(all_timeframes)}.' + ) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index fe6c877db..df91d0676 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -521,21 +521,6 @@ def test_terminate_app(): pass -def test_timeframe_to_one_minutes(): - assert jh.timeframe_to_one_minutes('1m') == 1 - assert jh.timeframe_to_one_minutes('3m') == 3 - assert jh.timeframe_to_one_minutes('5m') == 5 - assert jh.timeframe_to_one_minutes('15m') == 15 - assert jh.timeframe_to_one_minutes('30m') == 30 - assert jh.timeframe_to_one_minutes('1h') == 60 - assert jh.timeframe_to_one_minutes('2h') == 60 * 2 - assert jh.timeframe_to_one_minutes('3h') == 60 * 3 - assert jh.timeframe_to_one_minutes('4h') == 60 * 4 - assert jh.timeframe_to_one_minutes('6h') == 60 * 6 - assert jh.timeframe_to_one_minutes('8h') == 60 * 8 - assert jh.timeframe_to_one_minutes('1D') == 60 * 24 - - def test_timestamp_to_arrow(): arrow_time = arrow.get('2015-08-01') assert jh.timestamp_to_arrow(1438387200000) == arrow_time diff --git a/tests/test_utils.py b/tests/test_utils.py index bb3e40ec6..e3e8f95c2 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -180,3 +180,18 @@ def test_wavelet_denoising(): candles = np.array(test_candles_19) denoised = utils.wavelet_denoising(candles[:, 2], wavelet="sym4", level=1, mode='symmetric', smoothing_factor=2) assert len(candles) == len(denoised) + + +def test_timeframe_to_one_minutes(): + assert utils.timeframe_to_one_minutes("1m") == 1 + assert utils.timeframe_to_one_minutes("3m") == 3 + assert utils.timeframe_to_one_minutes("5m") == 5 + assert utils.timeframe_to_one_minutes("15m") == 15 + assert utils.timeframe_to_one_minutes("30m") == 30 + assert utils.timeframe_to_one_minutes("1h") == 60 + assert utils.timeframe_to_one_minutes("2h") == 60 * 2 + assert utils.timeframe_to_one_minutes("3h") == 60 * 3 + assert utils.timeframe_to_one_minutes("4h") == 60 * 4 + assert utils.timeframe_to_one_minutes("6h") == 60 * 6 + assert utils.timeframe_to_one_minutes("8h") == 60 * 8 + assert utils.timeframe_to_one_minutes("1D") == 60 * 24