U
    Ùfý[  ã                	   @   s2  d dl ZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 d dlZd dlZd dlZd dlZzd dlmZ d dlZW n ek
rœ   Y nX i Zd
d
d
ddddddœZdd„ Zdd„ Zdd„ Zefdd„Zefdd„Zdd„ Zdd„ Zd dlmZ ed d!d"d#d$d%œƒZd d&l m!Z! d)d'd(„Z"dS )*é    Né   )Úrun_experimentsé   )Úcolors)Ú__version__)Úmodels)Úmethods)Úmetricsz#1E88E5z#ff0d57z#13B755z#999999z#666666z#7C52FF)Z	tree_shapZ	deep_shapZlinear_shap_corrZlinear_shap_indZcoefÚrandomZconst_randomZkernel_shap_1000_meanrefc                 C   sl   t t| ƒj d¡D ]T}| ¡ }| d¡r| d¡d  ¡ }| d¡r^t t|dd… ƒ¡  S |  S qdS )	NÚ
zcolor = ú=r   zred_blue_circle(é   éÿÿÿÿz#000000)	Úgetattrr   Ú__doc__ÚsplitÚstripÚ
startswithr   Zred_blue_circleÚfloat)ÚmethodÚlÚv© r   ú;/tmp/pip-target-lpfmz8o1/lib/python/shap/benchmark/plots.pyÚget_method_colorö   s    


r   c                 C   sD   t t| ƒj d¡D ],}| ¡ }| d¡r| d¡d  ¡   S qdS )Nr   zlinestyle = r   r   Zsolid)r   r   r   r   r   r   )r   r   r   r   r   Úget_method_linestyle  s
    
