a
    é´«jƒ#  ã                   @  sø   d Z ddlmZ ddlmZmZ ddlZddlZddlZddl	Z	ddl
mZmZ ddlZddlZddlmZ ddlmZ ddlmZmZmZ ddlZdd	lmZmZ dd
lmZ erÌddlm Z  ddl!m"Z" G dd„ deƒZ#G dd„ deƒZ$dd„ Z%dS )a¦  
Test extension array for storing nested data in a pandas container.

The JSONArray stores lists of dictionaries. The storage mechanism is a list,
not an ndarray.

Note
----
We currently store lists of UserDicts. Pandas has a few places
internally that specifically check for dicts, and does non-scalar things
in that case. We *want* the dictionaries to be treated as scalars, so we
hack around pandas by using UserDicts.
é    )Úannotations)ÚUserDictÚabcN)ÚTYPE_CHECKINGÚAny)Úfind_stack_level©Ú'construct_1d_object_array_from_listlike)Úis_bool_dtypeÚis_list_likeÚpandas_dtype)ÚExtensionArrayÚExtensionDtype)Úunpack_tuple_and_ellipses)ÚMapping)Útype_tc                   @  s8   e Zd ZU ejZdZeƒ Zde	d< e
ddœdd„ƒZdS )	Ú	JSONDtypeÚjsonzMapping[str, Any]Úna_valueztype_t[JSONArray]©Úreturnc                 C  s   t S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )Ú	JSONArray)Úcls© r   ú`/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/pandas/tests/extension/json/array.pyÚconstruct_array_type;   s    	zJSONDtype.construct_array_typeN)Ú__name__Ú
__module__Ú__qualname__r   r   ÚtypeÚnamer   r   Ú__annotations__Úclassmethodr   r   r   r   r   r   6   s
   
r   c                      sö   e Zd Zeƒ ZdZd0ddœdd„Zedddœd	d
„ƒZedd„ ƒZ	dd„ Z
ddœdd„Zddœdd„Zdd„ Zdd„ Zd1dd„Zeddœdd„ƒZdd„ Zd2dd„Zd d!„ Zd3d#d$„Zd%d&„ Zed'd(„ ƒZd)d*„ Zd+d,„ Zdd"d-œ‡ fd.d/„
Z‡  ZS )4r   iè  NFÚNoner   c                 C  sD   |D ]&}t || jjƒstdt| jjƒ ƒ‚q|| _| j | _| _d S )NzAll values must be of type )Ú
isinstanceÚdtyper   Ú	TypeErrorÚstrÚdataZ_itemsÚ_data)ÚselfÚvaluesr%   ÚcopyÚvalr   r   r   Ú__init__K   s
    zJSONArray.__init__©r%   r,   c                C  s   | |ƒS ©Nr   )r   Zscalarsr%   r,   r   r   r   Ú_from_sequenceX   s    zJSONArray._from_sequencec                 C  s   | dd„ |D ƒƒS )Nc                 S  s   g | ]}|d krt |ƒ‘qS )r   )r   ©Ú.0Úxr   r   r   Ú
<listcomp>^   ó    z.JSONArray._from_factorized.<locals>.<listcomp>r   )r   r+   Úoriginalr   r   r   Ú_from_factorized\   s    zJSONArray._from_factorizedc                   sÖ   t |tƒrt|ƒ}t |tjƒr(ˆ j| S t |tƒrL|td ƒkrLtˆ ƒˆ jƒS t |tƒrhtˆ ƒˆ j| ƒS t|ƒszt	dƒ‚nXt
jj ˆ |¡}t|jƒr¸tˆ ƒjdd„ tˆ |ƒD ƒˆ jd�S tˆ ƒ‡ fdd„|D ƒƒS d S )Nzuonly integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesc                 S  s   g | ]\}}|r|‘qS r   r   )r3   r4   Úmr   r   r   r5   w   r6   z)JSONArray.__getitem__.<locals>.<listcomp>©r%   c                   s   g | ]}ˆ j | ‘qS r   ©r(   )r3   Úi©r*   r   r   r5   z   r6   )r$   Útupler   ÚnumbersÚIntegralr(   Úslicer   r   Ú
IndexErrorÚpdÚapiZindexersZcheck_array_indexerr
   r%   r1   Úzip)r*   Úitemr   r=   r   Ú__getitem__`   s$    


