
    .iV$                        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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mZ erdd
lmZ ddlm Z   G d de      Z! G d de      Z"ddZ#y)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)'construct_1d_object_array_from_listlike)is_bool_dtypeis_list_likepandas_dtype)ExtensionArrayExtensionDtype)getitem_returns_viewunpack_tuple_and_ellipses)Mapping)type_tc                  J    e Zd ZU ej                  ZdZ e       Zde	d<   ddZ
y)	JSONDtypejsonzMapping[str, Any]na_valuec                    t         S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )	JSONArrayselfs    _/var/www/app/trading-bot/venv/lib/python3.12/site-packages/pandas/tests/extension/json/array.pyconstruct_array_typezJSONDtype.construct_array_type<   s
         N)returnztype_t[JSONArray])__name__
__module____qualname__r   r   typenamer   r   __annotations__r    r   r   r   r   7   s"    ;;DD"**H,r   r   c                       e Zd Z e       ZdZdddZedddd       Zed        Z	d Z
d	 Zdd
ZddZd Zd ZddZedd       Zd ZddZd Zd dZd Zed        Zd Zd Zddd fd
Z xZS )!r   i  NFc                    |D ]M  }t        || j                  j                        r$t        dt	        | j                  j                        z          || _        | j
                  x| _        | _        y )NzAll values must be of type )
isinstancedtyper!   	TypeErrorstrdata_items_data)r   valuesr(   copyvals        r   __init__zJSONArray.__init__K   s`     	VCc4::??3 =DJJOO@T TUU	V 	 $(99,djr   r(   r/   c                    | |      S Nr$   )clsscalarsr(   r/   s       r   _from_sequencezJSONArray._from_sequenceX   s    7|r   c                V     | |D cg c]  }|dk7  s	t        |       c}      S c c}w )Nr$   )r   )r5   r.   originalxs       r   _from_factorizedzJSONArray._from_factorized\   s%    ;A17HQK;<<;s   
&&c                    	 t        |       j                  || j                        S # t        t        f$ r7 ddlm} t        j                  |t              }|j                  |d      cY S w xY w)Nr(   r   )libT)convert_non_numeric)r!   r7   r(   
ValueErrorr)   pandas._libsr>   npasarrayobjectmaybe_convert_objects)r   r.   r>   s      r   _cast_pointwise_resultz JSONArray._cast_pointwise_result`   se    	O:,,V4::,FFI& 	O(ZZf5F,,V,NN	Os   %( AA.-A.c                d   t        |t              rt        |      }t        |t        j                        r| j
                  |   S t        |t              r<|t        d       k(  r. t        |       | j
                        }| j                  |_        |S t        |t              r= t        |       | j
                  |         }t        | |      r| j                  |_        |S t        |      st        d      t        j                  j                  j                  | |      }t!        |j"                        rHt        |       j%                  t'        | |d      D cg c]
  \  }}|s	| c}}| j"                        S  t        |       |D cg c]  }| j
                  |    c}      S c c}}w c c}w )Nzuonly integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesTstrictr=   )r'   tupler   numbersIntegralr+   slicer!   	_readonlyr   r
   