r   c                 C   sˆ   t t| ƒj d¡D ]p}| ¡ }|d }d}| |¡rX| |¡rX|t|ƒt|ƒ …   S |d }| |¡rt|t|ƒd … ƒ  S qdS )Nr   z = "ú"z = Ú )	r   r	   r   r   r   r   ÚendswithÚlenr   )ÚmetricÚattrr   ÚprefixÚsuffixr   r   r   Úget_metric_attr  s    
r$   c              	   C   sÌ  t | ||d}t ¡  g }|D ]h\}\}}|\}	}	}
}	t|dƒ}|dkrP| }n|dkr`d| }tj ||¡|d  }| ||
|f¡ qt|ƒD ]X\}}
}t	t
|
ƒj d¡d  ¡ }d	 |¡| }tj||d  ||t|
ƒd
t|
ƒd qt	t|ƒj d¡d  ¡ }t t|dƒ¡ t t|dƒ¡ t	t| d | ƒj d¡d  ¡ }t |d | ¡ t ¡ j d¡ t ¡ j d¡ t ¡ jd  d¡ t ¡ jd  d¡ t ¡  ¡ \}}t t|ƒt|ƒ¡ t ¡ S )N©ÚdatasetÚmodelr    Ú	transformÚnegateÚ	one_minusr   r   r   r   z
{:6.3f} - r   )ÚlabelÚcolorÚ	linewidthZ	linestyleÚxlabelÚylabelÚ__ú - ÚbottomÚleftÚrightFÚtop) r   ÚplÚfigurer$   Úsklearnr	   ÚaucÚappendÚsortedr   r   r   r   r   ÚformatZplotr   r   r.   r/   r   ÚtitleÚgcaÚxaxisÚset_ticks_positionÚyaxisÚspinesÚset_visibleÚget_legend_handles_labelsÚlegendÚreversedÚgcf)r&   r'   r    ÚcmapÚexperimentsÚ
method_arrÚnameÚfcountsÚscoresÚ_r   r(   r9   Úmethod_titler   Úmetric_titleÚmodel_titleÚahandlesÚalabelsr   r   r   Ú
plot_curve  sF    

   ý"rT   c                 C   sÔ  t | ||d}t ¡  g }|D ]N\}\}}|\}	}	}
}	t t |d |d  ¡¡}| ||
|d |d f¡ qt d¡}dt|ƒ d }|d }tj	||d d |d	d
dd d}dddœ}t
|ƒD ]p\}}
}	}tt|
ƒj d¡d  ¡ }d |¡| }tj	|||  | ¡ ||dt|
ƒ| t|
ƒd ¡d |d7 }qÄtt|ƒj d¡d  ¡ }t d¡ t d¡ tt| d | ƒj d¡d  ¡ }t |d | ¡ t ¡ j d¡ t ¡ j d¡ t ¡ jd  d¡ t ¡ jd  d¡ t ¡   ¡ \}}t !t "ddddg¡|| d  ddddg¡ t ¡ j #t$j% &dddg¡¡ t ¡ j 't$j% (d d!d"g¡¡ t ¡ j)d#dd$ tj*dd%d&d' t ¡  +¡ }t ¡  ,|j-|j.|j/d(  |j0|j/d) g¡ t ¡ j1||d*d+dd, t 2¡ S )-Nr%   r   r   é   ç      ð?çš™™™™™é?gÍÌÌÌÌÌì?r   zHuman ConsensusÚblackÚwhite)r+   r,   Ú	edgecolorz///z...)ZdashedZdottedr   z	{:.2f} - )r+   rZ   r,   ZhatchzFeatures in the modelzFeature attribution valuer0   r1   r2   r3   r4   Fr5   r   gš™™™™™Ù?gffffffö?g333333@ZFeverZCoughZHeadacheÚminor)ÚwhichÚlengthz#aaaaaaç      à?)r,   r-   g333333Ó?gffffffæ?zupper center)r^   g333333Ã¿)ÚlocZbbox_to_anchorZncol)3r   r6   r7   ÚnpÚsumÚabsr:   Zaranger   Úbarr;   r   r   r   r   r   r<   Úflattenr   Úgetr   r	   r.   r/   r   r=   r>   r?   r@   rA   rB   rC   rD   ZxticksÚarrayZset_minor_locatorÚ
matplotlibZtickerZFixedLocatorZset_minor_formatterZFixedFormatterZtick_paramsZaxhlineZget_positionZset_positionZx0Zy0ÚheightÚwidthrE   rG   )r&   r'   r    rH   rI   rJ   rK   rL   rM   rN   r   Zdiff_sumÚindsZ	inc_widthri   ÚiZline_style_to_hatchÚmethods_attrsrO   r   rP   rQ   rR   rS   Úboxr   r   r   Ú
plot_human:  sh    
þ
     þ


".  þrn   c                 C   s4   dt t t ||  ¡¡t | ¡ ¡ d  dƒ }|S )zL Converts human agreement differences to numerical scores for coloring.
    r   rV   )Úminr`   ra   rb   )Zhuman_consensusrl   r   r   r   r   Ú_human_score_mapr  s    0rp   c                    sè  i ‰ i ‰t ‡‡fdd„| ƒD ]´\\}}}‰\}}ˆ ˆtˆƒ¡ˆˆ< ˆˆ krTi ˆ ˆ< tˆdƒ}|dkrn| }n|dkr~d| }|d kr”|ˆ ˆ |< q|dkr®t|Ž ˆ ˆ |< qtj ||¡|d  }|ˆ ˆ |< qtt	ˆ  
¡ ƒ‡‡fd	d„d
}	t	t‡ fdd„|	D ƒƒƒ‰dt tˆƒt|	ƒf¡ }
ttˆƒƒD ]6}tt|	ƒƒD ]"}ˆ |	|  ˆ|  |
||f< q@q0t |
dk¡dks„tdƒ‚|
|
 d¡ |
 d¡|
 d¡ d  }
t |
 d¡ ¡}‡fdd„|D ƒ‰|
