
    -i 1                        S SK rS SKrS SKJrJr  S SKJr  S SKJr  S SK	J
r
JrJr  S SK	Jr  S SKJr  S SKJrJr  S S	KJrJr  S
 rS rS rS rS rS rS rS rS rS r \RB                  RE                  S\" 5       5      \RB                  RE                  S\RF                  " S5      \RH                  " S5      S4S \RJ                  " S5      RM                  \RH                  5      S4S S S4S S S4\RN                  " / S Q5      \RN                  " / S!Q5      S 4\RN                  " \RP                  \RP                  S S"S#S$/5      \RN                  " / S%Q5      S 4\RN                  " / S Q5      \RN                  " / S%Q\RH                  S&9S4/5      S' 5       5       r)\RB                  RE                  S(SS)/5      S* 5       r*S+ r+\RB                  RY                  \\" S,5      :  S-S.9\RB                  RE                  S// S0Q5      S1 5       5       r-\RB                  RY                  \\" S,5      :  S2S.9\RB                  RE                  S// S0Q5      S3 5       5       r.g)4    N)assert_allcloseassert_array_equal)approx)config_context)_convert_to_numpyget_namespace)yield_namespace_device_dtype_combinationsdevice)_array_api_for_tests)
np_versionparse_version)_averaged_weighted_percentile_weighted_percentilec                      [         R                  " / SQ5      n [         R                  " / SQ5      n[        XS5      nU[         R                  " U 5      :X  d   eg )Nr                  )r   r   r   r   r   r   2   )nparrayr   medianyswscores      Q/var/www/html/venv/lib/python3.13/site-packages/sklearn/utils/tests/test_stats.pytest_averaged_weighted_medianr!      sB    
#$A	$	%B)!4EBIIaL       c                     [         R                  R                  U 5      nUR                  SSS9n[         R                  " S5      n[        X#S5      nU[         R                  " USSS9:X  d   eg )N   
   sizeaveraged_inverted_cdf)method)r   randomRandomStaterandintonesr   
percentile)global_random_seedrngr   r   r   s        r    !test_averaged_weighted_percentiler1      s^    
))

 2
