
    mTj                      X   S r SSKrSSKrSSKrSSKJr  SSKJrJ	r	  SSK
r
\
R                  " S5        \R                  R                  5       (       a  SOSrSrSrS	rS
rSr " S S\5      r " S S\R*                  5      rS\4S\R.                  S\R.                  S-  S\4S jjrSSSSS\\\\S4
S\R.                  S\R.                  S-  S\S\S\S\S\S\S \S!\S"\S#\4S$ jjr\\SSS\S4S%\\   S\S\S\S&\S'\S-  S!\S"\4S( jjr\ " \5       V s/ s H  n S)U  3PM
     sn r!gs  sn f )*u~   
Гибридная модель: LSTM-кодировщик (окно 20 свечей) → Latent features → Random Forest.
    N)Dataset
DataLoaderignorecudacpu          2      c                   d    \ rS rSrS	S\R
                  S\R
                  S-  4S jjrS rS rSr	g)
SequenceDataset   NXyc                     [         R                  " U5      U l        UbX  UR                  S:X  a,  [         R                  " U5      R	                  SS5      U l        g [         R                  " U5      U l        g S U l        g )N   )torchFloatTensorr   ndimviewr   )selfr   r   s      ./home/ai/projects/AI_Strategy/models/hybrid.py__init__SequenceDataset.__init__   s\    ""1%=vv{**1-222q9**1-DF    c                 ,    [        U R                  5      $ N)lenr   )r   s    r   __len__SequenceDataset.__len__!   s    466{r   c                 z    U R                   b  U R                  U   U R                   U   4$ U R                  U   S4$ )N        )r   r   )r   idxs     r   __getitem__SequenceDataset.__getitem__$   s:    6666#;s++vvc{Cr   )r   r   r   )
__name__
__module____qualname____firstlineno__npndarrayr   r!   r&   __static_attributes__ r   r   r   r      s,    	"** 	d): 	 r   r   c                      ^  \ rS rSrSrSS\S\S\4U 4S jjjrS\R                  S\R                  4S	 jr	S\R                  S\
R                  4S
 jrSrU =r$ )LSTMEncoder*   u\   LSTM-кодировщик: окно → скрытое состояние (latent features).
n_featureshidden_size
num_layersc                    > [         TU ]  5         X l        X0l        [        R
                  " UUUSUS:  a  SOSS9U l        [        R                  " US5      U l        g )NTr   g?r   )
input_sizer4   r5   batch_firstdropout)	superr   r4   r5   nnLSTMlstmLinearfc)r   r3   r4   r5   	__class__s       r   r   LSTMEncoder.__init__,   sT    &$GG!#!%>Cq
	 ))K+r   xreturnc                 Z    U R                  U5      u  nu  p4US   nU R                  U5      $ )Nr   )r=   r?   )r   rB   lstm_outh_n_h_lasts         r   forwardLSTMEncoder.forward:   s-    !YYq\(3Rwwvr   c                     U R                  U5      u  nu  p2US   R                  5       R                  5       R                  5       $ )uP   Извлекает latent features (последний скрытый слой).r   )r=   detachr   numpy)r   rB   rG   rF   s       r   encodeLSTMEncoder.encode@   s8    iil8C2w~~##%++--r   )r?   r4   r=   r5   )r	      )r(   r)   r*   r+   __doc__intr   r   TensorrI   r,   r-   rN   r.   __classcell__)r@   s   @r   r1   r1   *   s`    f,3 ,S ,3 , , %,, . . . .r   r1   featurestargetwindowc                 :   [        U 5      n/ / pT[        X#5       H1  nUR                  XU-
  U 5        Uc  M  UR                  X   5        M3     [        R                  " U[        R
                  S9nUb#  [        R                  " U[        R
                  S9OSnXx4$ )u@   Создаёт последовательности для LSTM.N)dtype)r    rangeappendr,   arrayfloat32)	rU   rV   rW   nr   r   iX_arry_arrs	            r   create_sequencesrb   F   s    HArq6	f*q)*HHVY  HHQbjj)E-3-?BHHQbjj)TE<r   3   rP   gMb@?TX_seqy_seqr3   r4   r5   lrepochs
