
    <_j                        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           	         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       (       a  [        U5      S:  a}  [
        R                  " U5      n	XBU	-  :  XCU	-  :  -  n
U
R                  5       (       aC  X) -  nUR                  5       (       a%  [        SUR                  5        S	US
 SUS
 S35        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'   [        SU S35        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      ?
   u     🧹 +u    по уровню (<z.0%u	    или >u   ×медианы)r   )OpenHighLowr   Volume   u     🧹 Очищено u"    аномальных свечей)lencopyvaluesastypefloatnpzerosabsanymedianprint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                          ,/home/ai/projects/AI_Strategy/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}} 11FyQToU^_ijm^nn  A  B$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	"<.0R
ST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)rB   rC   tfs      r?   _validate_table_namerK   _   s`    \\^F		B]"@IJJ	HMNNXQrdrA   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   )	rK   r+   rH   formatr   pdread_sqlr   r@   )	rB   rC   rL   rM   table	limit_intqueryconnr   s	            r?   load_dataframerW   j   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   keysrW   )rB   rX   rL   rJ   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_temporalrE   	timestamp)columnsiQ i:	 )r   r   backward)on	direction)	features.technicalr`   ra   r\   renamegetrQ   
merge_asofsort_values)rB   r]   r^   rL   r`   ra   rJ   all_tfsdfsmain_dfdf_hr6   ri   
tf_secondsshift_ss                  r?   load_multitimeframe_featuresrs      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#   pandasrQ   db.connectionr   configr   r   EXTRA_TICKERSrF   rG   rI   	DataFramer"   r@   strrK   r+   boolrW   rZ   dictr\   rs   )ts   0r?   <module>r      s    	   ( + ; %11LqL1MA	 8<>ALR\\ Lu L!L6;LFHllL^    HL!%"3 "3 "x} ""*,,,"JS htCy6I YabeYf rvwz|~  }I  }I  xI  sJ  &*	$$$ c#$ C=	$
 \\$Y 2s   C-