""" coins.db에서 전 간격 봉 데이터를 로드합니다. """ from __future__ import annotations import pandas as pd from config import DOWNLOAD_INTERVALS, DOWNLOAD_INTERVALS_WM, SYMBOL from deepcoin.data.candle_intervals import interval_display_label def interval_label(interval: int) -> str: """봉 간격 표시 라벨.""" return interval_display_label(interval) def _all_load_intervals() -> tuple[int, ...]: seen: set[int] = set() out: list[int] = [] for iv in (*DOWNLOAD_INTERVALS, *DOWNLOAD_INTERVALS_WM): if iv not in seen: seen.add(iv) out.append(iv) return tuple(out) def load_frames_from_db( monitor, symbol: str, lookback_days: int | None = None, ) -> dict[int, pd.DataFrame]: """ coins.db에서 DOWNLOAD_INTERVALS 전부 로드·지표 계산. Args: monitor: Monitor 인스턴스. symbol: 코인 심볼. lookback_days: 지정 시 간격별로 해당 일수만큼 DB에서 더 많이 읽습니다. Returns: 간격(분) → OHLCV+지표 DataFrame. """ frames: dict[int, pd.DataFrame] = {} for iv in _all_load_intervals(): db_max = None if lookback_days is not None: db_max = monitor.db_row_limit_for_interval(iv, lookback_days) df = monitor.get_coin_some_data(symbol, iv, db_max_rows=db_max) if df is None or df.empty: print(f" [{interval_label(iv)}] DB/API 데이터 없음 — 스킵") continue df = monitor.calculate_technical_indicators(df) frames[iv] = df print(f" [{interval_label(iv)}] {len(df)}봉 {df.index[0]} ~ {df.index[-1]}") return frames