Skip to content

Commit

Permalink
refactor(timeframe): move timeframe_to_one_minutes function to utils
Browse files Browse the repository at this point in the history
- 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.
  • Loading branch information
saleh-mir committed Dec 28, 2024
1 parent 551e424 commit 2044268
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 48 deletions.
33 changes: 0 additions & 33 deletions jesse/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
43 changes: 43 additions & 0 deletions jesse/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)}.'
)
15 changes: 0 additions & 15 deletions tests/test_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 2044268

Please sign in to comment.