ÿ
ÿzJSONArray.__getitem__c                 C  sÀ   t |tjƒr|| j|< n¤t |t| ƒtjfƒs8t |g¡}t |t	j
ƒrŒ|jdkrŒtt||ƒƒD ],\}\}}|r\t || jjƒs~J ‚|| j|< q\n0t||ƒD ]$\}}t || jjƒs°J ‚|| j|< q–d S )NÚbool)r$   r?   r@   r(   r   r   ÚSequenceÚ	itertoolsÚcycleÚnpZndarrayr%   Ú	enumeraterE   )r*   ÚkeyÚvaluer<   ÚkÚvr   r   r   Ú__setitem__|   s    zJSONArray.__setitem__Úintc                 C  s
   t | jƒS r0   )Úlenr(   r=   r   r   r   Ú__len__�   s    zJSONArray.__len__c                 C  s   t S r0   ©ÚNotImplemented©r*   Úotherr   r   r   Ú__eq__’   s    zJSONArray.__eq__c                 C  s   t S r0   rV   rX   r   r   r   Ú__ne__•   s    zJSONArray.__ne__c                 C  sd   |du rt jdttƒ d� |d u r&t}|tkr:tt| ƒƒS |d u rRtj| j	|d�S tj| j	||d�S )NFaS  Starting with NumPy 2.0, the behavior of the 'copy' keyword has changed and passing 'copy=False' raises an error when returning a zero-copy NumPy array is not possible. pandas will follow this behavior starting with pandas 3.0.
This conversion to NumPy requires a copy, but 'copy=False' was passed. Consider using 'np.asarray(..)' instead.)Ú
stacklevelr:   r/   )
ÚwarningsÚwarnÚFutureWarningr   Úobjectr	   ÚlistrL   Úasarrayr(   )r*   r%   r,   r   r   r   Ú	__array__˜   s    øzJSONArray.__array__c                 C  s   t  | j¡S r0   )ÚsysÚ	getsizeofr(   r=   r   r   r   Únbytes¯   s    zJSONArray.nbytesc                   s   t j‡ fdd„ˆ jD ƒtd�S )Nc                   s   g | ]}|ˆ j jk‘qS r   )r%   r   r2   r=   r   r   r5   ´   r6   z"JSONArray.isna.<locals>.<listcomp>r:   )rL   Úarrayr(   rH   r=   r   r=   r   Úisna³   s    zJSONArray.isnac              
     sÖ   t  |¡}d}|r|ˆ d u r"ˆjj‰ |dk  ¡ r2t‚z‡ ‡fdd„|D ƒ}W qÂ tyx } zt|ƒ|‚W Y d }~qÂd }~0 0 nFz‡fdd„|D ƒ}W n. tyÀ } zt|ƒ|‚W Y d }~n
