
\c           @` sF  d  d l  m Z 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	 d  d l
 Z
 d  d l Z d  d l m Z d  d l Z d  d l Z d  d l j j Z d  d l m Z m Z m Z m Z m Z y d  d l m Z Wn e k
 rd   Z n Xd d	 l m Z d
 d l  m! Z! d
 d l" m# Z# m$ Z$ m% Z% d
 d l& m' Z' d
 d l( m) Z) d
 d l* m+ Z+ m, Z, m- Z- e	 e j.  Z/ e/ e	 d  k Z0 e0 Z1 d   Z2 d   Z3 d Z4 d Z5 d   Z6 e d e8 d   Z9 d Z: d   Z; d   Z< d e= d  Z> d d  Z? e- d  Z@ e@ jA e jB e jC f  d d   ZD e@ jA e jE  d d   ZF e@ jA eG  d d   ZH e jI e jJ e jK f ZL e- d   ZM eM jA eG  d!    ZN eM jA e jC  d"    ZO eM jA e jE  d#    ZP i e jQ e=  d$ 6e jR d%  d& 6e jS d'  d( 6e jT d  d) 6e jU d*  d+ 6e jU d*  d, 6e jV d*  d- 6d* d. 6ZW d/   ZX d0   ZY eM jA e jB  d d1   ZZ d2   Z[ d3   Z\ d4   Z] d e= d5  Z^ d d6  Z_ e= e= d d7  Z` d8   Za e= e= e= e= d9  Zb d:   Zc d;   Zd d<   Ze e= d=  Zf e= d>  Zg d?   Zh d S(@   i    (   t   absolute_importt   divisiont   print_functionN(   t   LooseVersion(   t   contextmanager(   t   is_categorical_dtypet	   is_scalart	   is_sparset   is_period_dtypet   is_datetime64tz_dtype(   t   is_interval_dtypec         C` s   t  S(   N(   t   False(   t   dtype(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   <lambda>   t    i   (   t   make_array_nonemptyi   (   t   is_dask_collection(   t   PY2t   Iteratort   Mapping(   t   get_deps(   t   get_sync(   t
   asciitablet   is_arrayliket   Dispatchs	   0.24.0rc1c         C` sd   t  |  d |   } t rQ t j t j t j t j t j t j t j	 t j
 f } n d } t | |  S(   NR   (    (   t   getattrt
   HAS_INT_NAt   pdt	   Int8Dtypet
   Int16Dtypet
   Int32Dtypet
   Int64Dtypet
   UInt8Dtypet   UInt16Dtypet   UInt32Dtypet   UInt64Dtypet
   isinstance(   t   tR   t   types(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   is_integer_na_dtype%   s    !c         c` s   t  | t  r t |  } n  t |  s2 |  Vn t j |  } |  j   }  |  j } t |  rq | j	   } n  | j
 |  } |  j | d  Vx9 t t |  d  D]! } |  j | | | | d !Vq W|  j | d Vd S(   sM   Shard a DataFrame by ranges on its index

    Examples
    --------

    >>> df = pd.DataFrame({'a': [0, 10, 20, 30, 40], 'b': [5, 4 ,3, 2, 1]})
    >>> df
        a  b
    0   0  5
    1  10  4
    2  20  3
    3  30  2
    4  40  1

    >>> shards = list(shard_df_on_index(df, [2, 4]))
    >>> shards[0]
        a  b
    0   0  5
    1  10  4

    >>> shards[1]
        a  b
    2  20  3
    3  30  2

    >>> shards[2]
        a  b
    4  40  1

    >>> list(shard_df_on_index(df, []))[0]  # empty case
        a  b
    0   0  5
    1  10  4
    2  20  3
    3  30  2
    4  40  1
    i    i   iN(   R$   R   t   listt   lent   npt   arrayt
   sort_indext   indexR   t
   as_orderedt   searchsortedt   iloct   range(   t   dft	   divisionsR-   t   indicest   i(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   shard_df_on_index1   s    '	s?   meta : pd.DataFrame, pd.Series, dict, iterable, tuple, optionalsW  An empty ``pd.DataFrame`` or ``pd.Series`` that matches the dtypes and
column names of the output. This metadata is necessary for many algorithms
in dask dataframe to work.  For ease of use, some alternative inputs are
also available. Instead of a ``DataFrame``, a ``dict`` of ``{name: dtype}``
or iterable of ``(name, dtype)`` can be provided. Instead of a series, a
tuple of ``(name, dtype)`` can be used. If not provided, dask will try to
infer the metadata. This may lead to unexpected results, so providing
``meta`` is recommended. For more information, see
``dask.dataframe.utils.make_meta``.
c          ` s  |  s   f d   S|  d } d   j  d d  } t j t d | d | d d	 } d
 j t d j |   } | j rd | j k r | j j d |  | _ qd | d } t	 j
 d | j  \ } } | j
 d d  \ }	 }
 d j | | |	 | d | |
  | _ n  | S(   s   Replace `$META` in docstring with param description.

    If pad keyword is provided, will pad description by that number of
    spaces (default is 8).c         ` s   t  |     S(   N(   t   insert_meta_param_description(   t   f(   t   kwargs(    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR   }   R   i    t    t   padi   t   initial_indentt   subsequent_indentt   widthiN   s   {0}
{1}s   
s   $METAs   Parameters
%s----------i   s   Parameters\n[ ]*----------s   

i   s   {0}{1}{2}
{3}{4}

{5}(   t   gett   textwrapt   wrapt   _META_DESCRIPTIONt   formatt   _META_TYPESt   joint   __doc__t   replacet   ret   split(   t   argsR9   R8   t   indentt   bodyt   descrt   parameter_headert   firstt   lastt
   parameterst   rest(    (   R9   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR7   w   s"    
	
c         c` s   y	 d VWn t  k
 r } t j   \ } } } d j t j |   } d } | ra | d 7} n  | d 7} | j |  r d j |   n d t |  |  } t |   n Xd S(   s   Reraise errors in this block to show metadata inference failure.

    Parameters
    ----------
    funcname : str, optional
        If provided, will be added to the error message to indicate the
        name of the method that failed.
    NR   s   Metadata inference failed{0}.

s   You have supplied a custom function and Dask is unable to 
determine the type of output that that function returns. 

To resolve this please provide a meta= keyword.
The docstring of the Dask function you ran should have more information.

sO   Original error is below:
------------------------
{1}

Traceback:
---------
{2}s	    in `{0}`(	   t	   Exceptiont   syst   exc_infoRE   t	   tracebackt	   format_tbRC   t   reprt
   ValueError(   t   funcnamet   udft   et   exc_typet	   exc_valuet   exc_tracebackt   tbt   msg(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   raise_on_meta_error   s    
	
0t   __UNKNOWN_CATEGORIES__c         C` sc   t  |  d |   }  t |  t j  r4 t |  j j k St |  t j  rS t |  j k St d   d S(   sw   Returns whether the categories in `x` are known.

    Parameters
    ----------
    x : Series or CategoricalIndex
    t   _metas#   Expected Series or CategoricalIndexN(	   R   R$   R   t   Seriest   UNKNOWN_CATEGORIESt   catt
   categoriest   CategoricalIndext	   TypeError(   t   x(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   has_known_categories   s    c         C` sd  t  |  t j t j f  r/|  j   }  t  |  t j  r |  j d k } | j   r | | j } x> | D]3 } t |  |  sh |  | j	 j
 g  d t qh qh Wq nJ t  |  t j  r t |  j  r t |   r |  j	 j
 g  d t q n  t  |  j t j  r`t |  j  r`|  j j
 g   |  _ q`n1 t  |  t j  r`t |   r`|  j
 g   }  n  |  S(   s   Replace any unknown categoricals with empty categoricals.

    Useful for preventing ``UNKNOWN_CATEGORIES`` from leaking into results.
    t   categoryt   inplace(   R$   R   Re   t	   DataFramet   copyt   dtypest   anyR-   Rl   Rg   t   set_categoriest   TrueR   R   Ri   (   Rk   t   cat_maskt   catst   c(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   strip_unknown_categories   s$    'c         C` s[  t  |  t j t j f  r0|  j   }  t  |  t j  r |  j d k } | d k rd | | j } n" | j | j	   s t
 d   n  xn | D]# } |  | j j t g d t q Wn@ t  |  t j  r t |  j  r |  j j t g d t q n  | rWt  |  j t j  rW|  j j t g  |  _ qWn' t  |  t j  rW|  j t g  }  n  |  S(   s  Set categories to be unknown.

    Parameters
    ----------
    x : DataFrame, Series, Index
    cols : iterable, optional
        If x is a DataFrame, set only categoricals in these columns to unknown.
        By default, all categorical columns are set to unknown categoricals
    index : bool, optional
        If True and x is a Series or DataFrame, set the clear known categories
        in the index as well.
    Rm   s    Not all columns are categoricalsRn   N(   R$   R   Re   Ro   Rp   Rq   t   NoneR-   t   loct   allRY   Rg   Rs   Rf   Rt   R   R   Ri   (   Rk   t   colsR-   t   maskRw   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   clear_known_categories   s$    $c         C` sf   t  | t  rG | d k rG t j t j t g  d |  d | j d  St j g  d | d |  d | S(   NRm   t   nameR-   i    R   (   R$   t   strR   Re   t   CategoricalRf   R0   (   R   R   R-   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   _empty_series   s    t	   make_metac         C` s   |  j  d  S(   Ni    (   R0   (   Rk   R-   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   make_meta_pandas  s    c         C` s   |  d d !S(   Ni    (    (   Rk   R-   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   make_meta_index  s    c         ` s  t  |  d  r |  j St |   r* |  d  S  d k	 rE t      n  t |  t  r} t j   f d   |  j	   D d   St |  t
  r t |   d k r t |  d |  d d   St |  t t
 f  r>t d   |  D  s t d j |     n  t j   f d	   |  D d
 g  |  D] \ } } | ^ qd   St  |  d  r|  d k	 ry t j |   } t |  SWqt k
 rqXn  t |   rt |   St d j |     d S(   su  Create an empty pandas object containing the desired metadata.

    Parameters
    ----------
    x : dict, tuple, list, pd.Series, pd.DataFrame, pd.Index, dtype, scalar
        To create a DataFrame, provide a `dict` mapping of `{name: dtype}`, or
        an iterable of `(name, dtype)` tuples. To create a `Series`, provide a
        tuple of `(name, dtype)`. If a pandas object, names, dtypes, and index
        should match the desired output. If a dtype or scalar, a scalar of the
        same dtype is returned.
    index :  pd.Index, optional
        Any pandas index to use in the metadata. If none provided, a
        `RangeIndex` will be used.

    Examples
    --------
    >>> make_meta([('a', 'i8'), ('b', 'O')])
    Empty DataFrame
    Columns: [a, b]
    Index: []
    >>> make_meta(('a', 'f8'))
    Series([], Name: a, dtype: float64)
    >>> make_meta('i8')
    1
    Rd   i    c         ` s.   i  |  ]$ \ } } t  | | d    |  q S(   R-   (   R   (   t   .0Rw   t   d(   R-   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys
   <dictcomp>4  s   	R-   i   i   c         s` s0   |  ]& } t  | t  o' t |  d  k Vq d S(   i   N(   R$   t   tupleR)   (   R   R5   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>9  s    s5   Expected iterable of tuples of (name, dtype), got {0}c         ` s.   i  |  ]$ \ } } t  | | d    |  q S(   R-   (   R   (   R   Rw   R   (   R-   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys
   <dictcomp><  s   	 t   columnsR   s*   Don't know how to create metadata from {0}N(   t   hasattrRd   R   Ry   R   R$   t   dictR   Ro   t   itemsR   R)   R   R(   R{   RY   RC   R*   R   t   _scalar_from_dtypeRS   R   t   _nonempty_scalarRj   (   Rk   R-   Rw   R   R   (    (   R-   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   make_meta_object  s4    !	&