|d d …f }
ˆ|	|
fS )Nc                    s    | d d ˆ ko| d d ˆkS )Nr   r   r   )Úx©r&   r'   r   r   Ú<lambda>|  ó    zmake_grid.<locals>.<lambda>r(   r)   r*   r   Úhumanr   c                    s   ˆˆ  S )Nr   )r   )r    Úmetric_sort_orderr   r   rs     rt   )Úkeyc                    s"   g | ]}ˆ |   ¡ D ]}|‘qqS r   )Úkeys)Ú.0Úkr   )Ú
color_valsr   r   Ú
<listcomp>  s       zmake_grid.<locals>.<listcomp>iiÿÿr   zThere are missing data values!g:Œ0âŽyE>c                    s   g | ]}ˆ | ‘qS r   r   )ry   rk   )Úrow_keysr   r   r|   ž  s     )Úfilterre   r   r$   rp   r8   r	   r9   r;   Úlistrx   Úsetr`   ZonesÚrangera   ÚAssertionErrorro   ÚmaxZargsortZmean)rM   r&   r'   rN   r   rL   Zscorer(   r9   Úcol_keysÚdatark   Újrj   r   )r{   r&   r    rv   r'   r}   r   Ú	make_gridy  s:    (
$&r‡   )ÚLinearSegmentedColormapÚred_blue_solid))ç        çÙØØØØØè?r‹   )rV   ç”?rŒ   ))rŠ   çÁ?r   )rV   r‹   r‹   ))rŠ   rŒ   rŒ   )rV   ç¸?rŽ   ))rŠ   r   r   )rV   r   r   )ÚredÚgreenÚblueÚalpha)ÚHTMLc                 C   sò  |d k	rt  |¡ g }|D ]}| t| |d¡ qd}d}|d7 }|d7 }t|ƒD ]è\}}t|| |ƒ\}}	}
|	D ]ô}d}| d¡r–t| ||ƒ d}n|d	kr®t| ||ƒ d}|rrt	 
¡ }t ¡  d
d¡ tj|ddd |d k	rütjd|| ||f dd t ¡  | d¡ t | ¡ ¡ d¡ dd¡}d|  d | d | }|d||f 7 }|d| 7 }|d7 }qrtt| d | ƒj d¡d  ¡ }|dkrø|d7 }t|
jd ƒD ]4}tt|	| ƒj d¡d  ¡ }|d| d 7 }qª|d7 }|d7 }|d 7 }|d!|
jd |f 7 }t|
jd ƒD ]}|d"7 }tt|| ƒj d¡d  ¡ }|d#| d$ 7 }t|
jd ƒD ]²}d|  d | d |	|  }|d%| 7 }|d&tdƒ d' tt d(d)„ t! "d*|
||f d+  ¡d d,… D ƒƒƒ d- td.|
||f  ƒ d/ td.|
||f  ƒ d0 7 }|d$7 }qf|d7 }q|d1|
jd d  7 }qR|d27 }|d37 }|d4t# d5 7 }|d67 }|d7| d8krxd9nd d: 7 }|d;| d<kr–d9nd d= 7 }|d>| d?kr´d9nd d@ 7 }|dA7 }|dB7 }|dC7 }|dD7 }dE}t|dF ƒD ]’}|d"7 }|dG7 }|| d |d  }|dHtt dId)„ t! "d*|d+  ¡D ƒƒd d,… ƒ d- td.| ƒ d/ td.| ƒ d0 7 }|dJ7 }|d7 }qð|dK7 }|dL7 }|d k	rât$|dM dNƒ.}| %dO¡ | %|¡ | %|¡ | %dP¡ W 5 Q R X nt&|| ƒS d S )QNrr   zR<style type='text/css'> .shap_benchmark__select:focus { outline-width: 0 }</style>r   za<div style='position: fixed; left: 0px; top: 0px; right: 0px; height: 230px; background: #fff;'>
z‹<div style='position: absolute; bottom: 0px; left: 0px; right: 0px;' align='center'><table style='border-width: 1px; margin-right: 100px'>
FZhuman_T)Zlocal_accuracyZruntimeZconsistency_guaranteesgÛ¶mÛ¶m@g·mÛ¶mÛ@Zpngé¯   )r<   Zdpiz%s/plot_%s_%s_%s.pdfZpdf)r<   r   zutf-8r   Zplot__r0   zÕ<div onclick='document.getElementById("%s").style.display = "none"' style='display: none; position: fixed; z-index: 10000; left: 0px; right: 0px; top: 0px; bottom: 0px; background: rgba(255,255,255,0.9);' id='%s'>zÍ<img width='600' height='500' style='margin-left: auto; margin-right: auto; margin-top: 230px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);' src='data:image/png;base64,%s'>z</div>z9<tr><td style='background: #fff; width: 250px'></td></td>r   zð<td style='width: 40px; min-width: 40px; background: #fff; text-align: right;'><div style='margin-left: 10px; margin-bottom: -5px; white-space: nowrap; transform: rotate(-45deg); transform-origin: left top 0; width: 1.5em; margin-top: 8em'>z</div></td>z</tr>
z</table></div></div>
zK<table style='border-width: 1px; margin-right: 100px; margin-top: 230px;'>
z—<tr><td style='background: #fff'></td><td colspan='%d' style='background: #fff; font-weight: bold; text-align: center; margin-top: 10px;'>%s</td></tr>
z<tr>ze<td style='background: #ffffff; text-align: right; width: 250px' title='shap.LinearExplainer(model)'>z</td>
zá<td onclick='document.getElementById("%s").style.display = "block"' style='padding: 0px; padding-left: 0px; padding-right: 0px; border-left: 0px solid #999; width: 42px; min-width: 42px; height: 34px; background-color: #fff'>z<div style='opacity: z; background-color: rgbc                 s   s   | ]}t |d  ƒV  qdS ©éÿ   N©Úint©ry   r   r   r   r   Ú	<genexpr>ö  s     zplot_grids.<locals>.<genexpr>é   rW   r   z
; height: é   z1px; margin-left: auto; margin-right: auto; width:z
px'></div>z8<tr><td colspan='%d' style='background: #fff'></td></tr>z</table>zs<div style='position: fixed; left: 0px; top: 0px; right: 0px; text-align: left; padding: 20px; text-align: right'>
z<div style='float: left; font-weight: regular; font-size: 24px; color: #000;'>SHAP Benchmark <span style='font-size: 14px; color: #777777;'>vz</span></div>
a/  <select id='shap_benchmark__select' onchange="document.location = '../' + this.value + '/index.html'"dir='rtl' class='shap_benchmark__select' style='font-weight: normal; font-size: 20px; color: #000; padding: 10px; background: #fff; border: 1px solid #fff; -webkit-appearance: none; appearance: none;'>
z<option value='human' ru   Úselectedz)>Agreement with Human Intuition</option>
z<option value='corrgroups60' Zcorrgroups60z'>Correlated Groups 60 Dataset</option>
z$<option value='independentlinear60' Zindependentlinear60z(>Independent Linear 60 Dataset</option>
z
</select>
z</div>
z€<table style='border-width: 0px; width: 100px; position: fixed; right: 50px; top: 200px; background: rgba(255, 255, 255, 0.9)'>
za<tr><td style='background: #fff; font-weight: normal; text-align: center'>Higher score</td></tr>
é   é	   zk<td style='padding: 0px; padding-left: 0px; padding-right: 0px; border-left: 0px solid #999; height: 34px'>z-<div style='opacity: 1; background-color: rgbc                 s   s   | ]}t |d  ƒV  qdS r•   r—   r™   r   r   r   rš      s     z</td>z`<tr><td style='background: #fff; font-weight: normal; text-align: center'>Lower score</td></tr>
z	</table>
z/index.htmlÚwzh<html><body style='margin: 0px; font-size: 16px; font-family: "Myriad Pro", Arial, sans-serif;'><center>z</center></body></html>)'ÚosÚmkdirÚextendr   Ú	enumerater‡   r   rn   rT   ÚioÚBytesIOr6   rG   Zset_size_inchesZsavefigÚcloseÚseekÚbase64Ú	b64encodeÚreadÚdecodeÚreplacer   r   r   r   r   r   Úshaper	   r   ÚstrÚtupler   Zred_blue_no_boundsr   ÚopenÚwriter“   )r&   Zmodel_namesZout_dirrM   r'   r"   ÚoutÚindr}   r„   r…   r    Z	save_plotÚbufZdata_uriZplot_idrQ   r†   rP   rk   rO   Zlegend_sizeÚvalÚfr   r   r   Ú
plot_grids²  s¢    



"
|X



r¸   )N)#Únumpyr`   rI   r   Zplotsr   r   r   r   r   r	   r8   r¥   r©   r¡   Zmatplotlib.pyplotZpyplotr6   rg   ÚImportErrorÚmetadataZbenchmark_color_mapr   r   r$   rT   rn   rp   r‡   Zmatplotlib.colorsrˆ   r‰   ZIPython.core.displayr“   r¸   r   r   r   r   Ú<module>   sT    Iø"8*ö