d }~0 0 tˆƒj|ˆjd�S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.éÿÿÿÿc                   s"   g | ]}|d krˆj | nˆ ‘qS )ri   r;   ©r3   Úloc©Ú
fill_valuer*   r   r   r5   Ç   s   z"JSONArray.take.<locals>.<listcomp>c                   s   g | ]}ˆ j | ‘qS r   r;   rj   r=   r   r   r5   Î   r6   r:   )	rL   rb   r%   r   ÚanyÚ
ValueErrorrB   r   r1   )r*   ZindexerZ
allow_fillrm   ÚmsgÚoutputÚerrr   rl   r   Útake¶   s&    
ÿÿ
" zJSONArray.takec                 C  s   t | ƒ| jd d … ƒS r0   ©r   r(   r=   r   r   r   r,   Ô   s    zJSONArray.copyTc                 C  sš   ddl m} t|ƒ}t|t| jƒƒr>|| jkr>|r:|  ¡ S | S t||ƒr`| ¡ }|j| |dd�S |s|t	j
dd„ | D ƒ|d�S t	jdd„ | D ƒ||d�S d S )	Nr   )ÚStringDtypeFr/   c                 S  s   g | ]}t |ƒ‘qS r   ©Údictr2   r   r   r   r5   ç   r6   z$JSONArray.astype.<locals>.<listcomp>r:   c                 S  s   g | ]}t |ƒ‘qS r   rv   r2   r   r   r   r5   é   r6   )Zpandas.core.arrays.string_ru   r   r$   r   r%   r,   r   r1   rL   rb   rg   )r*   r%   r,   ru   Zarr_clsr   r   r   Úastype×   s    
zJSONArray.astypec                 C  s"   t | ƒdd„ dd„ | jD ƒD ƒƒS )Nc                 S  s   g | ]}t |ƒ‘qS r   rv   r2   r   r   r   r5   î   r6   z$JSONArray.unique.<locals>.<listcomp>c                 S  s   h | ]}t | ¡ ƒ’qS r   ©r>   Úitems)r3   Údr   r   r   Ú	<setcomp>î   r6   z#JSONArray.unique.<locals>.<setcomp>rt   r=   r   r   r   Úuniqueë   s    zJSONArray.uniquec                 C  s"   t tj dd„ |D ƒ¡ƒ}| |ƒS )Nc                 s  s   | ]}|j V  qd S r0   r;   r2   r   r   r   Ú	<genexpr>ò   r6   z.JSONArray._concat_same_type.<locals>.<genexpr>)ra   rJ   ÚchainÚfrom_iterable)r   Z	to_concatr(   r   r   r   Ú_concat_same_typeð   s    zJSONArray._concat_same_typec                 C  s$   |   ¡ }t|ƒdkr| ¡ }|dfS )Nr   r   )Ú_values_for_argsortrT   Zravel©r*   Úfrozenr   r   r   Ú_values_for_factorizeõ   s    zJSONArray._values_for_factorizec                 C  s   dd„ | D ƒ}t |ƒS )Nc                 S  s   g | ]}t | ¡ ƒ‘qS r   ry   r2   r   r   r   r5   þ   r6   z1JSONArray._values_for_argsort.<locals>.<listcomp>r   rƒ   r   r   r   r‚   ü   s    zJSONArray._values_for_argsort)Úlimitr,   c                  s   t ƒ j|||d�S )N)Úmethodr†   r,   )ÚsuperÚ_pad_or_backfill)r*   r‡   r†   r,   ©Ú	__class__r   r   r‰     s    zJSONArray._pad_or_backfill)NF)NN)FN)T)r   r   r   r   r%   Z__array_priority__r.   r"   r1   r8   rG   rR   rU   rZ   r[   rc   Úpropertyrf   rh   rs   r,   rx   r}   r�   r…   r‚   r‰   Ú__classcell__r   r   rŠ   r   r   G   s2   




r   c                     s"   t j d¡‰ ‡ fdd„tdƒD ƒS )Né   c              	     s.   g | ]&}t ‡ fd d„tˆ  dd¡ƒD ƒƒ‘qS )c                   s(   g | ] }ˆ   ttjƒ¡ˆ  d d¡f‘qS )r   éd   )Úchoicera   ÚstringÚascii_lettersÚintegers©r3   Ú_©Úrngr   r   r5     s   ÿz(make_data.<locals>.<listcomp>.<listcomp>r   é
   )r   Úranger“   r”   r–   r   r   r5   	  s   ú
þÿzmake_data.<locals>.<listcomp>r�   )rL   ÚrandomZdefault_rngr™   r   r   r–   r   Ú	make_data  s    
ùr›   )&Ú__doc__Ú
__future__r   Úcollectionsr   r   rJ   r?   r‘   rd   Útypingr   r   r]   ÚnumpyrL   Zpandas.util._exceptionsr   Zpandas.core.dtypes.castr	   Zpandas.core.dtypes.commonr
   r   r   ZpandasrC   Zpandas.api.extensionsr   r   Zpandas.core.indexersr   Úcollections.abcr   Zpandas._typingr   r   r   r›   r   r   r   r   Ú<module>   s,    @