`L i 1ddlZddlZddlmZmZddlmZddlmZddl m Z m Z m Z ddl m ZddlmZddlmZmZdd lmZmZd Zd Zd Zd ZdZdZdZdZdZdZ ejBjEde ejBjEdejFdejHddfdejJdjMejHdfdddfdddfejNgd ejNgd!dfejNejPejPdd"d#d$gejNgd%dfejNgd ejNgd%ejH&dfgd'Z)ejBjEd(dd)gd*Z*d+Z+ejBjYeed,kd-.ejBjEd/gd0d1Z-ejBjYeed,kd2.ejBjEd/gd0d3Z.y)4N)assert_allcloseassert_array_equal)approx)config_context)_convert_to_numpy get_namespace)yield_namespace_device_dtype_combinationsdevice)_array_api_for_tests) np_version parse_version)_averaged_weighted_percentile_weighted_percentilectjgd}tjgd}t||d}|tj|k(sJy)Nr)rrrrrr2)nparrayrmedianyswscores d/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sklearn/utils/tests/test_stats.pytest_averaged_weighted_medianr!sD #$A $ %B )!R 4E BIIaL  ctjj|}|jdd}tjd}t ||d}|tj |ddk(sJy)N sizeaveraged_inverted_cdf)method)rrandom RandomStaterandintonesr percentile)global_random_seedrngrrrs r !test_averaged_weighted_percentiler1s` ))   2 3C BR  A B )!R 4E BMM!R0GH HH Hr"ctjgd}tjgd}d}t|||}t|||}||k(sJy)N)rrr)rrrr)rrrr)rrqscore_averagedrs r %test_averaged_and_weighted_percentiler5&sM A ) B A21b!sU BJJ'AFF3K BJJ 'B B +E %=A  r"ctjdtj}|jdtjdtj}|jdt ||d}t |dk(sJy)z8Check `weighted_percentile` with all weights equal to 0.r7r8g?r;rNrBr>s r $test_weighted_percentile_zero_weightrFGs` BJJ'AFF3K BJJ 'BGGCL B +E %=C  r"ctjgd}tjgd}t||d}t|dk(sJt||d}t|dk(sJt||d}t|dk(sJy ) zCheck `weighted_percentile(percentile_rank=0)` behaves correctly. Ensures that (leading)zero-weight observations ignored when `percentile_rank=0`. See #20528 for details. rrrrrrrrrrrdrN)rrrrr>s r 4test_weighted_percentile_zero_weight_zero_percentilerJQs #$A $ %B B *E %=A   B +E %=A   B ,E %=A  r"ctjj|}|jdd}tj|j }tj |}t||}|t|k(sJy)aChecks `_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) rr*r+r,r-shaperrr)r/r0xweightsrw_medians r "test_weighted_median_equal_weightsrQcsi ))   2 3C BR  AggaggG YYq\F#Aw/H VH% %% %r"ctjj|}|jdd}|j dd}tj ||}tj |}t||}|t|k(sJy)Nr$r%r&r) rr*r+r,choicerepeatrrr)r/r0rNrOx_manualrrPs r $test_weighted_median_integer_weightsrVusz ))   2 3C BR  Ajjj$GyyG$H YYx F,Q8H VH% %% %r"c tjj|}|jdd}|j dd}|jdd}tj ||fj }t||}t|jdDcgc]}t|dd|f|}}t|||j dd} tj || fj } t|| }t|jdDcgc]}t|dd|f| dd|f}}t||ycc}wcc}w)Nr%r&rr$r) rr*r+r,rSvstackTrrangerMr) r/r0x1w1x2x_2drPip_axis_0w2w_2ds r test_weighted_percentile_2drcs7 ))   2 3C Rb !B AB B Rb !B 99b"X  D#D"-H>CDJJqM>RS$T!Q$Z4SHSHh' AB B 99b"X  D#D$/H>CDJJqM>R9:T!Q$Zad4HHh'Ts E"!Ez#array_namespace, device, dtype_namezdata, weights, percentile*rrc$|jdSNrrandr0s r rjsSXXb\r"c&|jddS)Nrrrgris r rjrjsSXXb!_r"c^|jdjtjSrfrhastyperfloat32ris r rjrjs#((2,2E2Ebjj2Qr"Kc&|jddSNr$rrgris r rjrjsQr"c`|jddjtjSrrrmris r rjrjsQ..rzz:r"rrHrrr)rrrrrrr8c|dk(r/ ddl}||jdk(rtjd t ||}|j d|} |jd|} |dk(r<|j|j| | | k(rtjd|tjj|} t|r|| n|} t|r|| n|} | j|} t| | |}|j!| |}|j!| |}t#d 5t|||}t%|t%|k(sJt'|dt'|dk(sJt)|| }dddj*|j*k(sJ|j,|j,k(sJt/|||d k(r3|j*|j*cxk(rtj0k(sJJy|j*tj2k(sJy#t$rY wxYw#1swYxYw) zECheck `_weighted_percentile` gives consistent results with array API.array_api_strictrNdevice1zXarray_api_strict has bug when indexing with tuple of arrays on non-'CPU_DEVICE' devices.rr zxp.nextafter is broken on T)array_api_dispatch)xpro)rvDevicepytestxfail ImportErrorr zerosr-all nextafterrr*r+callablernrasarrayr array_devicerrr9rMrror=)r/array_namespacer dtype_namedatarOr.rvryzerooner0X_np weights_np result_npX_xp weights_xp result_xp result_xp_nps r .test_weighted_percentile_array_api_consistencyrs*D,,  #)00;; 3 ov 6B 88Af8 %D ''!F' #CQ266",,tS"9T"AB 1&:; ))   2 3C 49DD!)'!2J ;;z "D$T:zBI ::d6: *DJv6J 4 0;(z:F I&,t*<<<<Y'*mD.A!.DDDD(r: ;    00 0    00 0I|,Y!!Y__B BBBBB!!RZZ///[   >;;sH6AI6 IIIsample_weight_ndimrc tjj|}|jdd}tj||j|j dk<tj |}|dk(r|jddd}n|jddd }t||d }t|j dDcgc]}||d d |f|f}}|jdk(rMtj||j dj|j d |j d}t|j dDcgc]}||d d |f|f} }tjt|j dDcgc]}t||| |d c}} t| |y cc}wcc}wcc}w) aTest 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.rIr%?rr)rIr%r&)rINr)rr*r+rhnanrMisnanr,rrZndimrTreshaperr) rr/r0array_with_nansnan_mask sample_weightresultscolfiltered_arrayfiltered_weightsexpected_resultss r %test_weighted_percentile_nan_filteredrs ))   2 3ChhsB'O>@ffOHCHHo334s:;xx(HQ Aqy 9  Aqv 6 #?M2FG ..q12  !S&))3./NQ -1F1Fq1IJRR  ! !! $o&;&;A&> :??T?TUV?W9X25 x3'',-xx_22156  !!46Fs6KR P '1'  s GG Gc tjtjdgtjdgtjtjgtjtjgtjdgtjtjgg}tj|}d}t |||}tj |tjtjdgdsJy)zCCheck that nans are ignored in general, except for all NaN columns.rrrZT) equal_nanN)rrr ones_liker array_equal)rrOpercentile_rankvaluess r 'test_weighted_percentile_all_nan_columnrs HH VVQK VVQK VVRVV  VVRVV  VVQK VVRVV    Ell5!GO !%/ BF >>&"((BFFA;"74 HH Hr"z2.0z2np.quantile only accepts weights since version 2.0)reasonr.)Br%rctjj|}|jdd}|j ddd}t |||}tj ||dz |dd }t||y ) z\Check that _weighted_percentile delivers equivalent results as np.quantile with weights.r%rIrrr%rIr&r inverted_cdfrOaxisr)N)rr*r+rhr,rquantiler)r.r/r0rrpercentile_weighted_percentilepercentile_numpy_quantiles r ,test_weighted_percentile_like_numpy_quantiler0s~ ))   2 3C HHR EKK19K5M%9 }j&"!#  zCQ~!57PQr"z5np.nanquantile only accepts weights since version 2.0cTtjj|}|jdd}tj||j|j dk<|j ddd}t|||}tj||dz |dd }t||y ) z_Check that _weighted_percentile delivers equivalent results as np.nanquantile with weights.r%rIrrrrr&rrrN) rr*r+rhrrMr,r nanquantiler)r.r/r0rrrpercentile_numpy_nanquantiles r /test_weighted_percentile_like_numpy_nanquantilerGs ))   2 3Chhr3'O>@ffOHCHHo334s:;KK19K5M%9 &"$&>>S  $ 57STr")/numpyrr{ numpy.testingrrrsklearn._configrsklearn.utils._array_apirrr r rsklearn.utils.estimator_checksr sklearn.utils.fixesr rsklearn.utils.statsrrr!r1r5r@rDrFrJrQrVrcmark parametrizeroint32r-rnrrrrrskipifrrr"r rso =* <?9S!I#  $&$ &(.)+T+V B!b) !72772;#5#5bhh#?D $&QSUV ( :  $ %xrxx0B'CQG 2662661aA. /:L1MqQ BHH' ( BHH'rxx 8  %6407<40n-1v6'27'2TI0u%% ?|4R5  R$u%% B|4U5  Ur"