[AI] SISC2-37 [FEAT] transform 학습 파일 저장기능 구현#71
Conversation
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... 📒 Files selected for processing (2)
Tip CodeRabbit can approve the review once all CodeRabbit's comments are resolved.Enable the Walkthrough트랜스포머 모듈을 모듈화해 추론/학습 파이프라인을 분리하고, Ollama LLM 클라이언트 중앙화(get_ollama_client), Finder의 예외 처리 강화, import 경로 정리, 새로운 유틸리티·테스트 스크립트 및 학습 인프라 추가 등이 포함된 리팩토링입니다. Changes
Sequence Diagram(s)sequenceDiagram
participant Finder as Finder (AI/finder/main.py)
participant LLM as llm_clients.get_ollama_client()
participant Ollama as Ollama Server
Finder->>LLM: get_ollama_client()
LLM->>Ollama: GET /api/tags (health)
alt 서버 응답
Ollama-->>LLM: models list
LLM->>LLM: 모델 존재 여부 확인
alt 모델 존재
LLM-->>Finder: Ollama 인스턴스 반환
Finder->>Finder: LLM 초기화 후 작업 진행
else 모델 없음
LLM-->>Finder: RuntimeError (model not available)
Finder->>Finder: 에러 로깅 및 빈 결과 반환
end
else 연결 실패
Ollama-->>LLM: Connection Error
LLM-->>Finder: RuntimeError (connection failed)
Finder->>Finder: 에러 로깅 및 빈 결과 반환
end
sequenceDiagram
participant Pipeline as Pipeline (AI/libs/core/pipeline.py)
participant Config as Config File
participant Finder as Finder
participant Transformer as Transformer (modules/inference)
participant DB as Database
Pipeline->>Config: load configs/config.json
Config-->>Pipeline: config dict
Pipeline->>Finder: run_weekly_finder() (하드코딩 티커)
Finder-->>Pipeline: top_tickers
alt Finder 성공
Pipeline->>Transformer: run_transformer(...) -> run_inference
Transformer->>Transformer: build_features() -> sequences -> scale -> predict
Transformer-->>Pipeline: logs DataFrame
Pipeline->>DB: save results
DB-->>Pipeline: OK
else Finder 실패
Pipeline->>Pipeline: 경고 로깅 및 중단
end
sequenceDiagram
participant Train as Training (train_transformer.py)
participant Yahoo as Yahoo Finance
participant Features as Features (features.py)
participant Model as Transformer Model
Train->>Yahoo: _fetch_yahoo_ohlcv(ticker, range)
Yahoo-->>Train: OHLCV 데이터
Train->>Features: build_features(df)
Features-->>Train: feature DataFrame
Train->>Train: _label_by_future_return(), _build_sequences(), _fit_scaler_on_train()
Train->>Model: build_transformer_classifier()
Model-->>Train: model instance
Train->>Model: model.fit(X_train, y_train)
Model-->>Train: training history
Train->>Train: weights & scaler 저장
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50분
Possibly related PRs
Suggested reviewers
시
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 13
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
AI/configs/config.json (1)
2-18: 하드코딩된 데이터베이스 자격증명을 환경변수로 이동하세요.데이터베이스 호스트, 사용자명, 비밀번호가 코드에 직접 노출되어 있습니다. 이는 심각한 보안 위험입니다. 자격증명을 환경변수나 보안 vault로 이동해야 합니다.
예시:
import os config = { "db": { "host": os.environ.get("DB_HOST"), "user": os.environ.get("DB_USER"), "password": os.environ.get("DB_PASSWORD"), "dbname": os.environ.get("DB_NAME"), "port": int(os.environ.get("DB_PORT", 5432)) } }또는
.env파일을 사용하고.gitignore에 추가하세요.AI/libs/core/pipeline.py (2)
35-56: DB 설정 부재 시 즉시 중단하지 않아 KeyError가 발생합니다
configs/config.json이 없거나db섹션이 비어 있으면db_config는{}가 되고, 이후fetch_ohlcv()→get_db_conn()호출에서'host'KeyError가 나며 파이프라인이 바로 죽습니다. 설정이 비어 있을 때는 Transformer 단계를 진행하지 말고 안전하게 종료하도록 방어 로직을 넣어주세요.try: with open(os.path.join(project_root, 'configs', 'config.json'), 'r') as f: config = json.load(f) except FileNotFoundError: print("Config file not found") - except json.JSONDecodeError: - print("Invalid JSON format in config file") - db_config = (config or {}).get("db", {}) # ★ db 섹션만 추출 + return pd.DataFrame() + except json.JSONDecodeError: + print("Invalid JSON format in config file") + return pd.DataFrame() + db_config = (config or {}).get("db", {}) # ★ db 섹션만 추출 + if not db_config: + print("DB 설정이 없어 Transformer 모듈을 실행할 수 없습니다.") + return pd.DataFrame()
125-141: report_DB 설정이 없을 때도 커넥션을 열어 예외가 납니다
config.json이 없거나report_DB섹션이 비어 있으면 여기서도get_db_conn()이'host'KeyError를 일으켜 파이프라인이 중단됩니다. DB 설정이 없을 때는 저장 단계를 건너뛰도록 가드해 주세요.db_config = config.get("report_DB", {}) + if not db_config: + print("[WARN] report_DB 설정이 없어 리포트를 저장하지 않습니다.") + return conn = get_db_conn(db_config)
🧹 Nitpick comments (3)
AI/libs/llm_clients/ollama_client.py (2)
21-33: 너무 광범위한 예외 처리를 개선하세요.Line 32에서 모든 예외를 포착하고 있어 예상치 못한 오류를 숨길 수 있습니다. 구체적인 예외 타입을 지정하는 것이 좋습니다.
다음과 같이 개선할 수 있습니다:
- except Exception: + except (requests.exceptions.RequestException, KeyError, ValueError, TypeError): return False
35-68: 예외 메시지 처리 개선을 고려하세요.현재 긴 예외 메시지가 함수 내부에 하드코딩되어 있습니다. 유지보수성을 위해 메시지를 상수로 분리하거나 커스텀 예외 클래스를 사용하는 것을 고려해보세요.
예시:
class OllamaConnectionError(RuntimeError): def __init__(self, base_url: str): msg = ( f"[연결 실패] Ollama 서버에 접속할 수 없습니다. llama3.2 설치 여부 확인해주세요.\n" f"- base_url: {base_url}\n" f"- 조치: (1) 'ollama serve' 실행 여부 확인 (2) 방화벽/프록시 (NO_PROXY=localhost,127.0.0.1) (3) 11434 포트 개방\n" f"- 테스트: curl {base_url}/api/tags" ) super().__init__(msg)AI/tests/test_transfomer.py (1)
100-100: 코드 간소화 가능 (선택적).
config는 이미 91번 라인에서 빈 딕셔너리로 초기화되었으므로config or {}는 불필요합니다.다음과 같이 간소화할 수 있습니다:
- db_config = (config or {}).get("db", {}) # fetch_ohlcv에 그대로 넘김 + db_config = config.get("db", {}) # fetch_ohlcv에 그대로 넘김
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
transformer/scaler/scaler.pklis excluded by!**/*.pkl
📒 Files selected for processing (17)
.gitignore(1 hunks)AI/configs/config.json(1 hunks)AI/finder/main.py(1 hunks)AI/libs/core/pipeline.py(3 hunks)AI/libs/llm_clients/__init__.py(1 hunks)AI/libs/llm_clients/ollama_client.py(1 hunks)AI/libs/utils/__init__.py(1 hunks)AI/libs/utils/fetch_ohlcv.py(2 hunks)AI/requirements.txt(2 hunks)AI/tests/quick_db_check.py(1 hunks)AI/tests/test_transfomer.py(1 hunks)AI/transformer/__init__.py(1 hunks)AI/transformer/main.py(2 hunks)AI/transformer/modules/features.py(1 hunks)AI/transformer/modules/inference.py(1 hunks)AI/transformer/training/__init__.py(1 hunks)AI/transformer/training/train_transformer.py(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (10)
AI/libs/llm_clients/__init__.py (1)
AI/libs/llm_clients/ollama_client.py (1)
get_ollama_client(35-68)
AI/transformer/training/__init__.py (1)
AI/transformer/training/train_transformer.py (1)
train_transformer_classifier(111-286)
AI/tests/test_transfomer.py (2)
AI/transformer/main.py (1)
run_transformer(15-82)AI/libs/utils/fetch_ohlcv.py (1)
fetch_ohlcv(7-41)
AI/transformer/training/train_transformer.py (2)
AI/transformer/modules/features.py (1)
build_features(90-131)AI/transformer/modules/models.py (1)
build_transformer_classifier(16-44)
AI/finder/main.py (3)
AI/libs/llm_clients/ollama_client.py (1)
get_ollama_client(35-68)AI/libs/utils/news_processing.py (1)
get_weekly_news_summary(163-205)AI/finder/ticker_selector.py (1)
select_top_stocks(61-156)
AI/libs/utils/__init__.py (2)
AI/libs/utils/fetch_ohlcv.py (1)
fetch_ohlcv(7-41)AI/libs/utils/get_db_conn.py (1)
get_db_conn(3-12)
AI/libs/core/pipeline.py (3)
AI/transformer/main.py (1)
run_transformer(15-82)AI/libs/utils/fetch_ohlcv.py (1)
fetch_ohlcv(7-41)AI/libs/utils/get_db_conn.py (1)
get_db_conn(3-12)
AI/transformer/modules/inference.py (2)
AI/transformer/modules/models.py (1)
build_transformer_classifier(16-44)AI/transformer/modules/features.py (1)
build_features(90-131)
AI/transformer/main.py (1)
AI/transformer/modules/inference.py (1)
run_inference(48-198)
AI/libs/utils/fetch_ohlcv.py (1)
AI/libs/utils/get_db_conn.py (1)
get_db_conn(3-12)
🪛 Ruff (0.14.2)
AI/tests/quick_db_check.py
42-42: String contains ambiguous ℹ (INFORMATION SOURCE). Did you mean i (LATIN SMALL LETTER I)?
(RUF001)
44-44: Do not catch blind exception: Exception
(BLE001)
AI/tests/test_transfomer.py
65-65: Consider moving this statement to an else block
(TRY300)
71-71: Standard pseudo-random generators are not suitable for cryptographic purposes
(S311)
97-97: Do not catch blind exception: Exception
(BLE001)
141-141: Avoid specifying long messages outside the exception class
(TRY003)
149-149: Standard pseudo-random generators are not suitable for cryptographic purposes
(S311)
AI/libs/llm_clients/ollama_client.py
17-17: Consider moving this statement to an else block
(TRY300)
31-31: Consider moving this statement to an else block
(TRY300)
32-32: Do not catch blind exception: Exception
(BLE001)
49-54: Avoid specifying long messages outside the exception class
(TRY003)
57-61: Avoid specifying long messages outside the exception class
(TRY003)
AI/transformer/training/train_transformer.py
82-82: Unused function argument: feats
(ARG001)
155-155: Avoid specifying long messages outside the exception class
(TRY003)
162-162: Avoid specifying long messages outside the exception class
(TRY003)
165-165: Avoid specifying long messages outside the exception class
(TRY003)
227-227: Avoid specifying long messages outside the exception class
(TRY003)
282-282: Value being cast to int is already an integer
Remove unnecessary int call
(RUF046)
283-283: zip() without an explicit strict= parameter
Add explicit value for parameter strict=
(B905)
299-299: Avoid specifying long messages outside the exception class
(TRY003)
344-344: Abstract raise to an inner function
(TRY301)
344-344: Avoid specifying long messages outside the exception class
(TRY003)
369-369: Do not catch blind exception: Exception
(BLE001)
372-372: Avoid specifying long messages outside the exception class
(TRY003)
AI/finder/main.py
24-24: Do not catch blind exception: Exception
(BLE001)
45-45: Do not catch blind exception: Exception
(BLE001)
66-66: Do not catch blind exception: Exception
(BLE001)
AI/transformer/modules/features.py
107-107: Ambiguous variable name: O
(E741)
107-107: Local variable O is assigned to but never used
Remove assignment to unused variable O
(F841)
AI/transformer/modules/inference.py
41-41: Do not catch blind exception: Exception
(BLE001)
53-53: Unused function argument: pred_h
(ARG001)
56-56: Unused function argument: interval
(ARG001)
92-92: Avoid specifying long messages outside the exception class
(TRY003)
151-151: Do not catch blind exception: Exception
(BLE001)
157-157: Multiple statements on one line (semicolon)
(E702)
159-159: Multiple statements on one line (semicolon)
(E702)
161-161: Multiple statements on one line (semicolon)
(E702)
190-190: Do not catch blind exception: Exception
(BLE001)
🔇 Additional comments (12)
AI/libs/llm_clients/ollama_client.py (1)
11-19: LGTM!서버 헬스체크 로직이 적절하게 구현되어 있습니다. 타임아웃 설정과 예외 처리가 올바르게 되어 있습니다.
AI/transformer/modules/features.py (3)
1-22: LGTM!FEATURES 상수 정의가 명확하고, 포함된 기술 지표들이 적절합니다. CLOSE_RAW를 마지막에 배치하여 스케일링 제외 용도로 사용하는 것도 좋은 설계입니다.
25-88: LGTM!기술 지표 계산 함수들이 잘 구현되어 있습니다. Wilder의 RSI/ATR 계산, NaN 처리, 분모가 0인 경우 처리 등이 적절하게 되어 있습니다.
90-131: LGTM!build_features 함수가 잘 구현되어 있습니다. 컬럼명 정규화, 기술 지표 계산, NaN 처리가 체계적으로 이루어지고 있습니다.
AI/libs/utils/__init__.py (1)
2-8: LGTM!패키지 초기화가 적절하게 구성되어 있습니다.
__all__을 통해 공개 API를 명시적으로 정의한 것이 좋습니다.AI/tests/test_transfomer.py (7)
1-36: LGTM! 임포트와 프로젝트 구조 설정이 적절합니다.파일 구조와 임포트가 명확하고, 테스트 목적과 실행 방법이 docstring에 잘 문서화되어 있습니다.
43-73: 재시도 로직이 잘 구현되어 있습니다.지수 백오프와 지터를 사용한 재시도 메커니즘이 적절합니다. Static analysis 경고들은 이 컨텍스트에서 false positive입니다:
random.uniform사용은 암호화가 아닌 지터용이므로 적절함- 재시도 래퍼에서
Exception포괄 처리는 적절함- try 블록 내 return은 이 패턴에서 자연스러움
109-117: LGTM! Transformer 설정이 적절합니다.features 목록에 "adjusted_close"가 포함되어 있으며, 이는
fetch_ohlcv가 반환하는 스키마와 일치합니다.
138-146: LGTM! 스키마 검증과 날짜 변환이 견고합니다.필수 컬럼 검증과 날짜 타입 변환 로직이 적절하게 구현되어 있습니다. 누락된 컬럼을 명확히 보고하고, 날짜 파싱 오류를 안전하게 처리합니다.
151-169: LGTM! Transformer 호출이 정확합니다.데이터 병합 로직과
run_transformer호출 시그니처가 모두 올바르게 구현되어 있습니다. 빈 데이터에 대한 조기 종료 처리도 적절합니다.
171-202: LGTM! 결과 처리 로직이 포괄적이고 안전합니다.결과 추출, 변환, 통계 출력이 방어적으로 구현되어 있습니다. 빈 데이터프레임과 누락된 컬럼에 대한 체크가 적절합니다.
208-209: LGTM! 엔트리포인트가 표준 패턴을 따릅니다.
.gitignore
Outdated
| ################################################################################ | ||
| # 이 .gitignore 파일은 Microsoft(R) Visual Studio에서 자동으로 만들어졌습니다. | ||
| ################################################################################ | ||
|
|
||
| # 환경 변수 & 민감 정보 | ||
| .env | ||
| *.secret | ||
| *.key | ||
| *.pem | ||
|
|
||
| # 로그 | ||
| *.log | ||
|
|
||
| # ===== Java (Spring Boot) ===== | ||
| /target/ | ||
|
|
||
| # ===== Node.js (React / Vite) ===== | ||
| node_modules/ | ||
| dist/ | ||
|
|
||
| # ===== Python (AI / Data) ===== | ||
| __pycache__/ | ||
| .ipynb_checkpoints/ | ||
| *.pyc | ||
| /venv/ | ||
| /env | ||
| /.vs |
There was a problem hiding this comment.
🧩 Analysis chain
.gitignore 파일이 과도하게 단순화되어 보안 및 규정 준수 위험 발생
.gitignore가 광범위한 무시 패턴에서 최소한의 패턴(env, /.vs)으로 급격히 단순화되었습니다. 이는 다음과 같은 심각한 위험을 초래합니다:
보안 및 규정 준수 문제:
- 민감한 정보(API 키, 자격증,
.env파일 등)가 실수로 커밋될 수 있음 - PR 설명에서
weights디렉토리에 학습 데이터를 저장한다고 언급했으나, 이 폴더가 명시적으로 무시되지 않음 - 개인식별정보(PII) 또는 모델 아티팩트가 저장소에 노출될 가능성
개발 환경 관련 문제:
- Python 캐시(
__pycache__,*.pyc,.egg-info)가 추적되어 저장소 오염 야기 - 개발자별 IDE 설정(
PyCharm,VS Code,*.swp,.vscode등)이 커밋되어 충돌 유발 - OS 특정 파일(
.DS_Store,Thumbs.db등)이 추적됨
권장 사항:
현재 변경사항의 의도를 확인하고, 최소한 다음 패턴들을 복구하거나 추가하십시오:
- 환경/의존성:
venv/,.venv/,*.egg-info/,dist/,build/,*.whl - Python 캐시:
__pycache__/,*.py[cod],*.so - IDE:
.vscode/,.idea/,*.swp,*.sublime-* - OS:
.DS_Store,Thumbs.db,.directory - 로그/임시:
*.log,/tmp/,*.tmp - 모델 아티팩트:
/weights/(학습 데이터 저장 관련) - 시스템:
.env,.env.*,*.pid
이 변경이 의도적인지 확인해주시기 바랍니다. 의도적이라면, 보안 및 규정 준수 영향에 대해 검토팀과 논의하시기 바랍니다.
🏁 Script executed:
#!/bin/bash
# Show git diff for .gitignore to see before/after
git diff HEAD -- .gitignore | head -100Length of output: 0
🏁 Script executed:
#!/bin/bash
# List root directories/files to assess what should be ignored
ls -la | head -30Length of output: 819
🏁 Script executed:
#!/bin/bash
# Search for 'weights' references in PR context or config files
rg -i "weights" --type-add 'config:*.md,*.txt,*.json' -n -C2 2>/dev/null | head -50Length of output: 3415
🏁 Script executed:
#!/bin/bash
# Check if weights directory exists anywhere in repo
fd -t d "weights|data|models|artifacts" -x ls -ld {} \; 2>/dev/null | head -20Length of output: 197
🏁 Script executed:
#!/bin/bash
# Display full current .gitignore content
cat .gitignoreLength of output: 235
🏁 Script executed:
#!/bin/bash
# Check git status of critical directories
git status AI/transformer/weights AI/data 2>&1 | head -30Length of output: 61
🏁 Script executed:
#!/bin/bash
# Check if weights/data files are tracked by git
git ls-files AI/transformer/weights AI/data 2>/dev/null | head -20Length of output: 344
🏁 Script executed:
#!/bin/bash
# Look for .gitignore history or backups
find . -name "*gitignore*" -type f 2>/dev/nullLength of output: 33
🏁 Script executed:
#!/bin/bash
# Check git log for .gitignore changes
git log --oneline .gitignore 2>/dev/null | head -5Length of output: 128
🏁 Script executed:
#!/bin/bash
# Check backend/.gitignore for reference patterns
cat backend/.gitignoreLength of output: 573
🏁 Script executed:
#!/bin/bash
# Check commit message for context
git show 5cbb3c7 --stat | head -30Length of output: 1618
.gitignore 단순화가 의도적으로 수행되었으나 데이터 파일 노출 위험 존재
검증 결과, .gitignore 단순화(32줄 → 6줄)는 의도적인 결정으로 확인되었습니다. 동일 커밋(5cbb3c7)에서 AI/transformer/weights/initial.weights.h5와 transformer/scaler/scaler.pkl이 추가되었으며, 이는 모델 가중치를 버전 관리하려는 설계 결정으로 보입니다.
즉시 조치 필요:
- 학습 데이터 파일(
AI/data/input_data/news_summary_*.csv,AI/data/stability_score_2025.csv)이 이미 저장소에 추적 중입니다. 이들은.gitignore에 추가되어야 합니다.
팀 검토 필요:
- 모델 가중치를 git으로 버전 관리하는 것이 정책상 적절한지 검토 필요 (DVC 또는 모델 레지스트리 사용 권장)
- 현재 구조는 저장소 크기 및 보안 위험을 초래할 수 있습니다.
추가 권장 사항:
표준 패턴 복구: __pycache__/, *.pyc, .vscode/, .idea/, *.pyc, .DS_Store, *.log 등 (backend/.gitignore 참조)
🤖 Prompt for AI Agents
.gitignore lines 1-6: the simplified .gitignore removed many ignore patterns and
allowed sensitive/large data and model files to be tracked (e.g.,
AI/data/input_data/news_summary_*.csv, AI/data/stability_score_2025.csv and
model weights under AI/transformer); update .gitignore to add the specific data
file patterns (AI/data/input_data/news_summary_*.csv and
AI/data/stability_score_2025.csv) and common ignores (__pycache__/, *.pyc,
.vscode/, .idea/, .DS_Store, *.log), and then remove tracked large/sensitive
files from git history or untrack them (git rm --cached) and replace model
weight tracking with DVC or a model registry per team policy.
| @@ -1,4 +1,4 @@ | |||
| { | |||
| { | |||
There was a problem hiding this comment.
BOM 문자를 제거하세요.
JSON 파일 첫 줄에 BOM 문자()가 추가되었습니다. 이는 JSON 파싱 오류를 일으킬 수 있습니다.
다음과 같이 수정하세요:
-{
+{📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| { | |
| { |
🤖 Prompt for AI Agents
AI/configs/config.json lines 1-1: 파일의 첫 줄에 UTF-8 BOM 문자()가 포함되어 있어 JSON 파서 오류를
유발하므로 해당 BOM 문자를 제거하세요; 편집기(또는 도구)를 사용해 파일을 UTF-8 without BOM 형식으로 저장하거나 파일의 맨
앞에서 보이지 않는 BOM 문자 하나를 삭제한 뒤 저장하면 됩니다.
| return [] | ||
|
|
||
| csv_path = os.path.join(project_root, "data", "stability_score_2025.csv") |
There was a problem hiding this comment.
임시 하드코딩으로 Finder 단계가 무력화됩니다
run_finder() 호출을 주석 처리하고 고정된 티커를 반환하면서 Finder 단계가 완전히 우회됩니다. 이렇게 되면 실제 뉴스/지표 기반 분석 결과가 전혀 반영되지 않아 파이프라인 핵심 기능이 깨집니다. 원래 로직을 복구하고, 필요하면 빈 결과에 대해서만 안전하게 종료하도록 바꿔주세요.
- #top_tickers = run_finder()
- top_tickers = ['AAPL', 'MSFT', 'GOOGL'] # 임시 데이터
+ top_tickers = run_finder()
+ if not top_tickers:
+ print("Finder에서 종목을 찾지 못했습니다.")
+ return []Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In AI/finder/main.py around lines 26 to 28, the Finder stage has been bypassed
by commenting out the run_finder() call and returning a hardcoded ticker list;
restore the original call to run_finder() (uncomment or reintroduce it) and
remove the temporary hardcoded return so the pipeline uses actual news/metric
results, and add a safe early-exit guard that only returns an empty list when
run_finder() legitimately yields no candidates (or raises a handled exception)
so downstream logic remains stable.
There was a problem hiding this comment.
@twq110, 알겠습니다! 다음 패치에서 수정하시는 것으로 확인했습니다.
필요하시면 추적을 위한 이슈를 생성해드릴 수 있습니다. 이슈를 생성하시겠습니까?
| @@ -0,0 +1,8 @@ | |||
| # AI/libs/utils/__init__.py | |||
There was a problem hiding this comment.
BOM 문자를 제거하세요.
파일 첫 줄에 BOM 문자()가 포함되어 있습니다. 이는 인코딩 문제를 일으킬 수 있습니다.
다음과 같이 수정하세요:
-# AI/libs/utils/__init__.py
+# AI/libs/utils/__init__.py📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # AI/libs/utils/__init__.py | |
| # AI/libs/utils/__init__.py |
🤖 Prompt for AI Agents
AI/libs/utils/__init__.py lines 1-1: the file contains a leading BOM character
on the first line; remove the BOM so the file is plain UTF-8 (no BOM). Open the
file in an editor that can show invisible characters or use a tool/command to
strip the BOM, delete the leading invisible character, and re-save the file as
UTF-8 without BOM; verify by reopening and ensuring the first character is the
expected ASCII character (or start of file) and no BOM remains.
| @@ -1,4 +1,4 @@ | |||
| pandas | |||
| pandas | |||
There was a problem hiding this comment.
BOM(Byte Order Mark) 문자를 제거하세요.
파일 첫 줄에 BOM 문자()가 포함되어 있습니다. 이는 인코딩 문제를 일으킬 수 있으며, pip 설치 시 오류를 유발할 수 있습니다.
다음과 같이 수정하세요:
-pandas
+pandas📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| pandas | |
| pandas |
🤖 Prompt for AI Agents
In AI/requirements.txt around lines 1 to 1, the first line contains a BOM (Byte
Order Mark) character before "pandas"; remove the leading BOM so the file is
saved as UTF-8 without BOM and the line begins exactly with "pandas" (no hidden
characters), then re-save the file and commit the change.
AI/transformer/__init__.py
Outdated
| @@ -1,3 +1,3 @@ | |||
| # AI/finder/__init__.py | |||
| # AI/run_transformer/__init__.py | |||
There was a problem hiding this comment.
주석의 파일 경로가 실제 파일 경로와 일치하지 않습니다.
주석에는 AI/run_transformer/__init__.py라고 되어 있지만, 실제 파일 경로는 AI/transformer/__init__.py입니다. 또한 BOM 문자도 제거해야 합니다.
다음과 같이 수정하세요:
-# AI/run_transformer/__init__.py
+# AI/transformer/__init__.py📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # AI/run_transformer/__init__.py | |
| # AI/transformer/__init__.py |
🤖 Prompt for AI Agents
In AI/transformer/__init__.py around lines 1 to 1, the file contains a leading
BOM and an incorrect header comment referencing AI/run_transformer/__init__.py;
remove the BOM (byte order mark) from the top of the file and update the
header/comment so the path matches AI/transformer/__init__.py (or delete the
misleading comment entirely), ensuring the file starts with a normal UTF-8
character and correct path annotation.
| O = df["open"].astype(float) | ||
| H = df["high"].astype(float) | ||
| L = df["low"].astype(float) | ||
| C = df["close"].astype(float) | ||
| V = df["volume"].astype(float) |
There was a problem hiding this comment.
사용하지 않는 변수를 제거하세요.
변수 O (open price)가 할당되었지만 사용되지 않습니다. 코드를 간결하게 유지하기 위해 제거하세요.
다음과 같이 수정하세요:
- O = df["open"].astype(float)
H = df["high"].astype(float)
L = df["low"].astype(float)
C = df["close"].astype(float)
V = df["volume"].astype(float)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| O = df["open"].astype(float) | |
| H = df["high"].astype(float) | |
| L = df["low"].astype(float) | |
| C = df["close"].astype(float) | |
| V = df["volume"].astype(float) | |
| H = df["high"].astype(float) | |
| L = df["low"].astype(float) | |
| C = df["close"].astype(float) | |
| V = df["volume"].astype(float) |
🧰 Tools
🪛 Ruff (0.14.2)
107-107: Ambiguous variable name: O
(E741)
107-107: Local variable O is assigned to but never used
Remove assignment to unused variable O
(F841)
🤖 Prompt for AI Agents
In AI/transformer/modules/features.py around lines 107 to 111, the variable O is
assigned from df["open"] but never used; remove the unused assignment line (O =
df["open"].astype(float)) so only H, L, C, V are created, then run linters/tests
to confirm there are no remaining references to O.
There was a problem hiding this comment.
이거 원래 써야하는데 안쓰는거 이상해. 이슈달아줘
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Create a GitHub issue to track the unused open price variable
gh issue create \
--title "[FEAT] Open price (O) 변수가 features.py에서 정의되었으나 사용되지 않음" \
--body "## 설명
\`AI/transformer/modules/features.py\` 파일의 \`build_features\` 함수에서 open price 변수 \`O\`가 정의되지만 실제로 사용되지 않고 있습니다.
## 위치
- 파일: \`AI/transformer/modules/features.py\`
- 라인: 107-111
## 상세 내용
현재 OHLCV 데이터에서 다음과 같이 변수들이 정의됩니다:
- \`O\` = open price (정의되었으나 미사용)
- \`H\` = high price
- \`L\` = low price
- \`C\` = close price
- \`V\` = volume
Open price는 일부 기술 지표 계산에 필요할 수 있으므로, 이 변수가 어디에서 사용되어야 하는지 검토가 필요합니다.
## 관련 링크
- PR: https://github.com/SISC-IT/sisc-web/pull/71
- 코멘트: https://github.com/SISC-IT/sisc-web/pull/71#discussion_r2483685088
- 요청자: @twq110" \
--assignee twq110
Length of output: 45
@twq110, 이슈를 생성했습니다!
Open price 변수 O가 정의되었으나 사용되지 않는 문제를 추적하기 위한 이슈입니다:
- Issue [FEAT] Open price (O) 변수가 features.py에서 정의되었으나 사용되지 않음 #72: [FEAT] Open price (O) 변수가 features.py에서 정의되었으나 사용되지 않음 #72
해당 이슈에서 O 변수가 어떤 기술 지표 계산에 사용되어야 하는지 검토하실 수 있습니다. 이슈는 담당자님께 할당되었습니다.
| @@ -0,0 +1,3 @@ | |||
| # AI/training/train_transformer/__init__.py | |||
There was a problem hiding this comment.
BOM 문자와 주석의 파일 경로 오류를 수정하세요.
파일 첫 줄에 BOM 문자()가 포함되어 있으며, 주석의 경로가 실제 파일 경로와 다릅니다.
다음과 같이 수정하세요:
-# AI/training/train_transformer/__init__.py
+# AI/transformer/training/__init__.py📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # AI/training/train_transformer/__init__.py | |
| # AI/transformer/training/__init__.py |
🤖 Prompt for AI Agents
In AI/transformer/training/__init__.py around line 1, remove the leading BOM
character (U+FEFF) from the file start and update the file-header comment path
to the correct path (AI/transformer/training/__init__.py) so the comment matches
the actual file location; save the file without BOM (UTF-8 without BOM) and
ensure the corrected comment is the first line.
| from .train_transformer import train_transformer_classifier | ||
| __all__ = ["run_transformer"] |
There was a problem hiding this comment.
import와 export가 일치하지 않습니다.
train_transformer_classifier를 import하지만 run_transformer를 export하고 있습니다. 이는 런타임에 ImportError를 발생시킵니다.
다음 중 하나로 수정하세요:
옵션 1: export를 import와 일치시키기
-__all__ = ["run_transformer"]
+__all__ = ["train_transformer_classifier"]옵션 2: train_transformer_classifier를 run_transformer로 별칭 지정
from .train_transformer import train_transformer_classifier
+
+run_transformer = train_transformer_classifier
+
__all__ = ["run_transformer"]📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| from .train_transformer import train_transformer_classifier | |
| __all__ = ["run_transformer"] | |
| from .train_transformer import train_transformer_classifier | |
| __all__ = ["train_transformer_classifier"] |
| from .train_transformer import train_transformer_classifier | |
| __all__ = ["run_transformer"] | |
| from .train_transformer import train_transformer_classifier | |
| run_transformer = train_transformer_classifier | |
| __all__ = ["run_transformer"] |
🤖 Prompt for AI Agents
AI/transformer/training/__init__.py lines 2-3: the module imports
train_transformer_classifier but exports run_transformer, causing an
ImportError; fix by making the import/export consistent — either change __all__
to ["train_transformer_classifier"] to export the imported name, or alias the
import with from .train_transformer import train_transformer_classifier as
run_transformer and keep __all__ = ["run_transformer"] so the exported name
matches the public API.
.gitignore 의도치 않은 삭제 복구
DB연결 실패시 종료 코드 실행
run_transformer 를 transformer로 변경
| O = df["open"].astype(float) | ||
| H = df["high"].astype(float) | ||
| L = df["low"].astype(float) | ||
| C = df["close"].astype(float) | ||
| V = df["volume"].astype(float) |
There was a problem hiding this comment.
이거 원래 써야하는데 안쓰는거 이상해. 이슈달아줘
일부 절대 경로 상대경로로 변경
finder 모듈 project_root 순서 변경
ollma 연결 보조 함수 추가 및 서버 헬스체크 코드 추가
기술지표 유틸 외부로 변경
transformer 학습/추론으로 나누고 학습 데이터를 weights에 저장하도록 변경
테스트 코드 작성
Summary by CodeRabbit
릴리스 노트
New Features
Bug Fixes
Tests
Chores