
    ӆhPT                     n    S r SSKrSSKrSSKJr   " S S5      rS rS r	S	 r
 " S
 S5      rSS jrS rg)zThis module is a pure python implementation of Tree SHAP.
It is primarily for illustration since it is slower than the 'tree'
module which uses a compiled C++ implementation.
    N   )ExplainerErrorc                   <    \ rS rSrSrS rS	S jrS	S jrS
S jrSr	g)TreeExplainer   z1A pure Python (slow) implementation of Tree SHAP.c                    SU l         [        [        U5      5      R                  S5      (       a6  UR                   Vs/ s H  n[        UR                  5      PM     snU l        O[        [        U5      5      R                  S5      (       a5  UR                   Vs/ s H  n[        UR                  SS9PM     snU l        O[        [        U5      5      R                  S5      (       a  SU l         Xl        OV[        [        U5      5      R                  S5      (       a  S	U l         Xl        O [        S
[        [        U5      5      -   5      eU R                   S:X  a  [        R                  " U R                   Vs/ s H  oDR                  PM     sn5      S-   nXUS-   -  S-  n[        R                  " U[        R                  S9U l        [        R                  " U[        R                  S9U l        [        R                  " U[        R                  S9U l        [        R                  " U[        R                  S9U l        g g s  snf s  snf s  snf )Ninternalz/sklearn.ensemble.forest.RandomForestRegressor'>z0sklearn.ensemble.forest.RandomForestClassifier'>T)	normalizezxgboost.core.Booster'>xgboostzlightgbm.basic.Booster'>lightgbmz+Model type not supported by TreeExplainer: r      dtype)
model_typestrtypeendswithestimators_Treetree_treesr   npmax	max_depthzerosint32feature_indexesfloat64zero_fractionsone_fractionspweights)selfmodelkwargsetmaxdss          iC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\shap/explainers/pytree.py__init__TreeExplainer.__init__   s   $tE{$$%VWW161B1BC1BA$qww-1BCDJe&&'YZZAFARARSARA$qww$7ARSDJe&&'?@@'DOJe&&'ABB(DOJ !NQTUYZ_U`Qa!abb??j(66

;
1;;
;<q@D"q(A#%88ARXX#>D "$((1BJJ"?D!#!2::!>DHHQbjj9DM ) DS <s   II=Ic                    U R                   S:X  a_  SS Kn[        [        U5      5      R	                  S5      (       d  UR                  U5      nUS:X  a  SnU R                  R                  XSS9$ U R                   S:X  a  U R                  R                  XSS9$ [        U[        R                  [        R                  45      (       a  UR                  n[        U[        R                  5      (       d   S	[        [        U5      5      -   5       e[        UR                   5      S
:X  d   [        UR                   5      S:X  d   S5       eU R                  S   R                  R                   S
   n[        UR                   5      S
:X  a  [        R"                  " UR                   S   S
-   U5      n[        R"                  " UR                   S   [$        S9nU R                   H  nU R'                  XXv5        M     U[        U R                  5      -  nUS
:X  a	  US S 2S4   $ [)        U5       V	s/ s H  oS S 2U	4   PM     sn	$ [        UR                   5      S:X  Ga   [        R"                  " UR                   S   UR                   S
   S
-   U45      n[        R"                  " UR                   S
   [$        S9n[)        UR                   S   5       H9  n	U R                   H&  nU R'                  XU	S S 24   XvU	S S 2S S 24   5        M(     M;     U[        U R                  5      -  nUS
:X  a  US S 2S S 2S4   $ [)        U5       V	s/ s H  oS S 2S S 2U	4   PM     sn	$ g s  sn	f s  sn	f )Nr   r   xgboost.core.DMatrix'>T)ntree_limitpred_contribsr   )num_iterationpred_contribzUnknown instance type: r   r   z%Instance must have 1 or 2 dimensions!r   )r   r   r   r   r   DMatrixr   predict
isinstancepdSeries	DataFramevaluesr   ndarraylenshaper   bool	tree_shaprange)
r"   X
tree_limitr$   r   	n_outputsphi	x_missingr&   is
             r)   shap_valuesTreeExplainer.shap_values   s    ??i'tAw<(()ABBOOA&R
::%%at%TT__
*::%%aPT%UU a"))R\\233A!RZZ((R*Cc$q'l*RR(177|q CLA$5^7^^5JJqM((..q1	 qww<1((1771:>95C48IZZqY4  3tzz?"CA~1a4y +0+;<+;aAqD	+;<<\Q((AGGAJ
Q	BCC48I1771:&ANN11gyaAg,G $ ' 3tzz?"CA~1a7|#.3I.>?.>Aq!G.>??  = @s   .MM#c                     U R                   S:X  a_  SS Kn[        [        U5      5      R	                  S5      (       d  UR                  U5      nUS:X  a  SnU R                  R                  XSS9$ [        S[        [        U5      5      -   5      e)Nr   r   r-   r.   T)r/   pred_interactionsz5Interaction values not yet supported for model type: )	r   r   r   r   r   r3   r   r4   NotImplementedError)r"   r@   rA   r$   r   s        r)   shap_interaction_values%TreeExplainer.shap_interaction_values   s    ??i'tAw<(()ABBOOA&R
::%%aSW%XX%&]`cdhijdk`l&lmm    c                 p   US:X  a"  USS S 24==   UR                   SS S 24   -  ss'   [        UR                  UR                  UR                  UR
                  UR                  UR                   UR                  UUUSSU R                  U R                  U R                  U R                  SSSUUS5        g )Nr   r.   r   )r9   tree_shap_recursivechildren_leftchildren_rightchildren_defaultfeatures
thresholdsnode_sample_weightr   r   r    r!   )r"   treexrD   rC   	conditioncondition_features          r)   r>   TreeExplainer.tree_shap   s     >AJ$++ad++J 	!!MMOOKK##  MM-	
rM   )r   r   r    r!   r   r   N)r.   )r   r   )
__name__
__module____qualname____firstlineno____doc__r*   rF   rK   r>   __static_attributes__ rM   r)   r   r      s    ;:2/@bn
rM   r   c                     XpU'   XQU'   XbU'   US:X  a  SX4'   OSX4'   [        US-
  SS5       H7  nX8S-   ==   XcU   -  US-   -  US-   -  -  ss'   XSU   -  XH-
  -  US-   -  X8'   M9     g )Nr         ?        r   r.   r?   )	r   r   r    r!   unique_depthzero_fractionone_fractionfeature_indexrE   s	            r)   extend_pathrj   	  s     %2L!#0< ".,q!$!$<!#R,Q<1+5SA\TWEWXX#qk1\5EF,Y\J\] -rM   c                 2   X%   nX   nX4   n[        US-
  SS5       HJ  n	US:w  a-  X9   n
XS-   -  U	S-   U-  -  X9'   XU	   U-  XI-
  -  US-   -  -
  nM6  X9   US-   -  XtU	-
  -  -  X9'   ML     [        XT5       H  n	X	S-      X	'   XS-      X'   X)S-      X)'   M      g )Nr   r.   rd   rc   re   )r   r   r    r!   rf   
path_indexrh   rg   next_one_portionrE   tmps              r)   unwind_pathro     s     ,L".M-<!#R,3+C*S.@Aa#gQ]E]^HK"a[=%@LDT%UYehkYk%ll#;,*:;`aQa@bcHK - :,,U3*q51(Q/ -rM   c                     X%   nX   nX4   nSn	[        US-
  SS5       HH  n
US:w  a*  XS-   -  U
S-   U-  -  nX-  n	X:   X-  XJ-
  US-   -  -  -
  nM3  XU
   U-  XJ-
  US-   -  -  -  n	MJ     U	$ )Nr   r   r.   rd   rc   re   )r   r   r    r!   rf   rl   rh   rg   rm   totalrE   rn   s               r)   unwound_path_sumrr   1  s     ,L".M-E<!#R,3"S&89a#g=UVCLE'{S-@\EUZfilZlDm-nnqkM1|7GL[^L^6_``E - LrM   c                       \ rS rSrSS jrSrg)r   iB  c                 F   [        [        U5      5      R                  S5      (       Ga  UR                  R	                  [
        R                  5      U l        UR                  R	                  [
        R                  5      U l        U R                  U l        [        US5      (       a;  [
        R                  " UR                  U R                  U R                  5      U l        UR                  R	                  [
        R                  5      U l        UR                  R	                  [
        R                  5      U l        U(       aV  UR"                  S S 2SS S 24   R$                  UR"                  S S 2SS S 24   R'                  S5      -  R$                  U l        OUR"                  S S 2SS S 24   U l        UR*                  R	                  [
        R                  5      U l        [/        U R                  U R                  U R,                  U R(                  S5      U l        g g )Nz'sklearn.tree._tree.Tree'>missing_go_to_leftr   r   )r   r   r   rP   astyper   r   rQ   rR   hasattrwhereru   featurerS   	thresholdr   rT   valueTsumr9   weighted_n_node_samplesrU   compute_expectationsr   )r"   rV   r
   s      r)   r*   Tree.__init__Q  s~   tDz?##$@AA!%!3!3!:!:288!DD"&"5"5"<"<RXX"FD$($6$6D!t122(*1H1H$J\J\^b^q^q(r% LL//9DM"nn33BJJ?DO#zz!Q'244tzz!Q'7J7N7Nq7QQTT"jjAq1&*&B&B&I&I"**&UD# 2""D$7$79P9PRVR]R]_`DN! BrM   )rR   rP   rQ   rS   r   rU   rT   r9   N)F)r[   r\   r]   r^   r*   r`   ra   rM   r)   r   r   B  s    rM   r   c           	          X   S:X  a  X4S S 24   X4S S 24'   gX   nX   n[        XX#XeS-   5      n[        XX#XuS-   5      n	X&   n
X'   nXUS S 24   -  XUS S 24   -  -   X-   -  nXUS S 24'   [        X5      S-   $ )Nr.   r   r   )r   r   )rP   rQ   rU   r9   rE   depthliri
depth_leftdepth_rightleft_weightright_weightvs                r)   r   r   h  s    Bd|!t)-I[egqrirs
*=J\fhrsjst(,)-"a%=(<Q-+GGKLfgq!t:+a//rM   c                    US:X  a  g XS-   S  nUS US-    US US-   & XS-   S  nUS US-    US US-   & XS-   S  nUS US-    US US-   & XS-   S  nUS US-    US US-   & US:X  d  UU:w  a  [        UUUUUUUU5        X:   nX   S:X  aS  [        SUS-   5       H?  n[        UUUUUU5      nU	UU   S S 24==   UUU   UU   -
  -  XZS S 24   -  U-  -  ss'   MA     g SnX
   nX   nUU   S:X  a  X*   nOUU   XJ   :  a  UnOUnUU:X  a  UOUn Xj   nUU   U-  n!UU    U-  n"Sn#Sn$Sn%U%U::  a  UU%   U:X  a  OU%S-  n%U%U::  a  M  U%US-   :w  a  UU%   n#UU%   n$[        UUUUUU%5        US-  nUn&Un'US:  a  UU:X  a  Sn'US-  nOUS:  a  UU:X  a  U&U!-  n&U'U"-  n'US-  n[	        U UUUUUUUUU	UUS-   UUUUU!U#-  U$UUUU&5        [	        U UUUUUUUUU	U US-   UUUUU"U#-  SUUUU'5        g )Nrd   r   r   r.   rc   )rj   r?   rr   ro   rO   )(rP   rQ   rR   rS   rT   r9   rU   rW   rD   rC   
node_indexrf   parent_feature_indexesparent_zero_fractionsparent_one_fractionsparent_pweightsparent_zero_fractionparent_one_fractionparent_feature_indexrX   rY   condition_fractionr   r   r    r!   split_indexrE   w	hot_indexcleftcright
cold_indexhot_zero_fractioncold_zero_fractionincoming_zero_fractionincoming_one_fractionrl   hot_condition_fractioncold_condition_fractions(                                           r)   rO   rO   z  s   2 S  -A-=-?@O*@AS<RSCS*TO&lQ&'*!+;+=>N)>?QPQAQ)RN%\A%&()9);<M(<=O|a?O(PM$L1$%a/12H#23E\A5E#FH|a A~*.BB  		
 &K !R'q,*+A .-QY[gijkA"A%&]1%q(99:VPQM=RRUgg& , 	)+[!Q&(4I{^j44II(E1Vu
*.y9A=/
;a?!$ # 
L(z*k9!OJ L(
 ))%3J%?"$1*$=!R^`jkAL "4"4q=[,==&)#AL]{.??"&77"#'99#AL1 66!"-	
2 	1!77#-	
rM   )r   )r_   numpyr   pandasr6   utils._exceptionsr   r   rj   ro   rr   r   r   rO   ra   rM   r)   <module>r      sK   
   /Dx
 x
z^$0,"" "L0$X
rM   