batch_sizepatiencedeviceverboserC   c                 J   [        X#U5      R                  U	5      n[        R                  R	                  UR                  5       USS9nUSLnU(       a  [        R                  " U5      n[        U5      S::  a  [        U5      R                  SS15      (       ai  US:H  R                  5       [        US:H  R                  5       S5      -  n[        R                  " [        R                  " U5      R                  U	5      S9nO+[        R                   " 5       nO[        R                   " 5       n[        U 5      n[#        US-  5      nU SU*  U U* S nnU(       a  USU*  OU SU*  nU(       a  UU* S OU U* S n[%        ['        UU5      US	S
9n[%        ['        UU5      US	S
9n[)        S5      nSnSn[+        U5       GHK  nUR-                  5         SnU H  u  nnUR                  U	5      UR                  U	5      nnUR/                  5         U" U5      n U(       a
  U" U U5      n!O$U" U R1                  5       UR3                  SS95      n!U!R5                  5         [        R6                  R9                  UR                  5       S5        UR;                  5         UU!R=                  5       [        U5      -  -  nM     U[        U5      -  nUR?                  5         Sn"[        R@                  " 5          U H  u  nnUR                  U	5      UR                  U	5      nnU" U5      n U(       a
  U" U U5      n!O$U" U R1                  5       UR3                  SS95      n!U"U!R=                  5       [        U5      -  -  n"M     SSS5        U"[        U5      -  n"U
(       a(  US-   S-  S:X  a  [C        SUS-    SU SUS SU"S 35        U"U:  a  U"nSn[D        RF                  " U5      nGM&  US-  nUU:  d  GM4  U
(       a  [C        SUS-    35          O   Ub  U$ U$ ! , (       d  f       N= f)uJ   Обучает LSTMEncoder supervised (prediction) или self-supervised.gh㈵>)rf   weight_decayNrP   r   r   )
pos_weightg333333?Frh   shuffleinfr$   )r   rP   )dimg      ?
   z    LSTM Epoch /z train_loss=z.6fz
 val_loss=z!    LSTM Early stopping at epoch )$r1   tor   optimAdamW
parametersr,   uniquer    setissubsetsummaxr;   BCEWithLogitsLosstensorMSELossrR   r   r   floatrZ   train	zero_gradsqueezemeanbackwardutilsclip_grad_norm_stepitemevalno_gradprintcopydeepcopy)#rd   re   r3   r4   r5   rf   rg   rh   ri   rj   rk   model	optimizer
use_targetunique_valsrn   	criterionr^   val_sizeX_trainX_valy_trainy_valtrain_loader
val_loaderbest_val_losspatience_counter
best_modelepoch
train_lossXbyboutlossval_losss#                                      r   train_encoderr   S   s    
<??GE!!%"2"2"4$!OId"Jii&{q S%5%>%>1v%F%F1*))+c5A:2B2B2Da.HHJ,,Z8P8S8STZ8[\I

IJJL	E
A1t8}H:XI&xij(9UG#-eJhY58)3DG!+E8)*yz1BEogw?J`efLOE59jZ_`J%LMJv
"FBUU6]BEE&MB!)C b) F0CDMMOHH$$U%5%5%7=NN$))+B//J # 	c'l"


]]_$BvfBBi$S"-D$S[[]BGGG4GHDDIIK#b'11 %  	CJ	R'1,OE!G9AfX\*SAQQ[\deh[ijkm#$M u-J!8+=eAgYGHW Z L9 _s   0BP
P"	feature_colsretrainr   c	           
         U V	s/ s H  oU R                   ;   d  M  U	PM     n
n	X
   R                  R                  [        R                  5      n[        R
                  " USSSS9nUR                  SSS9nUR                  SSS9R                  SS9nX-
  U-  n[        USU5      u  nnU(       d  Uca  U(       a-  [        S	[        U5       S
U SUR                  S    SU 35        XS R                  SS9n[        UUUR                  S   UUUUS9nUR                  5         [        [!        U5      ["        SS9n/ n[$        R&                  " 5          U H7  u  nnUR)                  UR+                  U5      5      nUR-                  U5        M9     SSS5        [        R.                  " U5      nU R1                  5       n[3        UR                  S   5       HN  nSU 3n[        R4                  UU'   USS2U4   UR6                  US2UR                   R9                  U5      4'   MP     UXj4$ s  sn	f ! , (       d  f       N= f)u   
Извлекает LSTM-latent признаки и добавляет их в DataFrame.
Возвращает (df_with_features, LSTM_model).
r$   )nanposinfneginfr   T)axiskeepdimsg:0yE>)minNz
    LSTM: z seq, window=z, features=r   u    → latent=)r   )r3   r4   r5   rj   rk   Fro   
lstm_feat_)columnsvaluesastyper,   r]   
nan_to_numr   stdcliprb   r   r    shaper   r   r   r   
BATCH_SIZEr   r   rN   ru   r[   concatenater   rZ   r   ilocget_loc)dfr   rW   r4   r5   r   r   rj   rk   c	availabledatar   r   	data_normrd   rG   
y_pretrainloader	all_featsr   featslatentdf_outr_   cols                             r   extract_lstm_featuresr      s    )<LqOLI<=&&rzz2D==3s3?D 99!d9+D
((D(
)
.
.4
.
8C#I  	48HE1%-Js5zl-x{4::VW=/Yefqerstw',,!,4
:zz!}#!
 
JJL.:uUFI	EBLLv/EU#  
 ^^I&F WWYF6<<?#1#ffs<B1a4LFGV^^33C889 $
 5##W =< 
s   H.H.>H33
Ir   )"rQ   r   rM   r,   r   torch.nnr;   torch.utils.datar   r   warningsfilterwarningsr   is_availableDEVICEWINDOW
LATENT_DIMr   EPOCHSPATIENCEr   Moduler1   r-   rR   rb   r   strboolr   listr   rZ   LSTM_FEATURE_COLS)r_   s   0r   <module>r      s       0     !::**,,%	

	 g  *.")) .8 HL[a 
rzz 
2::3D 
UX 
  $ Y::Y::Y Y 	Y
 Y 	Y Y Y Y Y Y Y~ ! $:$s):$ :$ 	:$
 :$ :$ :$ :$ :$z 05Z/@A/@!z!%/@A As   D'