U
    ½mœdRJ  ã                   @   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
rpddlZG dd	„ d	eƒZdd
d „Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdd„ Zddd„Zdd„ ZdS )ÚCÚguess_categoricalÚCategoricalSnifferÚcategorical_to_inté    N)Ú
PatsyError)ÚSortAnythingKeyÚsafe_scalar_isnanÚiterableÚhave_pandasÚhave_pandas_categoricalÚhave_pandas_categorical_dtypeÚsafe_is_pandas_categoricalÚpandas_Categorical_from_codesÚpandas_Categorical_categoriesÚpandas_Categorical_codesÚsafe_issubdtypeÚno_picklingÚassert_no_picklingc                   @   s   e Zd Zdd„ ZeZdS )Ú_CategoricalBoxc                 C   s   || _ || _|| _d S ©N©ÚdataÚcontrastÚlevels)Úselfr   r   r   © r   úJ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/patsy/categorical.pyÚ__init__9   s    z_CategoricalBox.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__getstate__r   r   r   r   r   8   s   r   c                 C   s8   t | tƒr,|dkr| j}|dkr&| j}| j} t| ||ƒS )a/  
    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)Ú
isinstancer   r   r   r   r   r   r   r   r   @   s     
c                  C   sì   t dƒ} t| tƒst‚| jdks$t‚| jd ks2t‚| jd ks@t‚t dddƒ}|jdksZt‚|jdksht‚|jdksvt‚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sàt‚t|ƒ d S )NZasdfZDATAÚCONTRASTZLEVELSz
NEW LEVELS©r   zNEW CONTRAST)r   r"   r   ÚAssertionErrorr   r   r   r   )Úc1Úc2Úc3Zc4r   r   r   Útest_Ch   s$    
r)   c                 C   s:   t | ƒrdS t| tƒrdS t | ¡} t| jtjƒr6dS dS )NTF)r   r"   r   ÚnpÚasarrayr   ÚdtypeÚnumber©r   r   r   r   r   }   s    

c                  C   sæ   t r6t dddg¡} t| ƒs t‚tr6tt | ¡ƒs6t‚ttdddgƒƒsLt‚tddgƒs\t‚tddgƒslt‚tddtj	gƒs€t‚tddd gƒs’t‚tdddgƒr¤t‚tdddtj	gƒrºt‚tdd	d
gƒrÌt‚tdd	d
tj	gƒrât‚d S )Né   é   é   TFÚaÚbg      ð?g       @g      @)
r   ÚpandasÚCategoricalr   r%   r   ÚSeriesr   r*   Únan)Úcr   r   r   Útest_guess_categorical‡   s    r9   c                 C   s@   t | dƒr| jdkrtdƒ‚t| ƒr6t| tjtjfƒr<| g} | S )NÚndimr/   z)categorical data cannot be >1-dimensional)Úhasattrr:   r   r	   r"   ÚsixÚ	text_typeÚbinary_typer.   r   r   r   Ú_categorical_shape_fix—   s    ÿr?   c                   @   s*   e Zd Zddd„Zdd„ Zdd„ ZeZdS )	r   Nc                 C   s$   || _ || _d | _d | _tƒ | _d S r   )Ú
_NA_actionÚ_originÚ	_contrastÚ_levelsÚsetÚ
_level_set)r   Ú	NA_actionÚoriginr   r   r   r   ¦   s
    zCategoricalSniffer.__init__c                 C   s6   | j d kr&t| jƒ}|jtd� || _ t| j ƒ| jfS )N)Úkey)rC   ÚlistrE   Úsortr   ÚtuplerB   )r   r   r   r   r   Úlevels_contrast­   s
    

z"CategoricalSniffer.levels_contrastc              	   C   s  t |dƒr|j| _t|tƒr<|jd k	r6t|jƒ| _dS |j}t	|ƒrVtt
|ƒƒ| _dS t |dƒr€t|jtjƒr€tddgƒ| _dS t|ƒ}|D ]f}| j |¡ržqŒ|dks®|dkrÀ| j ddg¡ qŒz| j |¡ W qŒ tk
rð   td| jƒ‚Y qŒX qŒ| jtddgƒkS )Nr   Tr,   Fú?Error interpreting categorical data: all items must be hashable)r;   r   rB   r"   r   r   rK   rC   r   r   r   r   r,   r*   Úbool_rD   rE   r?   r@   Úis_categorical_NAÚupdateÚaddÚ	TypeErrorr   rA   )r   r   Úvaluer   r   r   Úsniff´   s4    


