
    )pWj{              
       $   S r SSKrSSKrSSKJr   SS\R                  S\R                  S\	S\
\   4S jjr SS\R                  S	\S\R                  4S
 jjr SS\R                  S\	S\R                  4S jjrSS\R                  S\4S jjrg)u   
Feature analysis: correlation analysis для выявления и удаления мультиколлинеарных признаков.
    N)loggerXy	thresholdreturnc                 d   [         R                  " SU S35        [        U 5      [        U5      :w  a#  [        S[        U 5       S[        U5       35      e[         R                  " S5        U R	                  U5      R                  5       R                  S5      n[         R                  " S5        U R                  5       R                  5       nUR                  [        R                  " [        R                  " UR                  5      SS	9R                  [        5      5      n[        5       n/ nUR                    H  nUR"                  XX   U:     R%                  5       n	U	(       d  M.  X8   n
X9S      nX:  a,  UR'                  U	S   5        UR)                  XS   X45        Mj  UR'                  U5        UR)                  U	S   XU
45        M     U R                    Vs/ s H  oU;  d  M
  UPM     nn[         R                  " S
[        U5       S[        U5       S[        U5      [        U R                   5      -  S-  S S35        U(       a[  [         R                  " S5        [+        USS S5       H2  u  nu  pnn[         R                  " SU SU SUS SU SUS S35        M4     U$ s  snf )u  
Удаляет высоко коррелированные признаки (мультиколлинеарность).

Алгоритм:
1. Считает корреляцию каждого признака с таргетом
2. Считает матрицу корреляций между фичами
3. Ищет пары с корреляцией > threshold
4. Если пара найдена, оставляет признак с большей корреляцией с таргетом

Args:
    X: Feature matrix (n_samples, n_features)
    y: Target series (n_samples,)
    threshold: Порог корреляции для удаления (по умолчанию 0.90)

Returns:
    list[str]: Список признаков, которые нужно оставить

Example:
    >>> keep_features = remove_collinear_features(X, y, threshold=0.90)
    >>> X_clean = X[keep_features]
z'Starting collinearity check (threshold=)...z%X and y must have the same length: X=z, y=z%Computing correlations with target...r   z'Computing feature correlation matrix...   kzRemoved z collinear features. Kept z (d   z.1fz%).zMost correlated pairs dropped:N   z  z. Dropped 'z' (corr=z.3fz) in favor of '))r   infolen
ValueErrorcorrwithabsfillnacorrwherenptriuonesshapeastypeboolsetcolumnsindextolistaddappend	enumerate)r   r   r   correlations_with_targetcorr_matrixupperto_droppairs_droppedcolhighly_correlatedcol_corrcorr_col_corrkeepiremovedkeptcorr_removed	corr_kepts                     2/home/ai/projects/AI_Strategy/utils/correlation.pyremove_collinear_featuresr5   
   st   0 KK9)DIJ 1vQ@QSQRVHUVV KK78 zz!}00299!< KK9:&&(,,.K bggbggk.?.?&@AFMMdSTEeGM }}!KK
Y(>?FFH/4H4q5IJM(-a01$$cQ+?%YZC $$&7&:CPX%YZ   99;9C7(:C9D;
KK
3w<. :3t9+RD	RUVWV_V_R`H`adHdehGiilm 46;D"1q<
7A7|Y KKQC{7)8L3E_UYTZZbclmpbqqrs<
 K <s   	J-,J-methodc                 X    [         R                  " SU S35        U R                  US9nU$ )u  
Вычисляет матрицу корреляций между фичами.

Args:
    X: Feature matrix (n_samples, n_features)
    method: Метод корреляции ('pearson', 'spearman', 'kendall')

Returns:
    pd.DataFrame: Матрица корреляций (n_features, n_features)

Example:
    >>> corr = compute_correlation_matrix(X)
    >>> high_corr = corr[corr > 0.9].stack()
z%Computing correlation matrix (method=r	   )r6   )r   r   r   )r   r6   r&   s      r4   compute_correlation_matrixr8   Y   s0    " KK7xtDE&&&'K    c           	         [         R                  " SU S35        U R                  5       R                  5       nUR	                  [
        R                  " [
        R                  " UR                  5      SS9R                  [        5      5      n/ nUR                   HO  nUR                  X5   U:     R                  5       nU H$  nUR                  XWUR                  XW4   45        M&     MQ     U(       d,  [         R                  " S5        [         R"                  " / SQS9$ [         R"                  " U/ SQS9nUR%                  SS	S
9n[         R                  " S['        U5       S35        U$ )u  
Находит пары признаков с высокой корреляцией.

Args:
    X: Feature matrix (n_samples, n_features)
    threshold: Порог корреляции (по умолчанию 0.90)

Returns:
    pd.DataFrame: DataFrame с парами коррелирующих фичей

Example:
    >>> pairs = get_highly_correlated_pairs(X, threshold=0.90)
    >>> print(pairs)
z+Finding highly correlated pairs (threshold=r	   r
   r   z!No highly correlated pairs found.)z	Feature 1z	Feature 2Correlation)r   r;   F	ascendingzFound z highly correlated pairs.)r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r#   locpd	DataFramesort_valuesr   )	r   r   r&   r'   r+   r*   correlated_colscorr_coldfs	            r4   get_highly_correlated_pairsrE   o   s+   " KK=i[MN&&(,,.Kbggbggk.?.?&@AFMMdSTE }}++ej9&<=DDF'H$$cUYYs}5M%NO ( 
 78||=
 	
 
#L
B 
	7B
KK&R	!:;<Ir9   figsizec                    SSK Jn  [        R                  " S5        U R	                  5       R                  5       n[        UR                  5      S:  a  UR                  5       R                  SS9nXDS:     R                  S5      n[        UR                  R                  S5      5      [        UR                  R                  S5      5      -  nUR                  [        U5      [        U5      4   nUR!                  US	9  UR#                  US
SSSS9nUR%                  USS9  UR'                  [)        [        UR                  5      5      UR                  SSS9  UR+                  [)        [        UR                  5      5      UR                  SS9  UR-                  SSSS9  UR/                  5         UR1                  5       $ )u  
Строит тепловую карту корреляций между фичами.

Args:
    X: Feature matrix (n_samples, n_features)
    figsize: Размер фигуры (по умолчанию (20, 20))

Example:
    >>> plot_correlation_heatmap(X, figsize=(15, 15))
r   NzPlotting correlation heatmap...   Fr<   g      ?r
   )rF   coolwarmauto)cmapaspectvminvmaxr;   )label-   right)tickslabelsrotationha)rR   rS   rT   zFeature Correlation Matrix   )fontsizepad)matplotlib.pyplotpyplotr   r   r   r   r   r   unstackrA   headr   r    get_level_valuesr>   listfigureimshowcolorbarxticksrangeytickstitletight_layoutgcf)r   rF   pltr&   top_corrfeature_namesims          r4   plot_correlation_heatmaprl      s    $
KK12&&(,,.K ;"$&&(44u4EsN+004HNN;;A>?#NN++A.C
 
 "ood=&94;N&NOJJwJ	*V!! 
 
B LL=L)JJC++,-""	   JJC))*+    
 II*RRI@779r9   )g?)pearson))rH   rH   )__doc__pandasr?   numpyr   utils.loggerr   r@   Seriesfloatr^   strr5   r8   rE   tuplerl    r9   r4   <module>rw      s       7;L	||L		L.3L	#YL` $-	|| \\. )-)	||) %)\\)X. .u .r9   