ó
šxŠ\c           @   sÃ   d  Z  d d l Z d d l 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
 d d l m Z d d l m Z d e
 f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 „  Z d S(   s­  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 (Py3 only). 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.
iÿÿÿÿN(   t   ExtensionDtype(   t   compat(   t   ExtensionArrayt	   JSONDtypec           B   s_   e  Z e j Z d  Z y e j ƒ  Z Wn e	 k
 r> i  Z n Xe
 d „  ƒ Z e
 d „  ƒ Z RS(   t   jsonc         C   s   t  S(   sg   Return the array type associated with this dtype

        Returns
        -------
        type
        (   t	   JSONArray(   t   cls(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   construct_array_type&   s    c         C   s2   | |  j  k r |  ƒ  St d j |  | ƒ ƒ ‚ d  S(   Ns!   Cannot construct a '{}' from '{}'(   t   namet	   TypeErrort   format(   R   t   string(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   construct_from_string0   s    	(   t   __name__t
   __module__R   t   Mappingt   typeR   t   collectionst   UserDictt   na_valuet   AttributeErrort   classmethodR   R   (    (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyR      s   	

R   c           B   sÎ   e  Z e ƒ  Z d  Z d e d „ Z e d e d „ ƒ Z	 e d „  ƒ Z
 d „  Z d „  Z d „  Z e d „  ƒ Z d „  Z e d d	 „ Z e d
 „ Z e d „ Z d „  Z e d „  ƒ Z d „  Z d „  Z RS(   iè  c         C   se   xB | D]: } t  | |  j j ƒ s t d t |  j j ƒ ƒ ‚ q q W| |  _ |  j |  _ |  _ d  S(   Ns   All values must be of type (   t
   isinstancet   dtypeR   R	   t   strt   datat   _itemst   _data(   t   selft   valuesR   t   copyt   val(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   __init__=   s    	c         C   s
   |  | ƒ S(   N(    (   R   t   scalarsR   R   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   _from_sequenceK   s    c         C   s2   |  g  | D]! } | d k r
 t  j | ƒ ^ q
 ƒ S(   N(    (   R   R   (   R   R   t   originalt   x(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   _from_factorizedO   s    c         C   sÊ   t  | t j ƒ r |  j | St  | t j ƒ rs | j d k rs |  j g  t |  | ƒ D] \ } } | rT | ^ qT ƒ St  | t	 j
 ƒ r¯ t |  ƒ g  | D] } |  j | ^ q• ƒ St |  ƒ |  j | ƒ Sd  S(   Nt   bool(   R   t   numberst   IntegralR   t   npt   ndarrayR   R"   t   zipR   t   IterableR   (   R   t   itemR$   t   mt   i(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   __getitem__S   s    !5*c         C   s"  t  | t j ƒ r" | |  j | <nü t  | t |  ƒ t j f ƒ sU t j | g ƒ } n  t  | t	 j
 ƒ rÖ | j d k rÖ x¥ t t | | ƒ ƒ D]C \ } \ } } | rŒ t  | |  j j ƒ s¿ t ‚ | |  j | <qŒ qŒ WnH xE t | | ƒ D]4 \ } } t  | |  j j ƒ st ‚ | |  j | <qæ Wd  S(   NR&   (   R   R'   R(   R   R   R   t   Sequencet	   itertoolst   cycleR)   R*   R   t	   enumerateR+   t   AssertionError(   R   t   keyt   valueR/   t   kt   v(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   __setitem___   s    !(c         C   s   t  |  j ƒ S(   N(   t   lenR   (   R   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   __len__s   s    c         C   s   t  j |  j ƒ S(   N(   t   syst	   getsizeofR   (   R   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   nbytesv   s    c         C   s5   t  j g  |  j D] } | |  j j k ^ q d t ƒS(   NR   (   R)   t   arrayR   R   R   R&   (   R   R$   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   isnaz   s    .c         C   sû   t  j | ƒ } d } | rª | d  k r6 |  j j } n  | d k  j ƒ  rQ t ‚ n  y6 g  | D]% } | d k rz |  j | n | ^ q[ } Wqî t k
 r¦ t | ƒ ‚ qî XnD y$ g  | D] } |  j | ^ q´ } Wn t k
 rí t | ƒ ‚ n X|  j	 | ƒ S(   NsI   Index is out of bounds or cannot do a non-empty take from an empty array.iÿÿÿÿ(
   R)   t   asarrayt   NoneR   R   t   anyt
   ValueErrorR   t
   IndexErrorR"   (   R   t   indexert
   allow_fillt
   fill_valuet   msgt   loct   output(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   take~   s"    	3$c         C   s   t  |  ƒ |  j ƒ S(   N(   R   R   (   R   t   deep(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyR   ™   s    c         C   sm   t  | t |  j ƒ ƒ r; | |  j k r; | r7 |  j ƒ  S|  St j g  |  D] } t | ƒ ^ qH d | d | ƒS(   NR   R   (   R   R   R   R   R)   R@   t   dict(   R   R   R   R$   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   astypeœ   s
    '
c         C   s<   t  |  ƒ g  t d „  |  j Dƒ ƒ D] } t | ƒ ^ q# ƒ S(   Nc         S   s"   h  |  ] } t  | j ƒ  ƒ ’ q S(    (   t   tuplet   items(   t   .0t   d(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pys	   <setcomp>¬   s   	 (   R   t   listR   RO   (   R   R$   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   unique¨   s    	c         C   s8   t  t j j g  | D] } | j ^ q ƒ ƒ } |  | ƒ S(   N(   RU   R2   t   chaint   from_iterableR   (   R   t	   to_concatR$   R   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   _concat_same_type¯   s    .c         C   s7   |  j  ƒ  } t | ƒ d k r- | j ƒ  } n  | d f S(   Ni    (    (   t   _values_for_argsortR;   t   ravel(   R   t   frozen(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   _values_for_factorize´   s    c         C   sC   d g g  |  D] } t  | j ƒ  ƒ ^ q } t j | d t ƒd S(   NR   i   (    (   RQ   RR   R)   R@   t   object(   R   R$   R]   (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyR[   »   s    ,N(   R   R   R   R   t   __array_priority__RC   t   FalseR    R   R"   R%   R0   R:   R<   t   propertyR?   RA   RM   R   t   TrueRP   RV   RZ   R^   R[   (    (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyR   9   s$   							c       	   C   si   g  t  d ƒ D]X }  t j g  t  t j d d ƒ ƒ D]* }  t j t j ƒ t j d d ƒ f ^ q2 ƒ ^ q S(   Nid   i    i
   (   t   rangeR   R   t   randomt   randintt   choiceR   t   ascii_letters(   t   _(    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt	   make_dataÃ   s    (   t   __doc__R   R2   R'   Re   R   R=   t   numpyR)   t   pandas.core.dtypes.baseR    t   pandasR   t   pandas.core.arraysR   R   R   Rj   (    (    (    s@   lib/python2.7/site-packages/pandas/tests/extension/json/array.pyt   <module>   s   Š