ó
    Ñ]j÷(  ã                  ó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	            ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pandas/core/util/hashing.pyÚcombine_hash_arraysr-   0   só   € ð-Ü�V“ˆô �_Š_˜e˜W fÓ-€Fä�9Š9�WÓ€DÜ
�-Š-˜Ó
¤§¢¨8Ó!4Ñ
4€CØ€FÜ˜&Ö!‰ˆØ‘Mˆ	Ø‰ˆØ‰ˆØ”—	’	˜% )Ñ+¨iÑ7Ó8Ñ8ˆØŠñ "ð �A‰:˜Ó"Ð<Ð$<Ó<Ð"ØŒ2�9Š9�UÓÑ€CØ€Jøô! ó -Ü�xŠx˜¤"§)¡)Ñ,Ò,ð-ú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                  " X¬5      nS U 5       n
[        X«5      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.

The hash is computed element-wise using the underlying data values,
and optionally includes the index when hashing a Series or DataFrame.

Parameters
----------
obj : Index, Series, or DataFrame
    The pandas object to hash.
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.

See Also
--------
util.hash_array : Return a hash of the given array.
util.hash_tuples : Hash a MultiIndex or listlike-of-tuples efficiently.

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ô #Ø—I‘IØØ%Ø%Ø)ñ÷ ‘'ôò  ùó   ƒ.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ô #Ø—I‘IØØ%Ø%Ø)ñ÷ ‘'ôò  ùrA   r   c              3  ó$   #   • U  H  ov •  M     g 7frB   © )r<   Úxs     r,   r?   r@   ¸   s   é € Ð)¢˜A”a¢ù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   T   sÂ  û€ õZ àÑÜ$ˆä�#”}×%Ñ%Ù”k # x°Ó:À(ÐQVÑWÐWä	�Cœ×	"Ñ	"Ü�s—{‘{ H¨h¸
ÓC×JÑJØ˜5ð Kð 
ˆñ �Q˜c¨¸Ñ>ˆðd €Jôa 
�Cœ×	#Ñ	#Ü�s—{‘{ H¨h¸
ÓC×JÑJØ˜5ð Kð 
ˆö ÷	ñ  ó	ˆJô —_’_ a S¨*Ó5ˆFÜ# F¨AÓ.ˆAá�Q˜cŸi™i¨x¸eÑDˆð< €Jô9 
�Cœ×	&Ñ	&ö
à ŸY™Yœ[ó
ˆô ˜Ÿ™Ó$ˆ	Þ÷	$ñ  ó	$Ð ð ˜‰NˆIô  —o’o fÓCˆGÙ)¡Ó)ˆFÜ Ó2ˆá�Q˜cŸi™i¨x¸eÑDˆð €Jô Ð6´t¸C³y°kÐ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 a 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ð 	×Ñ¨¸HÐQVÐÕ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÷ô
 �dœM×*Ñ*Ø×#Ò# DÓ)‰àˆô ˜2Ÿ:™:Ô&óò
 'ˆEð	 	×ÑØ�H‰H�U‰OÜ¨¯	©	°%Ñ(8À%ÑHö	
ñ 'ð ð õáó€Fô 	˜F¤C¨£MÓ2€Aà€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      $ )ag  
Given a 1d array, return an array of deterministic integers.

Parameters
----------
vals : ndarray or ExtensionArray
    The input array to hash.
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.

See Also
--------
util.hash_pandas_object : Return a data hash of the Index/Series/DataFrame.
util.hash_tuples : Hash a MultiIndex / listlike-of-tuples efficiently.

Examples
--------
>>> pd.util.hash_array(np.array([1, 2, 3]))
array([ 6238072747940578789, 15839785061582574730,  2185194620014831856],
  dtype=uint64)
r   zmust pass an 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”   € ôJ �4˜×!Ñ!ÜÐ3Ó4Ð4ä�$Ô)×*Ñ*Ø×'Ñ'Ø¸Zð (ð 
ð 	
ô �dœBŸJ™J×'Ñ'äØDÜ�D‹z×"Ñ"Ð#Ð#DðFó
ð 	
ô
 ˜¨Ó>Ð>r[   c                ól  • 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 OWU(       aC  SS	KJnJnJn	  U	" U SS
9u  p«[)        U" USS9SS9nUR+                  X¬5      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  N‡f = f)z
See hash_array.__doc__.
é   Úu8Úi8Fr1   é   Úur   )r]   r   Ú	factorize)Úsortr^   rb   é   l   ¹eÉ9´Â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_   Útdtyperd   s                 r,   rt   rt   +  só  € ð �J‰J€Eô 
‡}‚}�UœBŸM™M×*Ñ*Ü! $§)¡)¨XÀÓLˆ	Ü! $§)¡)¨XÀÓLˆ	Ø˜2 	™>Ñ)Ð)ð ”ƒ}Ø�{‰{˜4Ó ŠÜ	�E—J‘J¤§¡´·±Ð ?×	@Ñ	@Ø�y‰y˜‹×%Ñ% d°Ð%Ð7‰Ü	�E—J‘J¤§	¡	×	*Ñ	*¨u¯~©~ÀÓ/BØ�y‰y˜1˜TŸZ™Z×0Ñ0Ð1Ð2Ó3×:Ñ:¸4Ó@‰ö
 ÷ñ ñ !*¨$°UÑ ;ÑˆEÜ%Ù  °%Ñ8À%ñˆFð ×)Ñ)¨%Ó8ˆCØ×*Ñ*Ø!Àð +ð ð ð	Ü$ T°XÓ>ˆDð 	�B‰JÑ€DØŒB�IŠIÐ(Ó)Ñ)€DØ�B‰JÑ€DØŒB�IŠIÐ(Ó)Ñ)€DØ�B‰JÑ€Dð €Køô ó 	ä$Ø—‘œCÓ ×'Ñ'¬Ó/°óŠDð	ús   ÆG4 Ç4<H3È2H3)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 ØØ,ØðkØ	#ðkàðkð ðkð ð	kð
 ðkð õkð` Ø%ð/Ø
5ð/àð/ð ð/ð õ	/ðh Ø%Øð	4?Ø
ð4?àð4?ð ð4?ð ð	4?ð
 õ4?ðr Ø%Øð	>Ø
ð>àð>ð ð>ð ð	>ð
 ö>r[   