
    NtWj                         S r SSKrSSKrSSKJr  SSKJr  SSK	J
r
Jr  SSKJr  SSKJr  SSKJrJr   " S	 S
5      r " S S\5      rg)uW  
Adapter для ExpertEnsemble, чтобы интегрировать его в BenchmarkFramework.

ExpertEnsemble требует OHLCV данные, а BenchmarkFramework работает только с фичами.
Адаптер "оборачивает" ExpertEnsemble и имитирует sklearn-интерфейс fit/predict_proba.
    N)RandomForestClassifier)MultiOutputClassifier)MODEL_CONFIGRANDOM_SEED)logger)ExpertEnsemble)_build_dataset_get_feature_colsc                       \ rS rSrSrS\\   4S jrS\R                  S\
R                  4S jrS\R                  4S jrS	\
R                  4S
 jrS\4S jrS\\   4S jrSrg)ExpertEnsembleAdapter   u  
Адаптер для интеграции ExpertEnsemble в BenchmarkFramework.

Оборачивает ExpertEnsemble + Fusion RF в sklearn-подобный интерфейс.

Args:
    feature_cols: Список базовых фичей для ExpertEnsemble

Example:
    >>> adapter = ExpertEnsembleAdapter(feature_cols=base_features)
    >>> adapter.fit(df, y)
    >>> probs = adapter.predict_proba(df)
feature_colsc                 H    Xl         SU l        SU l        SU l        SU l        g)u}   
Инициализация адаптера.

Args:
    feature_cols: Список базовых фичей (без OHLCV)