IndexErrorpdapiindexerscheck_array_indexerr	   r(   r7   zip)r   itemresultr:   mis         r   __getitem__zJSONArray.__getitem__j   s`   dE",T2DdG,,-99T?"e$t)<T$Z		*F#~~FMe$T$Z		$0F#D$/#'>> Md# L 
 66??66tTBDTZZ(Dz00#&tT$#?E41a1QETZZ 1   4:T:tyy|:;; F ;s   
F'
#F'

F-c                   | j                   rt        d      t        |t        j                        r|| j
                  |<   y t        |t        |       t        j                  f      st        j                  |g      }t        |t        j                        rf|j                  dk(  rWt        t        ||d            D ]<  \  }\  }}|st        || j                  j                        sJ || j
                  |<   > y t        ||d      D ]6  \  }}t        || j                  j                        sJ || j
                  |<   8 y )NzCannot modify read-only arrayboolFrH   )rN   r@   r'   rK   rL   r+   r!   r   Sequence	itertoolscyclerB   ndarrayr(   	enumeraterT   )r   keyvaluerX   kvs         r   __setitem__zJSONArray.__setitem__   s   >><==c7++,"DIIcNed4j#,,%?@!0#rzz*syyF/B!*3sE%+H!I )IAv1)!TZZ__==='(		!)
  U59 %DAq%a999#$DIIaL%r   c                ,    t        | j                        S r4   )lenr+   r   s    r   __len__zJSONArray.__len__   s    499~r   c                    t         S r4   NotImplementedr   others     r   __eq__zJSONArray.__eq__       r   c                    t         S r4   rj   rl   s     r   __ne__zJSONArray.__ne__   ro   r   c                    |du rt        d      |t        }|t        k(  rt        t        |             S |!t	        j
                  | j                  |      S t	        j
                  | j                  ||      S )NFz:Unable to avoid copy while creating an array as requested.r=   r2   )r@   rD   r   listrB   rC   r+   )r   r(   r/   s      r   	__array__zJSONArray.__array__   sl    5=L  =EF?:4:FF<::diiu55zz$))5t<<r   c                @    t        j                  | j                        S r4   )sys	getsizeofr+   r   s    r   nbyteszJSONArray.nbytes   s    }}TYY''r   c                    t        j                  | j                  D cg c]  }|| j                  j                  k(   c}t
              S c c}w )Nr=   )rB   arrayr+   r(   r   r[   )r   r:   s     r   isnazJSONArray.isna   s4    xx499Eadjj111ETRREs    Ac                   t        j                  |      }d}|rV|| j                  j                  }|dk  j	                         rt
        	 |D cg c]  }|dk7  r| j                  |   n| }}n	 |D cg c]  }| j                  |    }}t        |       j                  || j                        S c c}w # t        $ r}t        |      |d }~ww xY wc c}w # t        $ r}t        |      |d }~ww xY w)NzIIndex is out of bounds or cannot do a non-empty take from an empty array.r=   )
rB   rC   r(   r   anyr@   r+   rO   r!   r7   )r   indexer
allow_fill
fill_valuemsglocoutputerrs           r   takezJSONArray.take   s     **W%W 	 !!ZZ00
"!!#  /KRDGcRiDIIcNZ? /4;<S$))C.<< Dz((tzz(BB  / o3./ = / o3./sT   B8 B3-B8 1C 5CC 3B8 8	CCCC 	C4#C//C4c                >     t        |       | j                  d d        S r4   )r!   r+   r   s    r   r/   zJSONArray.copy   s    tDz$))A,''r   Tc                   ddl m} t        |      }t        |t	        | j
                              r#|| j
                  k(  r|r| j                         S | S t        ||      r$|j                         }|j                  | |d      S |s.t        j                  | D cg c]  }t        |       c}|      S t        j                  | D cg c]  }t        |       c}||      S c c}w c c}w )Nr   )StringDtypeFr2   r=   )pandas.core.arrays.string_r   r   r'   r!   r(   r/   r   r7   rB   rC   dictrz   )r   r(   r/   r   arr_clsr:   s         r   astypezJSONArray.astype   s     	;U#eT$**-.5DJJ3Fyy{"K{+002G))$e%)HH::51tAw5UCC88d3T!W35tLL 63s   C#C(c           	          t        |       | j                  D ch c]  }t        |j                                c}D cg c]  }t	        |       c}      S c c}w c c}w r4   )r!   r+   rJ   itemsr   )r   dr:   s      r   uniquezJSONArray.unique   sD     tDztyy,Q!U1779-=,QRq47RSS,QRs
    AAc                p    t        t        j                  j                  d |D                    } | |      S )Nc              3  4   K   | ]  }|j                     y wr4   )r+   ).0r:   s     r   	<genexpr>z.JSONArray._concat_same_type.<locals>.<genexpr>   s     1LQ!&&1Ls   )rs   r]   chainfrom_iterable)r5   	to_concatr+   s      r   _concat_same_typezJSONArray._concat_same_type   s+    IOO111L)1LLM4yr   c                f    | j                         }t        |      dk(  r|j                         }|dfS )Nr   r$   )_values_for_argsortrg   ravel)r   frozens     r   _values_for_factorizezJSONArray._values_for_factorize   s1    ))+v;!\\^Frzr   c                n    | D cg c]  }t        |j                                }}t        |      S c c}w r4   )rJ   r   r   )r   r:   r   s      r   r   zJSONArray._values_for_argsort  s0    ,01q%	"116v>> 2s    2)limitr/   c               (    t         |   |||      S )N)methodr   r/   )super_pad_or_backfill)r   r   r   r/   	__class__s       r   r   zJSONArray._pad_or_backfill
  s    w'vU'NNr   )NF)r   None)r   int)NN)FN)T)r   r   r    r   r(   __array_priority__r1   classmethodr7   r;   rF   rY   re   rh   rn   rq   rt   propertyrx   r{   r   r/   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   G   s    KE- .2   = =O<B%,= ( (SC:(M(T
  ?
 154 O Or   r   c                V   t         j                  j                  d      }t        |       D cg c]l  }t	        t        |j                  dd            D cg c]<  }|j                  t        t        j                              |j                  dd      f> c}      n c}S c c}w c c}w )N   r   
   d   )
rB   randomdefault_rngranger   integerschoicers   stringascii_letters)nrng_s      r   	make_datar     s    
))


"C q  	 s||Ar23 D!5!567a9MN	
 s   'B&AB!	B&!B&)r   r   )$__doc__
__future__r   collectionsr   r   r]   rK   r   rv   typingr   r   numpyrB   pandas.core.dtypes.castr   pandas.core.dtypes.commonr	   r
   r   pandasrP   pandas.api.extensionsr   r   pandas.core.indexersr   r   collections.abcr   pandas._typingr   r   r   r   r$   r   r   <module>r      su    #    

  K  
 '%  EO EOPr   