þzCategoricalSniffer.sniff)N)r   r   r    r   rL   rT   r   r!   r   r   r   r   r   ¥   s   
(c               	      sò  ddl m‰  d+‡ fdd„	} trØdd„ tg}tr@|tjdd„ g7 }|D ]’}| g |t dd	d g¡ƒgd
dƒ | g |tddgddgƒƒgd
dƒ | g |tddgddgƒƒgd
dƒ |t ddg¡ƒ}d|_	| g |gd
ddƒ qD| g tdd	gƒtdd	gƒgddƒ | g tdd	gdd	dgd�tdd	gƒgd
dƒ | g tdd	gdd	dgd�tdd	gƒgd
dƒ | ddgtdt
jgƒtdd gƒgddƒ tˆ dgd�ƒ}| tdt
jd gƒ¡ | ¡ \}}t|ƒtd dgƒk�sÆt‚| ddgtd
t
jd gƒgd
dƒ | g tddgƒtdgƒtddgƒgdd ƒ | g t
 d
dg¡d!ggd
dƒ | ddgtd"d d#t
jd$gƒgdd%ƒ | g tddgd&d'�gdd(d&ƒ | g ddgdggdd)ƒ | g ddgdggddƒ | g dgdd*ƒ dd l}tˆ ƒ ƒ}| t|ji g¡ | t|jt
 dgg¡¡ d S ),Nr   ©ÚNAActionc                    sT   t ˆ | d�ƒ}|D ](}| |¡}|r2|s,t‚ q<q|rt‚q| ¡ ||fksPt‚d S )N©ÚNA_types)r   rT   r%   rL   )rX   ZdatasZexp_finish_fastZ
exp_levelsZexp_contrastÚsnifferr   ÚdonerU   r   r   Útà   s    

z"test_CategoricalSniffer.<locals>.tc                 S   s   | S r   r   ©Úxr   r   r   Ú<lambda>ï   ó    z)test_CategoricalSniffer.<locals>.<lambda>c                 S   s   t t | ¡ƒS r   )r   r4   r6   r\   r   r   r   r^   ó   r_   r/   r0   T)r/   r0   r2   r3   ©r2   r3   ©r3   r2   r#   r1   F)r/   r0   r1   r$   é   )r1   r0   r/   ÚNoneÚNaNé
   )r/   re   rW   ©FTé   é   é(   )FTre   rg   rh   ri   Zfoo©r3   r0   ©r2   r/   ©r8   N)rk   rj   rl   ZFOO)r   )re   rg   )re   rg   rh   )r3   )N)Úpatsy.missingrV   r   r   r   r4   r6   r5   r   r   r*   r7   r   rT   rL   rD   r%   r+   ÚpytestÚraisesr   )r[   ZprepsÚprepÚobjrY   r   Ú_rn   r   rU   r   Útest_CategoricalSnifferÞ   sz    ÿÿ ÿ ÿ ÿ",,  ÿ ÿ" ÿ ÿ ÿ
rs   c              
   C   sL  t |tƒst‚t| ƒrDtt| ƒƒ}||ks<td||f |ƒ‚t| ƒS t | tƒr„| jd k	r~t| jƒ|kr~td|t| jƒf |ƒ‚| j	} t
| ƒ} ztt|tt|ƒƒƒƒ}W n tk
rÄ   td|ƒ‚Y nX t| dƒ�r
t| jtjƒ�r
|d dk�r
|d dk�r
|  tj¡S tjt| ƒtd�}t| ƒD ]þ\}}| |¡�rBd	||< nÞz|| ||< W nÌ tk
�rú   d
}	g }
t|ƒ|	k�rŽ|
dd„ |D ƒ7 }
nH|
dd„ |d |	d … D ƒ7 }
|
 d¡ |