3CBR A	B)!4EBMM!R0GHHHHr"   c                      [         R                  " / SQ5      n [         R                  " / SQ5      nSn[        XU5      n[        XU5      nX4:X  d   eg )N)r   r   r   )r   r   r   r   )r   r   r   r   )r   r   qscore_averagedr   s        r    %test_averaged_and_weighted_percentiler5   &   sG    
A	)	B
A21!<N *E"""r"   c                      [         R                  " S[         R                  S9n SU SS& SU SS& SU S	'   S
U S'   [         R                  " S[         R                  S9nSUS	'   [	        XS5      n[        U5      S
:X  d   eg)zCCheck `weighted_percentile` on artificial data with obvious median.f   dtyper   Nr   r   ii r           )r   emptyfloat64r-   r   r   r   r   values      r    test_weighted_percentiler@   1   sy    
BJJ'AAcrFAcdGAbEAbE	BJJ	'BBrF +E%=Ar"   c                      [         R                  " S[         R                  S9n U R                  S5        [         R                  " S[         R                  S9n[        XS5      n[        U5      S:X  d   eg)z8Check `weighted_percentile` with all weights equal to 1.r7   r8   r;   r   r   Nr   r<   r=   fillr-   r   r   r   s      r    test_weighted_percentile_equalrD   >   sS    
BJJ'AFF3K	BJJ	'B +E%=Ar"   c                     [         R                  " S[         R                  S9n U R                  S5        [         R                  " S[         R                  S9nUR                  S5        [        XS5      n[        U5      S:X  d   eg)z8Check `weighted_percentile` with all weights equal to 0.r7   r8   g      ?r;   r   NrB   r>   s      r    $test_weighted_percentile_zero_weightrF   G   s^    
BJJ'AFF3K	BJJ	'BGGCL +E%=Cr"   c                     [         R                  " / SQ5      n [         R                  " / SQ5      n[        XS5      n[        U5      S:X  d   e[        XS5      n[        U5      S:X  d   e[        XS5      n[        U5      S:X  d   eg	)
zCheck `weighted_percentile(percentile_rank=0)` behaves correctly.

Ensures that (leading)zero-weight observations ignored when `percentile_rank=0`.
See #20528 for details.
r   r   r   r   r   r   r   r   r   r   r   d   r   N)r   r   r   r   r>   s      r    4test_weighted_percentile_zero_weight_zero_percentilerJ   Q   s|     	#$A	$	%B *E%=A +E%=A ,E%=Ar"   c                    [         R                  R                  U 5      nUR                  SSS9n[         R                  " UR
                  5      n[         R                  " U5      n[        X#5      nU[        U5      :X  d   eg)a  Checks `_weighted_percentile(percentile_rank=50)` is the same as `np.median`.

`sample_weights` are all 1s and the number of samples is odd.
When number of samples is odd, `_weighted_percentile` always falls on a single
observation (not between 2 values, in which case the lower value would be taken)
and is thus equal to `np.median`.
For an even number of samples, this check will not always hold as (note that
for some other percentile methods it will always hold). See #17370 for details.
r%      r&   N)	r   r*   r+   r,   r-   shaper   r   r   )r/   r0   xweightsr   w_medians         r    "test_weighted_median_equal_weightsrQ   c   sg     ))

 2
3CBR AggaggGYYq\F#A/HVH%%%%r"   c                    [         R                  R                  U 5      nUR                  SSS9nUR	                  SSS9n[         R
                  " X#5      n[         R                  " U5      n[        X#5      nU[        U5      :X  d   eg )Nr$   r%   r&   r   )	r   r*   r+   r,   choicerepeatr   r   r   )r/   r0   rN   rO   x_manualr   rP   s          r    $test_weighted_median_integer_weightsrV   u   sv     ))

 2
3CBR Ajjj$Gyy$HYYx F,Q8HVH%%%%r"   c           	         [         R                  R                  U 5      nUR                  SSS9nUR	                  SSS9nUR                  SSS9n[         R
                  " X$45      R                  n[        XS5      n[        UR                  S   5       Vs/ s H  n[        US S 2U4   U5      PM     nn[        Xh5        UR	                  SSS9n	[         R
                  " X945      R                  n
[        XZ5      n[        UR                  S   5       Vs/ s H  n[        US S 2U4   U
S S 2U4   5      PM     nn[        Xh5        g s  snf s  snf )Nr%   r&   r   r$   r   )r   r*   r+   r,   rS   vstackTr   rangerM   r   )r/   r0   x1w1x2x_2drP   ip_axis_0w2w_2ds              r    test_weighted_percentile_2drc      s1   
))

 2
3C	Rb	!B	AB	B	Rb	!B99bX  D#D-H>CDJJqM>RS>R$T!Q$Z4>RHSH'	AB	B99bX  D#D/H>CDJJqM>R>RT!Q$Zad4>R   H' Ts   E$Ez#array_namespace, device, dtype_namezdata, weights, percentile*   r   r   c                 $    U R                  S5      $ Nr   randr0   s    r    <lambda>rj      s    SXXb\r"   c                 &    U R                  SS5      $ )Nr   r   rg   ri   s    r    rj   rj      s    SXXb!_r"   c                 ^    U R                  S5      R                  [        R                  5      $ rf   rh   astyper   float32ri   s    r    rj   rj      s    #((2,2E2Ebjj2Qr"   K   c                 &    U R                  SS5      $ Nr$   r   rg   ri   s    r    rj   rj      s    Qr"   c                 `    U R                  SS5      R                  [        R                  5      $ rr   rm   ri   s    r    rj   rj      s    Q..rzz:r"      r   rH   r   r   r   )r   r   r   r   r   r   r8   c                    US:X  a/   SSK nX'R                  S5      :X  a  [        R                  " S5        [        X5      nUR                  SUS9n	UR                  SUS9n
US:X  aA  UR                  UR                  X5      U	:H  5      (       a  [        R                  " SU 35        [        R                  R                  U 5      n[        U5      (       a  U" U5      OUn[        U5      (       a  U" U5      OUnUR                  U5      n[        XU5      nUR!                  XS9nUR!                  XS9n[#        S	S
9   [        UUU5      n[%        U5      [%        U5      :X  d   e['        U5      S   ['        U5      S   :X  d   e[)        UUS9nSSS5        WR*                  UR*                  :X  d   eUR,                  UR,                  :X  d   e[/        UU5        US:X  a5  UR*                  UR*                  s=:X  a  [        R0                  :X  d   e   egUR*                  [        R2                  :X  d   eg! [         a     GNf = f! , (       d  f       N= f)zECheck `_weighted_percentile` gives consistent results with array API.array_api_strictr   Ndevice1zXarray_api_strict has bug when indexing with tuple of arrays on non-'CPU_DEVICE' devices.r   r
   zxp.nextafter is broken on T)array_api_dispatch)xpro   )rv   DevicepytestxfailImportErrorr   zerosr-   all	nextafterr   r*   r+   callablern   r   asarrayr   array_devicer   r   r9   rM   r   ro   r=   )r/   array_namespacer   
dtype_namedatarO   r.   rv   ry   zerooner0   X_np
weights_np	result_npX_xp
weights_xp	result_xpresult_xp_nps                      r    .test_weighted_percentile_array_api_consistencyr      s   D ,,
	# 00;;3
 
o	6B
 88Af8%D
''!F'
#CQ266",,t"9T"ABB1&:;
))

 2
3C 49DD!)'!2!2J;;z"D$TzBI::d:*DJ6J	4	0(z:F	I&,t*<<<<Y'*mD.A!.DDDD(r:	 
1 000000I|, Y!!Y__B

BBBBB!!RZZ///[  		> 
1	0s   H9 ?AI
9
II

Isample_weight_ndimr   c           
         [         R                  R                  U5      nUR                  SS5      n[         R                  X2R                  " UR
                  6 S:  '   [         R                  " U5      nU S:X  a  UR                  SSSS9nOUR                  SSS	S9n[        X5S
5      n[        UR
                  S   5       Vs/ s H  nX4SS2U4   ) U4   PM     nnUR                  S:X  aM  [         R                  " XSR
                  S   5      R                  UR
                  S   UR
                  S   5      n[        UR
                  S   5       Vs/ s H  ouUSS2U4   ) U4   PM     n	n[         R                  " [        UR
                  S   5       Vs/ s H  n[        X   X   S
5      PM     sn5      n
[        X5        gs  snf s  snf s  snf )a  Test that calling _weighted_percentile on an array with nan values returns
the same results as calling _weighted_percentile on a filtered version of the data.
We test both with sample_weight of the same shape as the data and with
one-dimensional sample_weight.rI   r%         ?r   r      )rI   r%   r&   )rI      Nr   )r   r*   r+   rh   nanrM   isnanr,   r   rZ   ndimrT   reshaper   r   )r   r/   r0   array_with_nansnan_masksample_weightresultscolfiltered_arrayfiltered_weightsexpected_resultss              r    %test_weighted_percentile_nan_filteredr      s    ))

 2
3ChhsB'O>@ffOHHo334s:;xx(HQAqy9Aqv6 #?2FG
 ..q122C 	!S&))3./2   Q		-1F1Fq1IJRR!!!$o&;&;A&>
 :??T?TUV?W9X9X#x3'',-9X   xx _22156	
6 !!46F6KRP6	
 '1'
	
s   GGGc            	         [         R                  " [         R                  S/[         R                  S/[         R                  [         R                  /[         R                  [         R                  /[         R                  S/[         R                  [         R                  //5      n [         R                  " U 5      nSn[	        XU5      n[         R
                  " U[         R                  " [         R                  S/5      SS9(       d   eg)zCCheck that nans are ignored in general, except for all NaN columns.r   r   r   Z   T)	equal_nanN)r   r   r   	ones_liker   array_equal)r   rO   percentile_rankvaluess       r    'test_weighted_percentile_all_nan_columnr     s     HHVVQKVVQKVVRVVVVRVVVVQKVVRVV	
	E ll5!GO!%/BF
 >>&"((BFFA;"74HHHr"   z2.0z2np.quantile only accepts weights since version 2.0)reasonr.   )B   r%   r   c                     [         R                  R                  U5      nUR                  SS5      nUR	                  SSSS9n[        X4U 5      n[         R                  " X0S-  USSS	9n[        XV5        g
)zXCheck that _weighted_percentile delivers equivalent results as np.quantile
with weights.r%   rI   r   r   r%   rI   r&   r   inverted_cdfrO   axisr)   N)r   r*   r+   rh   r,   r   quantiler   )r.   r/   r0   r   r   percentile_weighted_percentilepercentile_numpy_quantiles          r    ,test_weighted_percentile_like_numpy_quantiler   0  sw     ))

 2
3CHHREKK19K5M%9j&" !#CQ~! 5Qr"   z5np.nanquantile only accepts weights since version 2.0c                 D   [         R                  R                  U5      nUR                  SS5      n[         R                  X2R                  " UR
                  6 S:  '   UR                  SSSS9n[        X4U 5      n[         R                  " UU S-  USS	S
9n[        XV5        g)z[Check that _weighted_percentile delivers equivalent results as np.nanquantile
with weights.r%   rI   r   r   r   r   r&   r   r   r   N)
r   r*   r+   rh   r   rM   r,   r   nanquantiler   )r.   r/   r0   r   r   r   percentile_numpy_nanquantiles          r    /test_weighted_percentile_like_numpy_nanquantiler   G  s     ))

 2
3Chhr3'O>@ffOHHo334s:;KK19K5M%9
&" $&>>S$  5Tr"   )/numpyr   r{   numpy.testingr   r   r   sklearn._configr   sklearn.utils._array_apir   r   r	   r   r   sklearn.utils.estimator_checksr   sklearn.utils.fixesr   r   sklearn.utils.statsr   r   r!   r1   r5   r@   rD   rF   rJ   rQ   rV   rc   markparametrizero   int32r-   rn   r   r   r   r   r   skipifr   r    r"   r    <module>r      s]     =  * 
 < ? 9 S!I#
 $&$	&(. )+T+V  
B!b)	!2772;#5#5bhh#?D	$&QSUV (:	
 
$	%rxx0B'CQG	2662661aA.	/:L1MqQ HH'(HH'rxx8	
%6407<40n -1v6'2 7'2TI0 u%%?   |4R 5	
R$ u%%B   |4U 5	
Ur"   