
    w_tjJ!                     2   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        SSKr\R                  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          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      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_sizer2   r3   batch_firstdropout)	superr   r2   r3   nnLSTMlstmLinearfc)r   r1   r2   r3   	__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   r@   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;   detachcpunumpy)r   r@   rE   rD   s       r   encodeLSTMEncoder.encodeB   s8    iil8C2w~~##%++--r   )r=   r2   r;   r3   )r      )r&   r'   r(   r)   __doc__intr   r   TensorrG   r*   r+   rM   r,   __classcell__)r>   s   @r   r/   r/   ,   s`    f,3 ,S ,3 , , %,, . . . .r   r/   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)	rT   rU   rV   nr   r   iX_arry_arrs	            r   create_sequencesra   H   s    HArq6	f*q)*HHVY  HHQbjj)E-3-?BHHQbjj)TE<r   3   rO   gMb@?TX_seqy_seqr1   r2   r3   lrepochs
batch_sizepatiencedeviceverboserA   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㈵>)re   weight_decayNrO   r   r   )
pos_weightg333333?Frg   shuffleinfr"   )r   rO   )dimg      ?
   z    LSTM Epoch /z train_loss=z.6fz
 val_loss=z!    LSTM Early stopping at epoch )$r/   tor   optimAdamW
parametersr*   uniquer   setissubsetsummaxr9   BCEWithLogitsLosstensorMSELossrQ   r   r   floatrY   train	zero_gradsqueezemeanbackwardutilsclip_grad_norm_stepitemevalno_gradprintcopydeepcopy)#rc   rd   r1   r2   r3   re   rf   rg   rh   ri   rj   model	optimizer
use_targetunique_valsrm   	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   U   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   )r1   r2   r3   ri   rj   Frn   
lstm_feat_)columnsvaluesastyper*   r\   
nan_to_numr   stdclipra   r   r   shaper   r   r   r   
BATCH_SIZEr   r   rM   rt   rZ   concatenater   rY   r   ilocget_loc)dfr   rV   r2   r3   r   r   ri   rj   c	availabledatar   r   	data_normrc   rE   
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   )!rP   r   rL   r*   r   torch.nnr9   torch.utils.datar   r   warningsfilterwarningsconfigDEVICEWINDOW
LATENT_DIMr   EPOCHSPATIENCEr   Moduler/   r+   rQ   ra   r   strboolr   listr   rY   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