
    Mh%                    l   S r SSKJr  SSKrSSKJr  SSKrSSKJ	r	  SSK
Jr  SSKJr  SSKJrJrJrJrJr  \(       a  SS	KJrJrJr  SS
KJrJr  SSKJrJrJrJr  Sr       SS jr!SS\ S4           SS jjr"S\ 4       SS jjr#S\ S4         SS jjr$S\ S4         SS jjr%g)z"
data hash pandas / numpy objects
    )annotationsN)TYPE_CHECKING)hash_object_array)is_list_like)CategoricalDtype)ABCDataFrameABCExtensionArrayABCIndexABCMultiIndex	ABCSeries)HashableIterableIterator)	ArrayLikenpt)	DataFrameIndex
MultiIndexSeries0123456789123456c                    [        U 5      n[
        R                  " U/U 5      n [        R                  " S5      n[        R                  " U5      [        R                  " S5      -   nSn[        U 5       H2  u  pgX-
  nXG-  nXC-  nU[        R                  " SU-   U-   5      -  nUnM4     US-   U:X  d   S5       eU[        R                  " S5      -  nU$ ! [         a&    [        R                  " / [        R                  S9s $ f = f)	z
Parameters
----------
arrays : Iterator[np.ndarray]
num_items : int

Returns
-------
np.ndarray[uint64]

Should be the same as CPython's tupleobject.c
)dtypeiCB ixV4 r   iXB    zFed in wrong num_itemsi| )	nextStopIterationnparrayuint64	itertoolschain
zeros_like	enumerate)	arrays	num_itemsfirstmultoutlast_iia	inverse_is	            J/var/www/html/env/lib/python3.13/site-packages/pandas/core/util/hashing.pycombine_hash_arraysr-   /   s    -V __eWf-F99WD
--
8!4
4CF&!M			%)+i788 " A:"<$<<"299UCJ!  -xx")),,-s   C -DDTutf8c                  ^ ^^^ SSK Jn  Tc  [        m[        T [        5      (       a  U" [        T TT5      SSS9$ [        T [        5      (       a1  [        T R                  TTT5      R                  SSS9nU" UT SSS9nU$ [        T [        5      (       au  [        T R                  TTT5      R                  SSS9nU(       a3  UUUU 4S jS	 5       n[        R                  " U/U5      n	[        U	S
5      nU" UT R                  SSS9nU$ [        T [        5      (       a  UUU4S jT R!                  5        5       n
[#        T R$                  5      nU(       a3  UUUU 4S jS	 5       nUS-  n[        R                  " X5      nS U 5       n
[        X5      nU" UT R                  SSS9nU$ ['        S[)        T 5       35      e)a  
Return a data hash of the Index/Series/DataFrame.

Parameters
----------
obj : Index, Series, or DataFrame
index : bool, default True
    Include the index in the hash (if Series/DataFrame).
encoding : str, default 'utf8'
    Encoding for data & key when strings.
hash_key : str, default _default_hash_key
    Hash_key for string key to encode.
categorize : bool, default True
    Whether to first categorize object arrays before hashing. This is more
    efficient when the array contains duplicate values.

Returns
-------
Series of uint64, same length as the object

Examples
--------
>>> pd.util.hash_pandas_object(pd.Series([1, 2, 3]))
0    14639053686158035780
1     3869563279212530728
2      393322362522515241
dtype: uint64
r   )r   r   F)r   copyr0   )indexr   r0   c           	   3  f   >#    U  H&  n[        TR                  S TTTS9R                  v   M(     g7fF)r2   encodinghash_key
categorizeNhash_pandas_objectr2   _values.0_r7   r5   r6   objs     r,   	<genexpr>%hash_pandas_object.<locals>.<genexpr>   s@      	  A #II%%) '     .1N   c              3  X   >#    U  H  u  p[        UR                  TTT5      v   M!     g 7frB   )
hash_arrayr:   )r<   r=   seriesr7   r5   r6   s      r,   r?   r@      s,      
(	 v~~x:FF(s   '*c           	   3  f   >#    U  H&  n[        TR                  S TTTS9R                  v   M(     g7fr4   r8   r;   s     r,   r?   r@      s@      	$  A #II%%) '  rA   r   c              3  $   #    U  H  ov   M     g 7frB    )r<   xs     r,   r?   r@      s     )Aas   zUnexpected type for hashing )pandasr   _default_hash_key
isinstancer   hash_tuplesr
   rE   r:   astyper   r   r    r-   r2   r   itemslencolumns	TypeErrortype)r>   r2   r5   r6   r7   r   hser
index_iterr#   hashesr$   index_hash_generator_hashess   ` ```         r,   r9   r9   S   s   F $#}%%k#x:(QVWW	C	"	"s{{Hh
CJJ5 K 
 Qc>d Ja 
C	#	#s{{Hh
CJJ5 K 
 	  	J __aS*5F#FA.AQciixeD< J9 
C	&	&
 YY[
 $		$  	$  NI  oofCG))F2QciixeD J 6tCykBCC    c                  ^^ [        U 5      (       d  [        S5      eSSKJnJn  [        U [        5      (       d  UR                  " U 5      nOU n[        UR                  5       Vs/ s H7  nUR                  UR                  U   [        UR                  U   SS95      PM9     nnUU4S jU 5       n[        U[        U5      5      n	U	$ s  snf )z
Hash an MultiIndex / listlike-of-tuples efficiently.

Parameters
----------
vals : MultiIndex or listlike-of-tuples
encoding : str, default 'utf8'
hash_key : str, default _default_hash_key

Returns
-------
ndarray[np.uint64] of hashed values
z'must be convertible to a list-of-tuplesr   )Categoricalr   F
categoriesorderedc              3  F   >#    U  H  nUR                  TTS S9v   M     g7f)Fr5   r6   r7   N)_hash_pandas_object)r<   catr5   r6   s     r,   r?   hash_tuples.<locals>.<genexpr>   s+      C 	HQVWs   !)r   rS   rK   r]   r   rM   r   from_tuplesrangenlevels_simple_newcodesr   levelsr-   rQ   )
valsr5   r6   r]   r   milevelcat_valsrX   rU   s
    ``       r,   rN   rN      s    $ ABB
 dM**##D) 2::&
 'E	 	HHUO		%(8%H	
 '  F 	FCM2AHs   '>Cc                   [        U S5      (       d  [        S5      e[        U [        5      (       a  U R	                  XUS9$ [        U [
        R                  5      (       d"  [        S[        U 5      R                   S35      e[        XX#5      $ )a  
Given a 1d array, return an array of deterministic integers.

Parameters
----------
vals : ndarray or ExtensionArray
encoding : str, default 'utf8'
    Encoding for data & key when strings.
hash_key : str, default _default_hash_key
    Hash_key for string key to encode.
categorize : bool, default True
    Whether to first categorize object arrays before hashing. This is more
    efficient when the array contains duplicate values.

Returns
-------
ndarray[np.uint64, ndim=1]
    Hashed values, same length as the vals.

Examples
--------
>>> pd.util.hash_array(np.array([1, 2, 3]))
array([ 6238072747940578789, 15839785061582574730,  2185194620014831856],
  dtype=uint64)
r   zmust pass a ndarray-likerb   z6hash_array requires np.ndarray or ExtensionArray, not z!. Use hash_pandas_object instead.)
hasattrrS   rM   r	   rc   r   ndarrayrT   __name___hash_ndarray)rl   r5   r6   r7   s       r,   rE   rE      s    > 4!!233$)**''Z ( 
 	
 dBJJ''DDz""##DF
 	

 >>r[   c                n   U R                   n[        R                  " U[        R                  5      (       a6  [	        U R
                  XU5      n[	        U R                  XU5      nUSU-  -   $ U[        :X  a  U R                  S5      n GO"[        UR                  [        R                  [        R                  45      (       a   U R                  S5      R                  SSS9n O[        UR                  [        R                  5      (       aH  UR                  S::  a8  U R                  SU R                   R                   35      R                  S5      n OXU(       aD  SS	KJnJnJn	  U	" U SS
9u  p[)        U" U5      SS9nUR+                  X5      nUR-                  XSS9$  [/        XU5      n X S-	  -  n U [        R6                  " S5      -  n X S-	  -  n U [        R6                  " S5      -  n X S-	  -  n U $ ! [0         a5    [/        U R                  [2        5      R                  [4        5      X!5      n  Nf = f)z
See hash_array.__doc__.
   u8i8Fr1      ur   )r]   r   	factorize)sortr^   rb      l   e9z    l   b&&&	    )r   r   
issubdtype
complex128rt   realimagboolrO   
issubclassrT   
datetime64timedelta64viewnumberitemsizerK   r]   r   r{   r   ri   rc   r   rS   strobjectr   )rl   r5   r6   r7   r   	hash_real	hash_imagr]   r   r{   rj   r_   rd   s                r,   rt   rt     s    JJE 
}}UBMM**!$))XL	!$))XL	2	>)) }{{4 	EJJ ?	@	@yy%%d%7	EJJ			*	*u~~/Byy1TZZ00123::4@
   !*$U ;E$j0A5QE))%7C**! +  	$TX>D 	BJDBII())DBJDBII())DBJDK  	$C ''/D	s    G5 5<H43H4)r#   zIterator[np.ndarray]r$   intreturnnpt.NDArray[np.uint64])r>   zIndex | DataFrame | Seriesr2   r   r5   r   r6   z
str | Noner7   r   r   r   )rl   z+MultiIndex | Iterable[tuple[Hashable, ...]]r5   r   r6   r   r   r   )
rl   r   r5   r   r6   r   r7   r   r   r   )
rl   z
np.ndarrayr5   r   r6   r   r7   r   r   r   )&__doc__
__future__r   r   typingr   numpyr   pandas._libs.hashingr   pandas.core.dtypes.commonr   pandas.core.dtypes.dtypesr   pandas.core.dtypes.genericr   r	   r
   r   r   collections.abcr   r   r   pandas._typingr   r   rK   r   r   r   r   rL   r-   r9   rN   rE   rt   rI   r[   r,   <module>r      sq   #     2 2 6   
  ' ! !-0!!L ,a	#aa a 	a
 a aL %/
5// / 	/h %	.?
.?.? .? 	.?
 .?f %	9
99 9 	9
 9r[   