U
    fD(                     @   sV  d dl Z d dlZd dlZd dlZd dlmZ d dl	Z	d dl
Z
e	jdk rPe
d i add Zdd ZG d	d
 d
Zdd ZG dd deZdd Zdd ZG dd dZdd Zdd ZG dd dZG dd deZG dd deZG dd  d eZd3d"d#ZG d$d% d%ZG d&d' d'eZG d(d) d)eZd*d+ Z d4d-d.Z!d/d0 Z"d5d1d2Z#dS )6    N)pdist)   r   z9As of version 0.29.0 shap only supports Python 3 (not 2)!c                 C   s$   | t kr t |  \}}t| |d S N)import_errorsprintpackage_namemsge r   2/tmp/pip-target-lpfmz8o1/lib/python/shap/common.pyassert_import   s    r   c                 C   s   ||ft | < d S r   )r   r   r   r   r   record_import_error   s    r   c                   @   s   e Zd Zdd ZdS )Instancec                 C   s   || _ || _d S r   )xgroup_display_values)selfr   r   r   r   r   __init__   s    zInstance.__init__N__name__
__module____qualname__r   r   r   r   r   r      s   r   c                 C   s   t | tr| S t| d S d S r   )
isinstancer   valr   r   r   convert_to_instance   s    
r   c                   @   s   e Zd Zdd Zdd ZdS )InstanceWithIndexc                 C   s$   t | || || _|| _|| _d S r   )r   r   index_value
index_namecolumn_name)r   r   r   r   r   r   r   r   r   r   '   s    zInstanceWithIndex.__init__c                 C   sH   t j| j| jgd}t j| j| jd}t j||gdd}|| j}|S N)columns   )Zaxis)pd	DataFramer   r   r   r   concat	set_index)r   indexdatadfr   r   r   convert_to_df-   s
    zInstanceWithIndex.convert_to_dfNr   r   r   r   r*   r   r   r   r   r   &   s   r   c                 C   s   t | |||d S r   )r   )r   r   r   r   r   r   r   convert_to_instance_with_index5   s    r,   c                    s`   t  tstdt |tr\ jd kr< fdd|jD  _t jt|jksTt|j _d S )Nz"instance must be of type Instance!c                    s.   g | ]&}t |d kr& jd|d f ndqS )r"   r    )lenr   ).0groupinstancer   r   
<listcomp>>   s     z*match_instance_to_data.<locals>.<listcomp>)r   r   AssertionError	DenseDatar   groupsr.   )r2   r(   r   r1   r   match_instance_to_data9   s    

r7   c                   @   s   e Zd Zdd ZdS )Modelc                 C   s   || _ || _d S r   )f	out_names)r   r9   r:   r   r   r   r   D   s    zModel.__init__Nr   r   r   r   r   r8   C   s   r8   c                 C   s   t | tr| S t| d S d S r   )r   r8   r   r   r   r   convert_to_modelI   s    
r;   c                 C   s   t | tstdz*t |tr.| | }n| |j}W n   td  Y nX | jd krt	|j
dkrvdg| _ndd t|j
d D | _|S )Nzmodel must be of type Model!zDProvided model function fails when applied to the provided data set.r"   zoutput valuec                 S   s   g | ]}d t | qS )zoutput value strr/   ir   r   r   r3   `   s     z'match_model_to_data.<locals>.<listcomp>r   )r   r8   r4   DenseDataWithIndexr9   r*   r(   r   r:   r.   shaperange)modelr(   Zout_valr   r   r   match_model_to_dataP   s    


rD   c                   @   s   e Zd Zdd ZdS )Datac                 C   s   d S r   r   r   r   r   r   r   g   s    zData.__init__Nr   r   r   r   r   rE   f   s   rE   c                   @   s   e Zd Zdd ZdS )
SparseDatac                 G   sT   |j d }t|| _|  jt| j  _d| _d | _d | _|j d | _|| _	d S )Nr   Fr"   )
rA   nponesweightssum
transposedr6   group_namesgroups_sizer(   )r   r(   argsnum_samplesr   r   r   r   l   s    
zSparseData.__init__Nr   r   r   r   r   rG   k   s   rG   c                   @   s   e Zd Zdd ZdS )r5   c           	      G   sB  t |dkr |d d kr |d ndd tt |D | _tdd | jD }|jd }d}||jd krvd}|jd }| r||jd kp|o||jd k}|std	t |dkr|d nt|| _|  jt| j  _t | j}| r||jd kp|o||jd k}|s td
|| _	|| _
|| _t | j| _d S )Nr   c                 S   s   g | ]}t |gqS r   )rH   arrayr>   r   r   r   r3   y   s     z&DenseData.__init__.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r   )r.   )r/   gr   r   r   	<genexpr>{   s     z%DenseData.__init__.<locals>.<genexpr>Fr"   Tz"# of names must match data matrix!z!# weights must match data matrix!)r.   rB   r6   rK   rA   r4   rH   rI   rJ   rL   rM   r(   rN   )	r   r(   rM   rO   lrP   tvalidZwlr   r   r   r   x   s$    8

& 
*zDenseData.__init__Nr   r   r   r   r   r5   w   s   r5   c                   @   s   e Zd Zdd Zdd ZdS )r@   c                 G   s$   t j| ||f|  || _|| _d S r   )r5   r   r   r   )r   r(   rM   r'   r   rO   r   r   r   r      s    zDenseDataWithIndex.__init__c                 C   sH   t j| j| jd}t j| j| jgd}t j||gdd}|| j}|S r    )r#   r$   r(   rM   r   r   r%   r&   )r   r(   r'   r)   r   r   r   r*      s
    z DenseDataWithIndex.convert_to_dfNr+   r   r   r   r   r@      s   r@   Fc                 C   s   t | tr| S t| tjkr:t| dd t| jd D S tt| 	drlt| j
