
    oWj                     H    S r SSKrSSKrSSKJrJr  SSKJ	r	   " S S5      r
g)uN   
Feature selection pipeline: correlation analysis и Top-K feature selection.
    N)SelectKBestmutual_info_classif)loggerc                   4   \ rS rSrSrSS\4S jjrS\R                  S\	R                  4S jrS\R                  S\R                  4S	 jrS\R                  S\	R                  S\R                  4S
 jrS\R                  4S jrS\\   4S jrS\4S jrSrg)FeatureSelector   u  
Пайплайн для отбора лучших фичей с использованием Mutual Information.

Args:
    k: Количество фичей для сохранения

Attributes:
    k: Количество фичей
    selector: sklearn SelectKBest объект
    selected_features: Список отобранных фичей

Example:
    >>> selector = FeatureSelector(k=30)
    >>> X_clean = selector.fit_transform(X, y)
    >>> print(selector.selected_features)
kc                 :    Xl         SU l        SU l        SU l        g)u   
Инициализация FeatureSelector.

Args:
    k: Количество фичей для отбора (по умолчанию 30)
N)r	   selectorselected_featuresscores)selfr	   s     8/home/ai/projects/AI_Strategy/utils/feature_selection.py__init__FeatureSelector.__init__   s     !%    Xyc                    [         R                  " S[        U R                  UR                  S   5       S35        [        UR                  5      S:  a   [         R                  " S5        USS2S4   nOUn[        [        [        U R                  UR                  S   5      S9U l        U R                  R                  X5        [        R                  " U R                  R                  UR                  S9R                  S	S
9U l        U R                  R!                  U R                  5      R"                  R%                  5       U l        [         R                  " S[        U R&                  5       S35        U R                  [        UR                  5      :  a:  [         R                  " S[        UR                  5      U R                  -
   S35        U $ )u   
Обучает селектор на данных.

Args:
    X: Feature matrix (n_samples, n_features)
    y: Target vector (n_samples,) or (n_samples, n_targets)
z.Running SelectKBest (mutual_info) to keep top    z features...z5Using 'Long' target for feature importance evaluationNr   )
score_funcr	   )indexF)	ascendingzTop z features selected.zRemoved z low-importance features.)r   infominr	   shapelenr   r   r   fitpdSeriesscores_columnssort_valuesr   headr   tolistr   )r   r   r   y_1ds       r   r   FeatureSelector.fit)   s`    	<SQR=T<UUab	
 qww<!KKOPQT7DD#*c$&&!''!*.E
 	!" ii 5 5QYYGSS T 
 "&!1!1$&&!9!?!?!F!F!Hd3t55677JKL66C		N"KK(3qyy>DFF#:";;TUVr   returnc                 N    U R                   c  [        S5      eXR                      $ )u   
Применяет отбор фичей к новым данным.

Args:
    X: Feature matrix (n_samples, n_features)

Returns:
    pd.DataFrame: Feature matrix с отобранными фичами (n_samples, k)
z-Selector is not fitted yet. Call fit() first.)r   RuntimeError)r   r   s     r   	transformFeatureSelector.transformN   s1     !!)?  ''((r   c                 F    U R                  X5        U R                  U5      $ )u   
Обучает и применяет отбор фичей.

Args:
    X: Feature matrix (n_samples, n_features)
    y: Target vector (n_samples,) or (n_samples, n_targets)

Returns:
    pd.DataFrame: Feature matrix с отобранными фичами
)r   r+   )r   r   r   s      r   fit_transformFeatureSelector.fit_transform^   s     	~~a  r   c                 J    U R                   c  [        S5      eU R                   $ )u   
Возвращает скоры важности для всех фичей.

Returns:
    pd.Series: Скоры важности по убыванию
z Fit first to get feature scores.)r   r*   r   s    r   get_feature_scores"FeatureSelector.get_feature_scoresl   s$     ;;ABB{{r   c                     U R                   $ )uz   
Возвращает имена отобранных фичей.

Returns:
    list[str]: Имена топ-K фичей
r   r1   s    r   get_selected_feature_names*FeatureSelector.get_selected_feature_namesw   s     %%%r   c                     U R                   SL$ )uB   Возвращает True, если селектор обучен.Nr5   r1   s    r   	is_fittedFeatureSelector.is_fitted   s    %%T11r   )r	   r   r   r   N)   )__name__
__module____qualname____firstlineno____doc__intr   r   	DataFramenpndarrayr   r+   r.   r    r2   liststrr6   boolr9   __static_attributes__ r   r   r   r      s    "
# 
#R\\ #bjj #J)2<< )BLL ) !r|| !

 !r|| !	BII 	&DI &24 2r   r   )r@   pandasr   numpyrC   sklearn.feature_selectionr   r   utils.loggerr   r   rI   r   r   <module>rN      s$      F w2 w2r   