ó
yJ[c           @   s(  d  d d d g Z  d d l Z d d l Z d d l m Z d d l m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m Z m Z m Z m Z m Z m Z e
 r§ d d l Z n  d e f d	 „  ƒ  YZ d d d
 „ Z d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d d „ Z d „  Z  d S(   t   Ct   guess_categoricalt   CategoricalSniffert   categorical_to_intiÿÿÿÿN(   t
   PatsyError(   t   SortAnythingKeyt   safe_scalar_isnant   iterablet   have_pandast   have_pandas_categoricalt   have_pandas_categorical_dtypet   safe_is_pandas_categoricalt   pandas_Categorical_from_codest   pandas_Categorical_categoriest   pandas_Categorical_codest   safe_issubdtypet   no_picklingt   assert_no_picklingt   _CategoricalBoxc           B   s   e  Z d  „  Z e Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   datat   contrastt   levels(   t   selfR   R   R   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   __init__9   s    		(   t   __name__t
   __module__R   R   t   __getstate__(    (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR   8   s   	c         C   s[   t  |  t ƒ rK | d k r' |  j } n  | d k r? |  j } n  |  j }  n  t |  | | ƒ S(   s/  
    Marks some `data` as being categorical, and specifies how to interpret
    it.

    This is used for three reasons:

    * To explicitly mark some data as categorical. For instance, integer data
      is by default treated as numerical. If you have data that is stored
      using an integer type, but where you want patsy to treat each different
      value as a different level of a categorical factor, you can wrap it in a
      call to `C` to accomplish this. E.g., compare::

        dmatrix("a", {"a": [1, 2, 3]})
        dmatrix("C(a)", {"a": [1, 2, 3]})

    * To explicitly set the levels or override the default level ordering for
      categorical data, e.g.::

        dmatrix("C(a, levels=["a2", "a1"])", balanced(a=2))
    * To override the default coding scheme for categorical data. The
      `contrast` argument can be any of:

      * A :class:`ContrastMatrix` object
      * A simple 2d ndarray (which is treated the same as a ContrastMatrix
        object except that you can't specify column names)
      * An object with methods called `code_with_intercept` and
        `code_without_intercept`, like the built-in contrasts
        (:class:`Treatment`, :class:`Diff`, :class:`Poly`, etc.). See
        :ref:`categorical-coding` for more details.
      * A callable that returns one of the above.
    N(   t
   isinstanceR   t   NoneR   R   R   (   R   R   R   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR    @   s     c          C   s^  t  d ƒ }  t |  t ƒ s! t ‚ |  j d k s6 t ‚ |  j d  k sK t ‚ |  j d  k s` t ‚ t  d d d ƒ } | j d k s‡ t ‚ | j d k sœ t ‚ | j d k s± t ‚ t  | d d ƒ} | j d k sØ t ‚ | j d k sí t ‚ | j d k st ‚ t  | d ƒ } | j d k s&t ‚ | j d k s;t ‚ | j d k sPt ‚ t | ƒ d  S(   Nt   asdft   DATAt   CONTRASTt   LEVELSR   s
   NEW LEVELSs   NEW CONTRAST(	   R    R   R   t   AssertionErrorR   R   R   R   R   (   t   c1t   c2t   c3t   c4(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   test_Ch   s$    c         C   sO   t  |  ƒ r t St |  t ƒ r# t St j |  ƒ }  t |  j t j ƒ rK t	 St S(   N(
   R   t   TrueR   R   t   npt   asarrayR   t   dtypet   numbert   False(   R   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR   }   s    c          C   sa  t  rW t j d d d g ƒ }  t |  ƒ s0 t ‚ t rW t t j |  ƒ ƒ sT t ‚ qW n  t t d d d g ƒ ƒ sx t ‚ t t t	 g ƒ s t ‚ t d d g ƒ s¨ t ‚ t d d t
 j g ƒ sÆ t ‚ t d d d  g ƒ sá t ‚ t d d d g ƒ sý t ‚ t d d d t
 j g ƒ st ‚ t d d d g ƒ s;t ‚ t d d d t
 j g ƒ s]t ‚ d  S(	   Ni   i   i   t   at   bg      ð?g       @g      @(   R	   t   pandast   CategoricalR   R!   R
   t   SeriesR    R'   R,   R(   t   nanR   (   t   c(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   test_guess_categorical‡   s    !!"c         C   se   t  |  d ƒ r- |  j d k r- t d ƒ ‚ n  t |  ƒ sU t |  t j t j f ƒ ra |  g }  n  |  S(   Nt   ndimi   s)   categorical data cannot be >1-dimensional(   t   hasattrR5   R   R   R   t   sixt	   text_typet   binary_type(   R   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   _categorical_shape_fix—   s    c           B   s,   e  Z d d  „ Z d „  Z d „  Z e Z RS(   c         C   s4   | |  _  | |  _ d  |  _ d  |  _ t ƒ  |  _ d  S(   N(   t
   _NA_actiont   _originR   t	   _contrastt   _levelst   sett
   _level_set(   R   t	   NA_actiont   origin(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR   ¦   s
    				c         C   sP   |  j  d  k r: t |  j ƒ } | j d t ƒ | |  _  n  t |  j  ƒ |  j f S(   Nt   key(   R>   R   t   listR@   t   sortR   t   tupleR=   (   R   R   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   levels_contrast­   s
    c         C   sy  t  | d ƒ r | j |  _ n  t | t ƒ r^ | j d  k	 rR t | j ƒ |  _ t	 S| j
 } n  t | ƒ rƒ t t | ƒ ƒ |  _ t	 St  | d ƒ rÀ t | j t j ƒ rÀ t t	 t g ƒ |  _ t	 St | ƒ } x‘ | D]‰ } |  j j | ƒ rñ qÓ n  | t	 k s	| t k r"|  j j t	 t g ƒ qÓ y |  j j | ƒ WqÓ t k
 r[t d |  j ƒ ‚ qÓ XqÓ W|  j t t	 t g ƒ k S(   NR   R*   s?   Error interpreting categorical data: all items must be hashable(   R6   R   R=   R   R   R   R   RF   R>   R'   R   R   R   R   R*   R(   t   bool_R?   R,   R@   R:   R;   t   is_categorical_NAt   updatet   addt	   TypeErrorR   R<   (   R   R   t   value(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   sniff´   s2    $N(   R   R   R   R   RG   RN   R   R   (    (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR   ¥   s   		(c       
      s`  d d l  m ‰  d  ‡  f d † }  t r7d „  t g } t rV | t j d „  g 7} n  xÞ | D]Ó } |  g  | t j d d d  g ƒ ƒ g t	 d ƒ |  g  | t
 d d g d	 d
 g ƒ ƒ g t	 d ƒ |  g  | t
 d d g d
 d	 g ƒ ƒ g t	 d ƒ | t j d	 d
 g ƒ ƒ } d | _ |  g  | g t	 d d ƒ q] Wn  |  g  t d d g ƒ t d d g ƒ g t d ƒ |  g  t d d g d d d d g ƒt d d g ƒ g t	 d  ƒ |  g  t d d g d d d d g ƒt d d g ƒ g t	 d! ƒ |  d d g t d t j g ƒ t d d  g ƒ g t d" ƒ t ˆ  d d g ƒ ƒ } | j t d t j d  g ƒ ƒ | j ƒ  \ } } t | ƒ t d  d g ƒ k st ‚ |  d d g t t	 t j d  g ƒ g t	 t t	 f ƒ |  g  t d d g ƒ t t g ƒ t d d g ƒ g t t t	 d d d d f ƒ |  g  t j t	 t g ƒ d g g t	 t t	 f ƒ |  d d g t d# d  d$ t j d% g ƒ g t d& d' d( f ƒ |  g  t d d g d d ƒg t d) d ƒ |  g  d d g d g g t d* ƒ |  g  d
 d	 g d	 g g t d+ ƒ |  g  d
 g t d, ƒ d d l m } t ˆ  ƒ  ƒ } | t | j i  g ƒ | t | j t j d
 g g ƒ ƒ d  S(-   Niÿÿÿÿ(   t   NAActionc            sz   t  ˆ  d |  ƒ ƒ } x@ | D]8 } | j | ƒ } | rG | sC t ‚ Pq | s t ‚ q W| j ƒ  | | f k sv t ‚ d  S(   Nt   NA_types(   R   RN   R!   RG   (   RP   t   datast   exp_finish_fastt
   exp_levelst   exp_contrastt   snifferR   t   done(   RO   (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   tà   s    c         S   s   |  S(   N(    (   t   x(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   <lambda>ï   s    c         S   s   t  t j |  ƒ ƒ S(   N(   R    R/   R1   (   RX   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyRY   ó   s    i   i   i    R-   R.   R   i   R   i   R   t   NaNi
   RP   i   i   i(   t   fooR3   R   t   FOO(   t   assert_raises(   i   i   (   R-   R.   (   R.   R-   (   R-   R.   (   i   i   i   (   i   i   i   (   i   i   i   (   i   i
   (   R.   i   (   R-   i   (   R3   N(   R-   i   (   R.   i   (   R3   N(   i
   i   (   i
   i   i   (   R-   R.   (   R.   (   t   patsy.missingRO   R   R	   R    R
   R/   R1   R0   R'   R   R   R,   R(   R2   R   RN   RG   R?   R!   R)   t
   nose.toolsR]   R   (   RW   t   prepst   prept   objRU   R   t   _R]   (    (   RO   s0   lib/python2.7/site-packages/patsy/categorical.pyt   test_CategoricalSnifferÞ   sV    		$
'
'
	 1@@0
$$3!*+""c         C   s  t  | t ƒ s t ‚ t |  ƒ re t t |  ƒ ƒ } | | k s[ t d | | f | ƒ ‚ n  t |  ƒ St  |  t ƒ rÉ |  j d  k	 r½ t |  j ƒ | k r½ t d | t |  j ƒ f | ƒ ‚ n  |  j
 }  n  t |  ƒ }  y% t t | t t | ƒ ƒ ƒ ƒ } Wn  t k
 rt d | ƒ ‚ n Xt |  d ƒ rtt |  j t j ƒ rt| t d k rt| t d k rt|  j t j ƒ Sn  t j t |  ƒ d t ƒ} xVt |  ƒ D]H\ } } | j | ƒ rÄd | | <qœy | | | | <Wqœt k
 r½d }	 g  }
 t | ƒ |	 k r*|
 g  | D] } t | ƒ ^ q7}
 nd |
 g  | |	 d  D] } t | ƒ ^ q<7}
 |
 j  d	 ƒ |
 g  | |	 d D] } t | ƒ ^ qu7}
 d
 d j! |
 ƒ } t d | | f | ƒ ‚ qœt k
 rãt d | f | ƒ ‚ qœXqœWt" rt  |  t# j$ ƒ rt# j$ | d |  j% ƒ} n  | S(   Ns'   mismatching levels: expected %r, got %rs?   Error interpreting categorical data: all items must be hashableR*   i    i   iÿÿÿÿi   i   s   ...s   [%s]s   , sx   Error converting data to categorical: observation with value %r does not match any of the expected levels (expected: %s)sE   Error converting data to categorical: encountered unhashable value %rt   index(&   R   RF   R!   R   R   R   R   R   R   R   R   R:   t   dictt   zipt   ranget   lenRL   R6   R   R*   R(   RH   R,   R'   t   astypet   int_t   emptyt   intt	   enumerateRI   t   KeyErrort   reprt   appendt   joinR   R/   R1   Re   (   R   R   RA   RB   t   data_levels_tuplet   level_to_intt   outt   iRM   t   SHOW_LEVELSt
   level_strst   levelt	   level_str(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyR   4  s\    
$%$ &%&c          C   s  d d l  m }  d d l m } t rÙ t j d d d g d d d	 d
 g ƒ} t | d | ƒ  ƒ } t j	 | d d d g k ƒ s† t
 ‚ t j	 | j d d	 d
 g k ƒ s­ t
 ‚ |  t t t j i | d 6ƒ d | ƒ  ƒ n  t rt g } t rd „  } | j | ƒ n  x| D]} | d d d g d ƒ } t | d  | ƒ  ƒ } t j	 | d d d g k ƒ set
 ‚ | d d d g d! ƒ }	 t | d" | d d g ƒ ƒ }
 t j	 |
 d d d g k ƒ s¿t
 ‚ |  t t | d d g d# ƒ d$ | ƒ  ƒ |  t t | d d g d% ƒ d& | ƒ  ƒ qWn  | ƒ  d „ } | d d d g d' d d d g ƒ | t j d d d g ƒ d( d d d g ƒ | t j d d d g d t ƒd) d d d g ƒ | d d d g d* d d d g ƒ | t j d d d g ƒ d+ d d d g ƒ | t j d d d g d t ƒd, d d d g ƒ | t j d d d g d t ƒd- d d d g ƒ | d d d g d. d d d g ƒ | d/ d0 d1 g d2 d3 f d d d g ƒ |  t t d d d g d4 | ƒ  ƒ | t d d d g ƒ d5 d d d g ƒ | t d d d g ƒ d6 d d d g ƒ | t d d d g d d d g ƒd7 d d d g ƒ |  t t t d d d g d d d g ƒd8 | ƒ  ƒ | d d9 d g ƒ | d d: d g ƒ | t t t f d g ƒ |  t t t j d d g d d g g ƒ d; | ƒ  ƒ |  t t d d g d d i  f | ƒ  ƒ |  t t d d i  g d< | ƒ  ƒ | d d  t j d g d= d d d d g | d d d g ƒ ƒ | d d  t j d g d> d d d d g | d d d g ƒ ƒ | d d  t j d g d? d d d d g | d d g ƒ ƒ |  t t d d d g d@ | ƒ  ƒ d  S(A   Niÿÿÿÿ(   R]   (   RO   R-   R.   R3   Re   i
   i   i   i    i   i   c         S   s   t  |  | ƒ } t j | ƒ S(   N(   R   R/   R1   (   t   codest
   categoriesR3   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   Series_from_codes‚  s    R   RP   c         S   s.   t  |  | | ƒ } t j | | ƒ s* t ‚ d  S(   N(   R   R(   t   array_equalR!   (   R   R   t   expectedRA   t   got(    (    s0   lib/python2.7/site-packages/patsy/categorical.pyRW   ›  s    R*   t   dt   zi   R   RZ   t   qt   et   ft   gt   h(   R-   R.   R3   (   R-   R.   R3   (   R-   R.   (   R-   R.   (   R-   R   (   R-   R.   (   R-   R.   (   R-   R3   (   R-   R.   (   R.   R-   (   R-   R.   (   R-   R.   (   R-   R.   (   i   i   i    (   i   i   i    (   i   i   i    (   i   i   i    (   R-   R   R‚   R.   (   R-   i   (   R.   i    (   R-   i   (   R-   i   (   R.   i    (   R-   R3   (   R-   R.   (   R.   R-   (   R.   R-   (   R.   R-   (   R-   R.   (   R-   R.   (   R-   R.   (   R-   R.   (   R-   R.   (   R-   R.   N(   R-   R.   N(   R-   R.   R3   R   R„   R…   R†   R‡   (   R_   R]   R^   RO   R   R/   R1   R   R(   t   allR!   Re   R   t	   DataFrameR	   R   R
   Rq   R)   t   objectt   floatR    R'   R,   R   R2   (   R]   RO   t   st   c_pandast   constructorsR}   t   cont   catt   convt   cat2t   conv2RW   (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   test_categorical_to_ints  sŽ    '$'#		$	$
"+1"+11"(	((4				'''	(!   t   __all__t   numpyR(   R7   t   patsyR   t
   patsy.utilR   R   R   R   R	   R
   R   R   R   R   R   R   R   R/   RŠ   R   R   R    R&   R   R4   R:   R   Rd   R   R”   (    (    (    s0   lib/python2.7/site-packages/patsy/categorical.pyt   <module>   s"   		X(		
		9	V?