3
Ud                 @   s   d 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Zddl	m
Z
mZmZ ddlZddlmZ ddlZddlmZ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.
    )UserDictabcN)AnyMappingType)pandas_dtype)ExtensionArrayExtensionDtypec               @   s@   e Zd ZU ejZdZe Zee	e
f eed dddZdS )	JSONDtypejson	JSONArray)returnc             C   s   t S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )r   )cls r   U/var/www/html/virt/lib64/python3.6/site-packages/pandas/tests/extension/json/array.pyconstruct_array_type#   s    	zJSONDtype.construct_array_typeN)__name__
__module____qualname__r   r   typenamer   na_valuestrr   classmethodr   r   r   r   r   r   r
      s
   
r
   c               @   s   e Zd Ze ZdZd*ddZed+ddZedd	 Z	d
d Z
dd ZedddZdd Zdd Zd,ddZeedddZdd Zd-ddZdd Zd.d d!Zd"d# Zed$d% Zd&d' Zd(d) ZdS )/r   i  NFc             C   sH   x.|D ]&}t || jjstdt| jj qW || _| j | _| _d S )NzAll values must be of type )
isinstancedtyper   	TypeErrorr   dataZ_items_data)selfvaluesr   copyvalr   r   r   __init__3   s
    
zJSONArray.__init__c             C   s   | |S )Nr   )r   Zscalarsr   r!   r   r   r   _from_sequence@   s    zJSONArray._from_sequencec             C   s   | dd |D S )Nc             S   s   g | ]}|f krt |qS r   )r   ).0xr   r   r   
<listcomp>F   s    z.JSONArray._from_factorized.<locals>.<listcomp>r   )r   r    originalr   r   r   _from_factorizedD   s    zJSONArray._from_factorizedc                s   t |tjr j| S t |tr:|td kr:t  jS t |trVt  j| S tjjj	 |}tjj
j|jr jdd t |D S t  fdd|D S d S )Nc             S   s   g | ]\}}|r|qS r   r   )r%   r&   mr   r   r   r'   T   s    z)JSONArray.__getitem__.<locals>.<listcomp>c                s   g | ]} j | qS r   )r   )r%   i)r   r   r   r'   V   s    )r   numbersIntegralr   slicer   pdapiZindexersZcheck_array_indexertypesZis_bool_dtyper   r$   zip)r   itemr   )r   r   __getitem__H   s    

zJSONArray.__getitem__c             C   s   t |tjr|| j|< nt |t| tjfs8tj|g}t |t	j
r|jdkrxttt||D ],\}\}}|r^t || jjst|| j|< q^W n4x2t||D ]$\}}t || jjst|| j|< qW d S )Nbool)r   r,   r-   r   r   r   Sequence	itertoolscyclenpZndarrayr   	enumerater2   AssertionError)r   keyvaluer+   kvr   r   r   __setitem__X   s    zJSONArray.__setitem__)r   c             C   s
   t | jS )N)lenr   )r   r   r   r   __len__k   s    zJSONArray.__len__c             C   s   t S )N)NotImplemented)r   otherr   r   r   __eq__n   s    zJSONArray.__eq__c             C   s   t S )N)rC   )r   rD   r   r   r   __ne__q   s    zJSONArray.__ne__c             C   s   |d krt }tj| j|dS )N)r   )objectr9   asarrayr   )r   r   r   r   r   	__array__t   s    zJSONArray.__array__c             C   s   t j| jS )N)sys	getsizeofr   )r   r   r   r   nbytesy   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   )r%   r&   )r   r   r   r'   ~   s    z"JSONArray.isna.<locals>.<listcomp>)r   )r9   arrayr   r5   )r   r   )r   r   isna}   s    zJSONArray.isnac                s   t j|}d}|rz d kr"jj |dk j r2ty fdd|D }W q tk
rv } zt||W Y d d }~X qX nDyfdd|D }W n, tk
r } zt||W Y d d }~X nX j|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 )rO   )r   )r%   loc)
fill_valuer   r   r   r'      s    z"JSONArray.take.<locals>.<listcomp>c                s   g | ]} j | qS r   )r   )r%   rQ   )r   r   r   r'      s    rP   )r9   rH   r   r   any
ValueError
IndexErrorr$   )r   ZindexerZ
allow_fillrR   msgoutputerrr   )rR   r   r   take   s     
zJSONArray.takec             C   s   t | | jd d  S )N)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:| j S | S t||rd| jt}|j	 j
|ddS tjdd | D ||dS )Nr   )StringDtypeF)r!   c             S   s   g | ]}t |qS r   )dict)r%   r&   r   r   r   r'      s    z$JSONArray.astype.<locals>.<listcomp>)r   r!   )Zpandas.core.arrays.string_rZ   r   r   r   r   r!   astyper   r   r$   r9   rM   )r   r   r!   rZ   r=   r   r   r   r\      s    

zJSONArray.astypec             C   s"   t | dd dd | jD D S )Nc             S   s   g | ]}t |qS r   )r[   )r%   r&   r   r   r   r'      s    z$JSONArray.unique.<locals>.<listcomp>c             S   s   h | ]}t |j qS r   )tupleitems)r%   dr   r   r   	<setcomp>   s    z#JSONArray.unique.<locals>.<setcomp>)r   r   )r   r   r   r   unique   s    zJSONArray.uniquec             C   s"   t tjjdd |D }| |S )Nc             s   s   | ]}|j V  qd S )N)r   )r%   r&   r   r   r   	<genexpr>   s    z.JSONArray._concat_same_type.<locals>.<genexpr>)listr7   chainfrom_iterable)r   Z	to_concatr   r   r   r   _concat_same_type   s    zJSONArray._concat_same_typec             C   s$   | j  }t|dkr|j }|f fS )Nr   )_values_for_argsortrA   Zravel)r   frozenr   r   r   _values_for_factorize   s    zJSONArray._values_for_factorizec             C   s*   f gdd | D  }t j|tddd  S )Nc             S   s   g | ]}t |j qS r   )r]   r^   )r%   r&   r   r   r   r'      s    z1JSONArray._values_for_argsort.<locals>.<listcomp>)r   rO   )r9   rM   rG   )r   rh   r   r   r   rg      s    zJSONArray._values_for_argsort)NF)NF)N)FN)T)r   r   r   r
   r   Z__array_priority__r#   r   r$   r)   r4   r@   intrB   rE   rF   rI   propertyrL   rN   rY   r!   r\   ra   rf   ri   rg   r   r   r   r   r   /   s,   



r   c               C   s   dd t dD S )Nc             S   s*   g | ]"}t d d ttjddD qS )c             S   s$   g | ]}t jtjt jd dfqS )r   d   )randomchoicestringascii_lettersrandint)r%   _r   r   r   r'      s   z(make_data.<locals>.<listcomp>.<listcomp>r   
   )r   rangerm   rq   )r%   rr   r   r   r   r'      s   zmake_data.<locals>.<listcomp>rl   )rt   r   r   r   r   	make_data   s    ru   )__doc__collectionsr   r   r7   r,   rm   ro   rJ   typingr   r   r   Znumpyr9   Zpandas.core.dtypes.commonr   Zpandasr/   Zpandas.api.extensionsr   r	   r
   r   ru   r   r   r   r   <module>   s    