t   meta_nonemptyc         C` s8   t  |   r t |   St d j t |   j    d S(   s   Create a nonempty pandas object from the given metadata.

    Returns a pandas DataFrame, Series, or Index that contains two rows
    of fake data.
    s5   Expected Index, Series, DataFrame, or scalar, got {0}N(   R   R   Rj   RC   t   typet   __name__(   Rk   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   meta_nonempty_objectT  s    
	c         ` sn   t   j       f d   t  j  D } t j | d   d t j t  j   }  j | _ | S(   Nc         ` s>   i  |  ]4 \ } } t   j d  d   | f d   |  q S(   Nt   idx(   t   _nonempty_seriesR0   (   R   R5   Rw   (   R   Rk   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys
   <dictcomp>e  s   	R-   R   (	   R   R-   t	   enumerateR   R   Ro   R*   t   arangeR)   (   Rk   t   datat   res(    (   R   Rk   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   meta_nonempty_dataframeb  s    c         C` s  t  |   } | t j k r1 t j d d |  j S| t k rV | d d g d |  j S| t j k r t j d d g d |  j S| t j k r4d } y5 t j d | d d d	 |  j d
 |  j	 d |  j  SWq_t
 k
 r0|  j d  k r | d g n d  } t j | d | d d d	 |  j d
 |  j	 d |  j SXn+| t j k rkt j d d d d d	 |  j d |  j  S| t j k r.t j d d  } y, t j d | d d d	 |  j d |  j  SWq_t
 k
 r*t j d d  } |  j d  k r| | d g n d  } t j | d | d d d	 |  j d |  j SXn1| t j k rt |  j  d k rvt j t |  j  d |  j } n* t j j d d g d |  j d |  j } t j | d |  j S| t j k r_g  |  j D] } t |  ^ q} g  |  j D] } d d g ^ q} y# t j d | d | d |  j  SWq_t k
 r[t j d | d | d |  j  SXn  t d j t  |   j    d  S(   Ni   R   i   t   at   bs
   1970-01-01t   startt   periodst   freqt   tzs
   1970-01-02t   Di    t   orderediRh   t   levelst   codest   namest   labelss*   Don't know how to handle index of type {0}(   R   R   t
   RangeIndexR   t   _numeric_index_typest   Indext   DatetimeIndext
   date_rangeR   R   RY   Ry   t   PeriodIndext   period_ranget   TimedeltaIndexR*   t   timedelta64t   timedelta_rangeRi   R)   Rh   R   t   _nonempty_indexR   t
   from_codest
   MultiIndexR   R   Rj   RC   R   (   R   t   typR   R   t   lR   R5   R   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR   m  sZ    !!
%	!""##	R   R:   t   Vs
   1970-01-01t   Mt   mt   foot   SR   t   Ut   Oc         C` s   |  j  d
 k r |  j d  S|  j  d k rA |  j t d d   S|  j  t k r} t |  j  } |  j  d k ry | j |   S| St d	 j |     d  S(   NR5   R8   t   ui   Rw   i    R   R   s   Can't handle dtype: {0}(   R5   R8   R   (   R   R   (   t   kindR   t   complext   _simple_fake_mappingt   astypeRj   RC   (   R   t   o(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR     s     c         C` s   t  |  t j t j t j f  r% |  St j |   rk t |  d  rL |  j n t j t	 |    } t
 |  St d j t	 |   j    d  S(   NR   s   Can't handle meta of type '{0}'(   R$   R   t	   Timestampt	   Timedeltat   PeriodR*   t   isscalarR   R   R   R   Rj   RC   R   (   Rk   R   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR     s    !-
	c         C` sU  | d  k r t |  j  } n  |  j } t |  rZ t j d d | j } | | g } nt |  r t	 |  j
 j  r |  j
 j d g d } |  j
 j } n t |  j
 j  } d  } t j | d | d |  j
 j } n_t |  rt j d d  g d | } n5t |  r@| j } t j d	 |  t j d
 |  g } n t |  rt rdt | j  } n t | j  } t j | | g d | } n t |  rt | j  } t rt j | | g d | } q9t j | | g d | } nK t |  t j k rt |  } n' t |  } t j | | g d | } t j | d |  j d | S(   Ns
   1970-01-01R   i    i   Rh   R   i   R   t   2000t   2001R   R-   (   Ry   R   R-   R   R	   R   R   R   R   R)   Rg   Rh   R   R   R'   R+   R   R   R   R   t   PANDAS_GT_0240R   t   subtypet   SparseArrayR
   R*   R   R   t   _lookupRe   R   (   t   sR   R   t   entryR   Rv   R   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR     sD    		'c         ` s_   t      t  f d   d D  o^ t   f d   d D  o^ t  f d   d D  S(   s    Looks like a Pandas DataFrame c         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s   t   groupbyt   headt   merget   meanc         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R2   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s    Rq   c         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s   t   value_countsR   (   R   R   R   R   (   Rq   (   R   R   (   R   R{   Rr   (   R2   (    (   R2   R   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   is_dataframe_like  s    c         ` sW   t      t  f d   d	 D  oV t   f d   d
 D  oV d  j j   k S(   s    Looks like a Pandas Series c         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s    R   R   R   c         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s    R   R   R-   (   R   R   R   (   R   R   (   R   R{   R   t   lower(   R   (    (   R   R   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   is_series_like  s    c         ` s;   t     } t   f d   d D  o: d | j j   k S(   s    Looks like a Pandas Index c         3` s   |  ] } t    |  Vq d  S(   N(   R   (   R   R   (   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s    R   R   R-   (   R   R   (   R   R{   R   R   (   R   R   (    (   R   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   is_index_like	  s    c         ` sS  | r d d d h n t        f d   } t |  pN t |  pN t |  s^ t |  rz t d t |  j   n  t |   t |  k r d t |  j t |   j f } nrt |  rt   } t	 d k r t
 | d <n  t j |  j | j g d	 d
 | } g  | j d  j   D]- \ } }	 }
 | |	 |
  s| |	 |
 f ^ q} | rd t |  j t d d d g |  f } q)t j t j | j  t j |  j   sd | j |  j f } q)|  SnY | |  j | j  r|  Sd t |  j t d d g d |  j f d | j f g  f } t d | r?d | n d | f   d S(   s  Check that the dask metadata matches the result.

    If metadata matches, ``x`` is passed through unchanged. A nice error is
    raised if metadata doesn't match.

    Parameters
    ----------
    x : DataFrame, Series, or Index
    meta : DataFrame, Series, or Index
        The expected metadata that ``x`` should match
    funcname : str, optional
        The name of the function in which the metadata was specified. If
        provided, the function name will be included in the error message to be
        more helpful to users.
    numeric_equal : bool, optionl
        If True, integer and floating dtypes compare equal. This is useful due
        to panda's implicit conversion of integer to floating upon encountering
        missingness, which is hard to infer statically.
    R5   R8   R   c         ` s   t  |   t  |  k r t St |  t  r7 |  d k sR t | t  rV | d k rV t St  |   r t  |  r t |  j k s t | j k r t S|  | k S|  j   k r | j   k p |  | k S(   Nt   -(   R   R   R$   R   Rf   Rh   Rt   R   (   R   R   (   t   eq_types(    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   equal_dtypes&  s    6
s>   Expected partition to be DataFrame, Series, or Index, got `%s`s,   Expected partition of type `%s` but got `%s`s   0.23.0t   sortt   axisi   R   s   Partition type: `%s`
%st   Columnt   Foundt   Expecteds]   The columns in the computed data do not match the columns in the provided metadata.
 %s
  :%sR   R   s   Metadata mismatch found%s.

%ss    in `%s`N(   t   setR   R   R   R   Rj   R   R   R   t   PANDAS_VERSIONRt   R   t   concatRq   t   fillnat
   itertuplesR   R*   t   array_equalt
   nan_to_numR   R   RY   (   Rk   t   metaRZ   t   numeric_equalR   t   errmsgR9   Rq   t   colR   R   t
   bad_dtypes(    (   R   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt
   check_meta  sD    %"	$%$c         C` so   t  |   } | d k r' |  j j } n  | rV |  d } |  d } d j | |  } n d } d j | | |  S(   s+   Summarized representation of an Index.
    i    is
   , {} to {}R   s   {}: {} entries{}N(   R)   Ry   t	   __class__R   RC   (   R   R   t   nR   t   tailt   summary(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   index_summaryY  s    

c         C` s|  d d  l  j } t |  d  rx| d  k r? |  j d d  } n  t |  | j  r d t |  j k sx t	 t |    | r |  j
 | j
 k s t	  |  j j
 | j
 k s t	  t | t j  r | j |  j j k s t	  q n  | rtt |  |  qtnwt |  | j  rd t |  j k s6t	 t |    t |  j  t |  k sft	 t |  j    | r|  j
 | j
 k st	 |  j
 | j
 f   |  j j
 | j
 k st	  n  | rt |  |  n  t |  j d | d | d	 | j nt |  | j  rd
 t |  j k s(t	 t |    t |  j t j  sRt	 t |  j    t |  j  t |  k st	 t |  j    | rt j |  j | j  t j |  j j | j  n  | rt |  |  n  t |  j d | d | d	 | j n t |  | j j  rSt j |  s:t | t j t j f  s:t	  | rtt |  |  qtn! d j t |    } t	 |   | S|  S(   Ni    t   daskt	   schedulert   syncR   Re   t   check_namest   check_dtypest   resultRo   s#   Unsupported dask instance {0} found(   t   dask.dataframet	   dataframeR   Ry   t   computeR$   R   R   R   t   AssertionErrorR   Rd   R   R   R   t   assert_dask_dtypesRe   t   _check_daskR-   Ro   R   t   tmt   assert_index_equalt   coret   ScalarR*   R   R   R   RC   (   t   dskR   R   R   t   ddRa   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR   n  sV    '!'0*'*0!c         C` s   y t  |   r t |  j j  t |  j  @rf g  t t |  j j   D] } d | ^ qG |  j _ n  |  j d |  j j    }  n |  j   }  Wn t	 t
 t f k
 r n X|  j   S(   Ns   -overlapped-index-name-%dt   by(   R   R   R-   R   R   R1   R)   t   sort_valuest   tolistRj   t
   IndexErrorRY   R,   (   R   R5   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   _maybe_sort  s    5c   	      K` sN  | r t  |   t  |  t |  d  r t | d  r t t j |  j  j   d  } t t j | j  j   d  } | | k s t | | f   q n  t |   t |  t	 |  d | d | }  t	 | d | d | } | s|  j
 d t  }  | j
 d t  } n  t |  d  r/|  j   }  n  t | d  rM| j   } n  t |  t j  rt |   }  t |  } t j |  | |  n t |  t j  rt |   }  t |  } t j |  | d | | nw t |  t j  rt j |  | |  nO |  | k rt St j |   r2t j |  sJt  n t j |  |  sJt  t S(   NR3   i    R   R   t   dropt	   to_pandas(   t   assert_divisionsR   R   R*   t   asarrayR3   R  R   t   assert_sane_keynamesR   t   reset_indexRt   R
  R$   R   Ro   R  R   t   assert_frame_equalRe   t   assert_series_equalR   R   t   isnant   allclose(	   R   R   R   R   t   check_divisionst   check_indexR9   t   att   bt(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt	   assert_eq  sD    

""$

c         C` s   t  |  d  r |  j }  n  t |  t  s0 t  x= |  D]5 } t | t  rY | d } n  | j |  r7 t Sq7 Wt d j d |    d  S(   NR   i    s/   given dask graph doesn't contain label: {label}t   label(	   R   R   R$   R   R   R   t
   startswithRt   RC   (   R   R  t   k(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   assert_dask_graph  s    c         C` s1  t  |  d  s d  St |  d t  s) d  Sd   } t |  j |  j    } x{ t | d   D]i \ } } t |  r[ | |  j   |  j	 | k s t
  | |  j   |  j	 | d k  s t
  q[ q[ Wt | d  r-| | d  j   |  j	 d k st
  | | d  j   |  j	 d k s-t
  n  d  S(   NR3   t   known_divisionsc         S` s@   t  |   r |  Sy |  j j d  SWn t k
 r; |  j SXd  S(   Ni    (   R   R-   t   get_level_valuest   AttributeError(   Rk   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR-     s    ii   i(   R   R   R   R   R   t   __dask_keys__R   R)   t   minR3   R   t   max(   t   ddfR-   t   resultsR5   R2   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR    s    	%0)c         C` s   t  |  d  s d  Sx |  j j   D] } x t | t  rH | d } q, Wt | t t f  sd t  t |  d k  s| t  d | k s t  t	 s# | j
 d  d j   s t  q# q# Wd  S(   NR   i    id   R:   R   (   R   R   t   keysR$   R   R   t   bytesR   R)   R   RI   t   isidentifier(   R"  R  (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR    s    c         ` s  d d d d h g   | r4   j  d d d h  n    f d   } t |  r t |  r xAt j |  j j | j g d	 d
 j   D]$ \ } } } | | |  s t  q Wn t |  rt	 |  s t
 |  r|  j j } | j } | | |  st  n t |  j d  r|  j j } t | d  s^t j |  sFt  t j t |   } n	 | j } | | |  st  n! t |  j  t |  k st  d S(   s  Check that the dask metadata matches the result.

    If `numeric_equal`, integer and floating dtypes compare equal. This is
    useful due to the implicit conversion of integer to floating upon
    encountering missingness, which is hard to infer statically.R   R   R   R   R5   R8   R   c         ` s)   t     f d    D  p(    k S(   Nc         3` s-   |  ]# }   j  | k o$  j  | k Vq d  S(   N(   R   (   R   R   (   R   R   (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pys	   <genexpr>  s   (   Rr   (   R   R   (   t   eq_type_sets(   R   R   s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt	   eq_dtypes  s    R   i   R   N(   t   appendR   R   R   R   Rd   Rq   R   R   R   R   R   R   R*   R   R   (   R"  R   R   R(  R   R   R   (    (   R'  s3   lib/python2.7/site-packages/dask/dataframe/utils.pyR   	  s(    %		c         C` sp   t  |  j  \ } } | rE t t t | j     | k sl t  n' t t t | j     | k sl t  d  S(   N(   R   R   R!  t   mapR)   t   valuesR   (   Rk   R   t   eqt   dependenciest
   dependents(    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   assert_max_deps-  s    *c         C` s   t  |  t t f  s t Sx[ t |  d   D]I \ } } | |  | d k rN t St  | t j  r* t j |  r* t Sq* Wx7 |  d D]+ } t  | t j  r t j |  r t Sq W|  d |  d k r t St	 S(   sS   Are the provided divisions valid?

    Examples
    --------
    >>> valid_divisions([1, 2, 3])
    True
    >>> valid_divisions([3, 2, 1])
    False
    >>> valid_divisions([1, 1, 1])
    False
    >>> valid_divisions([0, 1, 1])
    True
    >>> valid_divisions(123)
    False
    >>> valid_divisions([0, float('nan'), 1])
    False
    ii   i(
   R$   R   R(   R   R   t   numberst   Numbert   mathR  Rt   (   R3   R5   Rk   (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   valid_divisions5  s    !!(i   t
   __future__R    R   R   R2  R0  RH   R@   t   distutils.versionR   RT   RV   t
   contextlibR   t   numpyR*   t   pandasR   t   pandas.util.testingt   utilt   testingR   t   pandas.api.typesR   R   R   R   R	   R
   t   ImportErrort
   extensionsR   t   baseR   t   compatibilityR   R   R   R   R   t   localR   t   utilsR   R   R   t   __version__R   R   R   R'   R6   RD   RB   R7   Ry   R   Rb   Rf   Rl   Rx   Rt   R~   R   R   t   registerRe   Ro   R   R   R   t   objectR   t
   Int64Indext   Float64Indext   UInt64IndexR   R   R   R   R   t   bool_t   voidt
   datetime64R   t   str_t   unicode_R   R   R   R   R   R   R   R   R   R   R  R  R  R  R  R   R/  R3  (    (    (    s3   lib/python2.7/site-packages/dask/dataframe/utils.pyt   <module>   s   (		8			!>8
		.	
		I0	(			$