dd„ ||	 d d … D ƒ7 }
dd |
¡ }td||f |ƒ‚Y n& tk
�r   td|f |ƒ‚Y nX �q$t�rHt | tj ƒ�rHtj || j!d�}|S )Nz'mismatching levels: expected %r, got %rrM   r,   Fr   Tr/   ©r,   éÿÿÿÿrb   c                 S   s   g | ]}t |ƒ‘qS r   ©Úrepr©Ú.0Úlevelr   r   r   Ú
<listcomp>_  s     z&categorical_to_int.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   rv   rx   r   r   r   r{   a  s   ÿr0   z...c                 S   s   g | ]}t |ƒ‘qS r   rv   rx   r   r   r   r{   d  s   ÿz[%s]z, zxError converting data to categorical: observation with value %r does not match any of the expected levels (expected: %s)zEError converting data to categorical: encountered unhashable value %r©Úindex)"r"   rK   r%   r   r   r   r   r   r   r   r?   ÚdictÚzipÚrangeÚlenrR   r;   r   r,   r*   rN   ZastypeÚint_ÚemptyÚintÚ	enumeraterO   ÚKeyErrorÚappendÚjoinr
   r4   r6   r}   )r   r   rF   rG   Zdata_levels_tupleZlevel_to_intÚoutÚirS   ZSHOW_LEVELSZ
level_strsZ	level_strr   r   r   r   4  sz    ÿÿ
ÿÿÿ

ÿ
ÿýýþþc               	   C   s:  dd l } ddlm} tr�tjdddgdddgd	�}t|d
|ƒ ƒ}t |dddgk¡sXt	‚t |j
dddgk¡srt	‚|  ttt d|i¡d
|ƒ ¡ t�rltg}tr²dd„ }| |¡ |D ]´}|dddgdƒ}t|d|ƒ ƒ}t |dddgk¡sðt	‚|dddgdƒ}	t|d|dgd�ƒ}
t |
dddgk¡�s.t	‚|  tt|ddgdƒd|ƒ ¡ |  tt|ddgdƒd|ƒ ¡ q¶|ƒ fdd„}|dddgddddgƒ |t dddg¡ddddgƒ |tjdddgtd�ddddgƒ |dddgddddgƒ |t dddg¡ddddgƒ |tjdddgtd�ddddgƒ |tjdddgtd�ddddgƒ |dddgddddgƒ |dddgddddgƒ |  ttdddgd|ƒ ¡ |tdddgƒddddgƒ |tdddgƒddddgƒ |tdddgddgd�ddddgƒ |  tttdddgddgd�d|ƒ ¡ |dddgƒ |dddgƒ |d d!dgƒ |  ttt 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"gd�ƒ |dd tjdgd#ddddg|dd"gd�ƒ |dd tjdgd#ddddg|d"gd�ƒ |  ttddd$gd%|ƒ ¡ d S )&Nr   rU   r2   r3   r8   re   rg   rh   r|   )r2   r3   r8   r/   r0   c                 S   s   t | |ƒ}t |¡S r   )r   r4   r6   )ÚcodesÚ
categoriesr8   r   r   r   ÚSeries_from_codes‚  s    
z2test_categorical_to_int.<locals>.Series_from_codesru   r`   )r2   rc   rc   rW   )r2   r8   ra   c                 S   s    t | ||ƒ}t ||¡st‚d S r   )r   r*   Zarray_equalr%   )r   r   ÚexpectedrF   Úgotr   r   r   r[   ›  s    z"test_categorical_to_int.<locals>.trt   )r/   r0   r   )r2   ÚdÚzr3   r1   rk   ©r3   r   )rk   r’   r$   Trf   rd   )r2   r3   NÚq)r2   r3   r8   r�   ÚeÚfÚgÚh)rn   rm   rV   r
   r4   r6   r   r*   Úallr%   r}   ro   r   Z	DataFramer   r   r   r‡   r+   ÚobjectÚfloatr   r7   )rn   rV   ÚsZc_pandasÚconstructorsr�   ÚconÚcatÚconvÚcat2Zconv2r[   r   r   r   Útest_categorical_to_ints  s¼      þ

ÿüü"""  ÿ$ þ þ  ÿ  ÿÿÿ
ÿýr¡   )NN)N) Ú__all__Únumpyr*   r<   Zpatsyr   Z
patsy.utilr   r   r	   r
   r   r   r   r   r   r   r   r   r   r4   r™   r   r   r)   r   r9   r?   r   rs   r   r¡   r   r   r   r   Ú<module>   s$   ÿ<
(
9V
?