NF)r   ensemblefusion_modelfusion_cols	is_fitted)selfr   s     7/home/ai/projects/AI_Strategy/models/experts_adapter.py__init__ExpertEnsembleAdapter.__init__!   s(     )     dfyc                    [         R                  " S[        U R                  5       S35        [        R
                  R                  [        5        [        [        U R                  5      5      U l	        U R                  R                  XR                  SS9  [         R                  " S5        U R                  R                  XR                  5      n[        5        Vs/ s H  oDUR                  ;   d  M  UPM     snU l        [         R                  " S[        U R                  5       S35        [        XU R                  U R                  5      n[!        [        U5      [        U5      5      nXV* S nX&* S n[         R                  " S	[        U5       S
35        [         R                  " S[        U R                  5       35        [         R                  " SUR"                   SUR"                   35        [%        ['        S0 [(        S   D65      U l        U R*                  R-                  XW5        SU l        [         R                  " S5        U $ s  snf )u  
Обучает LSTM экспертов и Fusion RF.

Args:
    df: DataFrame с OHLCV данными и фичами (все колонки)
    y: Target vector/matrix (n_samples, n_targets) или (n_samples,)

Returns:
    self: Для удобства (fluent interface)
z  [Adapter] Training z base features...F)verbosez%  [Adapter] Getting expert signals...z*  [Adapter] Building fusion features from z columns...Nz"  [Adapter] Training Fusion RF on z samples...z    Fusion features: z    X_fusion shape: z, y shape: rfTz+  [Adapter] Fusion RF trained successfully! )r   infolenr   nprandomseedr   r   r   	train_allpredict_allr
   columnsr   r	   minshaper   r   r   r   fitr   )r   r   r   signalscX_fusionmin_len	y_aligneds           r   r)   ExpertEnsembleAdapter.fit.   s    	+C0A0A,B+CCTUV 			{#&s4+<+<'=>$5$5uE 	;=--++B0A0AB (9':N':!2::oA':N@TEUEUAV@WWbcd!"t}}d>N>NO c(mSV,HI&hiL	8X{ST+C0@0@,A+BCD*8>>*:+iooEVWX 2"8\$%78
 	h2AC- Os   I6Ic                    U R                   (       d  [        S5      eU R                  R                  XR                  5      n[        XU R                  U R                  5      nU R                  R                  U5      n[        U5      [        US   5      -
  nUS:  af  [        R                  " SU S35        / nU HB  n[        R                  " US4S5      nUR                  [        R                  " X/5      5        MD     U$ U$ )u  
Предсказывает вероятности через экспертов и Fusion RF.

Args:
    df: DataFrame с OHLCV данными и фичами

Returns:
    list of arrays: Вероятности для каждого таргета (shape: [(n_samples, 2), ...])
zDModel not fitted yet. Call fit() first on DataFrame with OHLCV data.r   z  [Adapter] Padding z% predictions with neutral probs (0.5)         ?)r   RuntimeErrorr   r%   r   r	   r   r   predict_probar    r   debugr!   fullappendvstack)	r   r   r*   r,   probspad_lenpadded_probsppads	            r   r4   #ExpertEnsembleAdapter.predict_proba_   s     ~~V 
 --++B0A0AB ""t}}d>N>NO !!//9
 b'CaM)Q;LL/y8]^_LggwlC0##BIIsh$78   r   Xc                     U R                  U5      n[        R                  " U Vs/ s H  o3SS2S4   S:  PM     sn5      $ s  snf )u   
Предсказывает классы (доступно для совместимости).

Args:
    X: Feature matrix (n_samples, n_features)

Returns:
    np.ndarray: Предсказанные классы (n_samples, n_targets)
N   r2   )r4   r!   column_stack)r   r?   r9   r<   s       r   predictExpertEnsembleAdapter.predict   s?     ""1%>1!Q$3>??>s   Areturnc                     U R                   $ )uu   
Проверяет, обучена ли модель.

Returns:
    bool: True если модель обучена
)r   r   s    r   r   ExpertEnsembleAdapter.is_fitted   s     ~~r   c                     U R                   $ )ut   
Получает список имен фичей для Fusion RF.

Returns:
    list[str]: Имена фичей
)r   rG   s    r   get_fusion_feature_names.ExpertEnsembleAdapter.get_fusion_feature_names   s     r   )r   r   r   r   r   N)__name__
__module____qualname____firstlineno____doc__liststrr   pd	DataFramer!   ndarrayr)   r4   rC   boolr   rJ   __static_attributes__r   r   r   r   r      sr    T#Y /bll /rzz /b& &P@ @4  $s)  r   r   c                   `   ^  \ rS rSrSrS\R                  S\R                  4U 4S jjr	Sr
U =r$ )ExpertEnsembleCalibrator   u   
Вариация адаптера с калибровкой.

Дополнительно применяет калибровку к вероятностям.
r   r   c                   > [         T
U ]  X5        SSKJn  / n/ nUR	                  5       nXR
                     X`R
                  '    U R                  U5      nU HN  nUR                  US S 2S4   5        UR                  [        UR                  5      S:  a	  US S 2S4   OU5        MP     U(       aI  [        R                  " S5        U" SS9n	U	R                  XE5        Xl        [        R                  " S5        U $ !    NV= f)Nr   )MultiOutputCalibratorrA   z/  [Adapter] Calibrating expert probabilities...isotonic)methodz%  [Adapter] Probabilities calibrated!)superr)   models.calibrationr\   copyr   r4   r7   r    r(   r   r   
calibrator)r   r   r   r\   	raw_probsy_truetemp_df
probs_listr9   rb   	__class__s             r   r)   ExpertEnsembleCalibrator.fit   s    B 	= 	 '')%'(9(9%:!!"	++B/J#  q!t-QWW)9a1gqA $ KKIK.jAJNN9-(OKK?A	s   A%C= =D)rb   )rL   rM   rN   rO   rP   rS   rT   r!   rU   r)   rW   __classcell__)rg   s   @r   rY   rY      s(    bll rzz  r   rY   )rP   numpyr!   pandasrS   sklearn.ensembler   sklearn.multioutputr   configr   r   utils.loggerr   models.expertsr   
models.moer	   r
   r   rY   r   r   r   <module>rr      s>      3 5 ,  ) 8R  R l%4 %r   