
    aj                        S SK J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  1 Skr\ V s1 s H  o R                  5       iM     sn \-  r1 Skr  SS\R                   S\S	\S
\S\R                   4
S jjrS\S\S\4S jr  SS\S\S\\   S\S\R                   4
S jjrSS\S\\\      S\\   S\\\R                   4   4S jjr   SS\S\S\\\      S\\   S\R                   4
S jjrgs  sn f )    )OptionalN)get_connection)
TIMEFRAMESMOEX_TICKERS>   ZCASHEURUSDBITCOINBITCOINC>   D1H1W1df
max_return	level_low
level_highreturnc                 R   U b  [        U 5      S:  a  U $ U R                  5       n U S   R                  R                  [        5      n[        U5      n[
        R                  " U5      n[
        R                  " USS USS -  S-
  5      USS& Xa:  nXG)    nUR                  5       (       aR  [        U5      S:  aC  [
        R                  " U5      n	XBU	-  :  XCU	-  :  -  n
U
R                  5       (       a	  X) -  nXz-  nUR                  5       (       d  U $ UR                  5       n[
        R                  " U5      S   nS	 H  nX   R                  R                  [        5      nU H  nUS-
  nUS:  a!  UU   (       a  US-  nUS:  a  UU   (       a  M  US-   nUU:  a!  UU   (       a  US-  nUU:  a  UU   (       a  M  US:  a0  UU:  a*  UU:  a$  UU-
  nUU   UU   UU   -
  UU-
  -  U-  -   UU'   M  US:  a
  UU   UU'   M  UU:  a  UU   OUU   UU'   M     XU'   M     U S
   R                  R                  [        5      nU HB  nUS:  a  UUS-
     OSnUS-   U:  a  UUS-      OSnUS:  d  US:  a  UU-   S-  OUU   UU'   MD     UR                  [        5      U S
'   U $ )u  Обнаруживает и интерполирует аномальные свечи.

Два прохода:
  Pass 1 — смежные возвраты > max_return (catch spike candles: DROP 35→2 + JUMP 2→35)
  Pass 2 — абсолютный уровень цены < level_low × median или > level_high × median
           (catch persistent corrupted candles: 6 свечей по ~2р между DROP и JUMP)

SNGSP/PLZL: ошибочные данные — падение с ~35р → ~2р (94%) с возвратом через 6 свечей.
Все O/H/L/C/V аномалий заменяются линейной интерполяцией между чистыми соседями.
N   Close   g      ?
   r   )OpenHighLowr   Volume   )lencopyvaluesastypefloatnpzerosabsanymediansumwhereint)r   r   r   r   closenreturnsmaskclean_closemedian_close
level_mask	new_flagstotal_spikes	spike_idxcolvalsidxprev_idxnext_idxspanvolprev_vnext_vs                          data/loader.pyclean_spikesr?      s    
zSWq[		BwK%%e,EE
A hhqkG&&qrU3BZ/#56GABKD ,Kxxzzc+&+yy-,665P\C\;\]
>>"e,I$D88::	88:Lq!I 0w~~$$U+CQwHa-DNA a-DNN QwHQ,4>A Q,4>> 1}A(X2E(* Nd8ntH~.MRUX`R`-adh-hhS	Q NS	.6lDNS	S	# & 3- 02 X,


$
$U
+C!$qS1Wa!$q1S1W!-3aZ6A:FVOq(CPSHC  ::c?BxLI    ticker	timeframec                     U R                  5       n UR                  5       nU [        ;  a  [        SU  35      eU[        ;  a  [        SU 35      eU  SU 3$ )ua   Валидирует тикер и таймфрейм перед подстановкой в SQL.u%   Недопустимый тикер: u-   Недопустимый таймфрейм: _)upperVALID_TICKERS
ValueError	VALID_TFS)rA   rB   tfs      r>   _validate_table_namerJ   [   s`    \\^F		B]"@IJJ	HMNNXQrdr@   limitcleanc                    [        X5      nU(       a1  [        U5      nUS::  a  [        SU 35      eSR                  U5      nOSR                  U5      n[	        5        nU(       a  [
        R                  " XgW4S9nO[
        R                  " Xg5      nSSS5        U(       a  Wb  [        U5      S:  a  [        U5      nW$ ! , (       d  f       N4= f)uw   Загружает свечные данные. Если clean=True — удаляет ценовые аномалии.r   u8   LIMIT должен быть положительным: a  
            SELECT * FROM (
                SELECT timestamp, `Date`, `Time`, Open, High, Low, Close, Volume
                FROM {}
                ORDER BY timestamp DESC
                LIMIT %s
            ) sub
            ORDER BY timestamp ASC
        z
            SELECT timestamp, `Date`, `Time`, Open, High, Low, Close, Volume
            FROM {}
            ORDER BY timestamp
        )paramsNr   )	rJ   r*   rG   formatr   pdread_sqlr   r?   )	rA   rB   rK   rL   table	limit_intqueryconnr   s	            r>   load_dataframerV   f   s     !3EJ	>WXaWbcdd F5M 	 F5M	 	 
	TU)>BU)B	 
 CGqL"I 
	s   5C
C
timeframesc           	          Uc  [        [        R                  " 5       5      nU Vs0 s H  nU[        XU5      _M     sn$ s  snf )N)listr   keysrV   )rA   rW   rK   rI   s       r>   load_multiple_timeframesr[      sL    *//+,
 B 	N6u--  s   A main_tf
higher_tfsc                    SSK JnJn  Uc  SS/nU/U Vs/ s H  ofU:w  d  M
  UPM     sn-   n[        XU5      nU" X   5      n	U H  nXa:X  a  M
  U" X   SS9n
U Vs0 s H
  oU SU 3_M     nnU
S/U-      R	                  US	9n
S
SS.nUR                  US
5      nU
S   U-   U
S'   [        R                  " U	R                  S5      U
R                  S5      SSS9n	M     U	$ s  snf s  snf )Nr   )engineer_featuresFEATURE_COLSr   r   T)skip_temporalrD   	timestamp)columnsiQ i:	 )r   r   backward)on	direction)	features.technicalr_   r`   r[   renamegetrP   
merge_asofsort_values)rA   r\   r]   rK   r_   r`   rI   all_tfsdfsmain_dfdf_hr5   rh   
tf_secondsshift_ss                  r>   load_multitimeframe_featuresrr      s     CD\
i
D
"Gm2
DDG
"6E
:C-G= =0<="Qse}$=[ML01888H "0
..U+ -7[--,[) 	
 ( N3 E >s   	C#C#C()g?g333333?g      @)NT)NN)r   NN)typingr   renumpyr#   pandasrP   db.connectionr   configr   r   EXTRA_TICKERSrE   rF   rH   	DataFramer"   r?   strrJ   r*   boolrV   rY   dictr[   rr   )ts   0r>   <module>r      s    	   ( + ; %11LqL1MA	 8<>AHR\\ Hu H!H6;HFHllHV    HL!%"3 "3 "x} ""*,,,"JS htCy6I YabeYf rvwz|~  }I  }I  xI  sJ  &*	$$$ c#$ C=	$
 \\$Q 2s   C-