dt| ft| jS tt| 	dr|rt| j
t| j| jj
| jjS t| j
t| jS n@tj| rtj| s|  } t| S dstdtt|  d S )Nc                 S   s   g | ]}t |qS r   r<   r>   r   r   r   r3      s     z#convert_to_data.<locals>.<listcomp>r"   z'pandas.core.series.Series'>'pandas.core.frame.DataFrame'>Fz$Unknown type passed as data object: )r   rE   typerH   Zndarrayr5   rB   rA   r=   endswithvaluesZreshaper.   listr'   r@   r!   namespsparseissparseZisspmatrix_csrZtocsrrG   r4   )r   Z
keep_indexr   r   r   convert_to_data   s    
 r`   c                   @   s   e Zd Zdd ZdS )Linkc                 C   s   d S r   r   rF   r   r   r   r      s    zLink.__init__Nr   r   r   r   r   ra      s   ra   c                   @   s,   e Zd Zdd Zedd Zedd ZdS )IdentityLinkc                 C   s   dS )Nidentityr   rF   r   r   r   __str__   s    zIdentityLink.__str__c                 C   s   | S r   r   r   r   r   r   r9      s    zIdentityLink.fc                 C   s   | S r   r   re   r   r   r   finv   s    zIdentityLink.finvNr   r   r   rd   staticmethodr9   rf   r   r   r   r   rb      s
   
rb   c                   @   s,   e Zd Zdd Zedd Zedd ZdS )	LogitLinkc                 C   s   dS )Nlogitr   rF   r   r   r   rd      s    zLogitLink.__str__c                 C   s   t | d|   S Nr"   )rH   logre   r   r   r   r9      s    zLogitLink.fc                 C   s   ddt |    S rk   )rH   expre   r   r   r   rf      s    zLogitLink.finvNrg   r   r   r   r   ri      s
   
ri   c                 C   s:   t | tr| S | dkrt S | dkr*t S ds6tdd S )Nrc   rj   Fz1Passed link object must be a subclass of iml.Link)r   ra   rb   ri   r4   r   r   r   r   convert_to_link   s    
rn   sqeuclideanc              	   C   s  t jj| |}t jj|}dd t| jd D }t|jd D ]}|t	||df  }|t	||df  }tt
| |d ddf | |d ddf g|d }tt
| |d ddf | |d ddf g|d }	tt
| |d ddf | |d ddf g|d }
tt
| |d ddf | |d ddf g|d }t||	|
|}||krz|||  qD||	kr|||  qD||
kr|tt||  qD||tt|  qD|d S )zb A leaf ordering is under-defined, this picks the ordering that keeps nearby samples similar.
    c                 S   s   g | ]
}|gqS r   r   r>   r   r   r   r3      s     z#hclust_ordering.<locals>.<listcomp>r   r"   N)r]   ZspatialZdistancer   ZclusterZ	hierarchyZcompleterB   rA   intrH   Zvstackminappendr[   reversed)XZmetricDZcluster_matrixZsetsr?   s1s2Zd_s1_s2Zd_s2_s1Zd_s1r_s2Zd_s1_s2rbestr   r   r   hclust_ordering   s&    8888


rz   c                 C   s   t | tkrtt|| kd }t|dkr| drbtt|	d t
| dd  S | dkrndS td|   d S q|d S n| S d S )Nr   zrank(   rp   zsum()zCould not find feature named: )rX   r=   rH   whererQ   r.   
startswithargsortabsZmeanrq   r   )indshap_valuesfeature_namesZnzindsr   r   r   convert_name   s    
(
r   c                 C   s  t t|dr&|dkr |j}|j}t| ||} |jd dkrjt|jd }tj	
| |dd }nt|jd }||| f }t|}||| f }|| }tttt|d dd}	g }
t|jd D ]}|||f | tj}d}|| kstt|d	k stdt||	D ]n}t||||	  dkr$t||||	  dkr$|tt||||	  ||||	  d
 7 }q$|}t|||f | tj}d}|| ksZtt|d	k sZtdt||	D ]n}t||||	  dkrt||||	  dkr|tt||||	  ||||	  d
 7 }q|}|
t|| qtt|
 S )a*   Order other features by how much interaction they seem to have with the feature at the given index.

    This just bins the SHAP values for a feature along that feature's value. For true Shapley interaction
    index values for SHAP see the interaction_contribs option implemented in XGBoost.
    rW   Nr   i'  g      $@2   r"   g        g:0yE>)r   r"   )r=   rX   rY   r!   rZ   r   rA   rH   Zarangerandomshuffler~   maxrr   rq   r.   rB   ZastypefloatrK   r   ZstdZcorrcoefisnanrs   )r'   r   ru   r   aZindsr   ZsrtZshap_refincZinteractionsr?   Z	val_othervjZval_vZnan_vr   r   r   approximate_interactions  sB    
 84 84r   )F)ro   )N)$reZpandasr#   numpyrH   Zscipyr]   Zscipy.spatial.distancer   syswarningsversion_infowarnr   r   r   r   r   r   r,   r7   r8   r;   rD   rE   rG   r5   r@   r`   ra   rb   ri   rn   rz   r   r   r   r   r   r   <module>   s>   




#