11# AI/modules/signal/core/dataset_builder.py
2+ import pandas as pd
3+ from typing import Union , Optional
24
35from AI .modules .signal .core .data_loader import DataLoader
4- from AI .modules .features .technical import add_technical_indicators
5- from AI .modules .features .market_derived import add_macro_features
6+ from AI .modules .features .processor import FeatureProcessor
7+ from AI .modules .features .market_derived import add_market_changes , add_macro_changes
68
7- def get_standard_training_data ( start_date : str , end_date : str ) -> pd .DataFrame :
9+ def apply_strict_nan_rules ( df : pd . DataFrame ) -> pd .DataFrame :
810 """
9- 데이터 수집/전처리 코드를 짤 필요 없이 이 함수만 호출하면 됩니다.
10- 명세서에 정의된 모든 원천/파생 피처가 포함된 DataFrame을 반환합니다.
11+ SISC 데이터 명세서에 따른 엄격한 결측치 처리 규칙을 적용합니다.
1112 """
12- # 1. DB에서 원천 데이터(Raw) 로드
13- loader = DataLoader ()
14- raw_df = loader .load_data_from_db (start_date , end_date )
13+ df_clean = df .copy ()
14+
15+ macro_cols = ['vix_close' , 'vix_change_rate' , 'us10y' , 'us10y_chg' , 'dxy_close' , 'dxy_chg' ]
16+ available_macro = [col for col in macro_cols if col in df_clean .columns ]
17+
18+ if available_macro :
19+ df_clean [available_macro ] = df_clean [available_macro ].ffill ()
20+
21+ df_clean = df_clean .dropna ().reset_index (drop = True )
22+ return df_clean
23+
24+ def get_standard_training_data (
25+ start_date_or_df : Union [str , pd .DataFrame ],
26+ end_date : Optional [str ] = None
27+ ) -> pd .DataFrame :
28+ """
29+ SISC 파이프라인 표준 학습 데이터셋 생성기. (학습/추론 겸용)
30+ - 사용법 1 (학습용): get_standard_training_data('2020-01-01', '2024-01-01') -> DB 조회
31+ - 사용법 2 (추론용): get_standard_training_data(df) -> DB 생략하고 전처리만 수행
32+ """
33+ # 1. 입력 타입에 따른 분기 처리 (DB 로드 vs 직접 주입)
34+ if isinstance (start_date_or_df , pd .DataFrame ):
35+ df = start_date_or_df .copy ()
36+ else :
37+ loader = DataLoader ()
38+ df = loader .load_data_from_db (start_date_or_df , end_date )
39+ if df is None or df .empty :
40+ raise ValueError (f"지정된 기간({ start_date_or_df } ~ { end_date } )의 데이터를 불러오지 못했습니다." )
41+
42+ # 2. 파생 피처 레이어 계산 (1차: 기초 변화율 연산)
43+ df = add_market_changes (df )
44+ df = add_macro_changes (df )
1545
16- # 2. 파생 피처 레이어 계산
17- # (팀장님이 기존 features 모듈을 활용해 모든 지표를 미리 계산해서 붙여줌)
18- df = add_technical_indicators (raw_df ) # rsi_14, macd 등 추가
19- df = add_macro_features (df ) # vix_z_score, us10y_chg 등 추가
46+ # 3. 파생 피처 레이어 계산 (2차: FeatureProcessor를 통한 심화 지표 일괄 연산)
47+ processor = FeatureProcessor (df )
48+ df = processor .execute_pipeline ()
2049
21- # 3. 결측치(NaN) 처리
22- # Market은 Drop, Macro는 ffill 등...
50+ # 4. 결측치(NaN) 처리 규칙 적용
2351 df = apply_strict_nan_rules (df )
2452
2553 return df
0 commit comments