B
    yJ[^p                 @   s  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
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 d d
lmZmZ d dlT d dlmZmZm Z m!Z! d dl"m#Z# erd dl$Z$dd Z%i d dfddZ&i d dfddZ'd?ddZ(efddZ)dd Z*dd Z+dd Z,dd  Z-d!d" Z.d#d$ Z/d%d& Z0d'd( Z1d)d* Z2d+d, Z3d-d. Z4d/d0 Z5d1d2 Z6d3d4 Z7d5d6 Z8d7d8 Z9d9d: Z:d;d< Z;d=d> Z<dS )@    N)assert_raises)
PatsyError)DesignMatrix
DesignInfo)EvalEnvironment)	ModelDescTerm	INTERCEPT)C)Helmert)balancedLookupFactor)design_matrix_buildersbuild_design_matrices)*)have_pandashave_pandas_categoricalhave_pandas_categorical_dtypepandas_Categorical_from_codes)Originc       
      C   s  t ||st|jj|ks t|d k	rJt ||s8t|jj|ksbtn|d ksVt|d ksbt| r|d krt|jg|\}n6t|j|jg|\}	}t |	|st|	jj|kstt ||st|jj|kstn,|jjd kst|d ks|jjd kstd S )N)npallcloseAssertionErrordesign_infocolumn_namesr   terms)
expect_full_designslhsrhsdataexpected_rhs_valuesexpected_rhs_namesexpected_lhs_valuesexpected_lhs_namesZnew_rhsZnew_lhs r$   3lib/python3.7/site-packages/patsy/test_highlevel.pycheck_result   s&    
r&   matrixc             C   s&   d}t |tr|d7 }t| |||dS )N	dataframe   )return_type)
isinstanceintdmatrix)formula_liker   depthr*   r$   r$   r%   dmatrix_pandas:   s    
r0   c             C   s&   d}t |tr|d7 }t| |||dS )Nr(   r)   )r*   )r+   r,   	dmatrices)r.   r   r/   r*   r$   r$   r%   dmatrices_pandas@   s    
r2   c          
      s  t |tr|d7 } fdd}t | tjttf sTt | trJt | d tsTt| dr|d kr|t| ||}	d }
t	|	g \}nt
| ||}t	| \}
}t||
| |||| nttt
| | ttt| | tg}tg}tr|t |t |d krfx.|D ]&}||  |}t|d | |||| qW x|D ]2}y||  | W n tk
rX   Y nX tq.W nrx:|D ]2}y||  | W n tk
r   Y nX tqlW x4|D ],}||  |\}
}t||
| |||| qW d S )Nr)   c                  s
   t  gS )N)iterr$   )r   r$   r%   data_iter_makerL   s    zt.<locals>.data_iter_makerr   __patsy_get_model_desc__)r+   r,   sixZstring_typesr   r   tuplehasattrincr_dbuilderr   incr_dbuildersr&   r   r   r-   r1   r   appendr0   r2   r   )r.   r   r/   r   r    r!   r"   r#   r4   builderr   r   buildersZ
one_mat_fsZ
two_mat_fsfr$   )r   r%   tF   s`    














r?   c          	   C   sf   t |tr|d7 }ttg}tr*|ttg7 }x6|D ].}y|| || W n |k
rX   Y q0X tq0W d S )Nr)   )r+   r,   r-   r1   r   r0   r2   r   )r.   r   r/   excZfsr>   r$   r$   r%   	t_invalid   s    

rA   c                 s	  t dddgdddggi dddddgdddggd	d
dg t d dddgdddggfi dddddgdddggd	d
dg t tdddgdddggi dddddgdddggd	d
dg t d tdddgdddggfi dddddgdddggd	d
dg tdddgdddggdd} t | i dddddgdddggdddg t d | fi dddddgdddggdddg t ddgdddgdddggfi dddddgdddggd	d
dgdgdggdg t dgdggdddgdddggfi dddddgdddggd	d
dgdgdggdg t tddgtdddgdddggfi dddddgdddggd	d
dgdgdggdg t tdgdggtdddgdddggfi dddddgdddggd	d
dgdgdggdg tdddgdddggdd}tddgdd}t ||fi dddddgdddggdddgdgdggdg tdddgdddgdddggfi d tdddggfi d tdddggdddggdddggfi d trRt tddddgii dddgdgdggdg t tjdddgddi dddgdgdggdg t tddddgitddddgifi dddgdgdggdgdgdgdggdg t tjdddgddtjdddgddfi dddgdgdggdgdgdgdggdg t tdddggtjdddggdddgdfi dddddggdddgdddggddd g t tdddgi dddgdgdggd	g ttjdggdgd!tjdggdgd!fi d G d"d# d#t	}| }t |ddgddgddggd$dd%ddgddggd&d'gdgdggd(g G d)d* d*t	}t| i d t d+ddgddgd,dd%ddgddggd-dgdgdggdg t d.ddgddgd,dd%ddgddggd-dg t d/ddgddgd,dd%dddgdddggd-ddg t
jst td+ddgddgd,dd%ddgddggd-dgdgdggdg d0d1}t|tstttt||ddgid2 tg ttdgg}t |dd3d4d5gidd%d3gd4gd5ggdg tg tg ttdgg}t |dd3d4d5gidd%dd3gdd4gdd5ggd-dg tttdggtg ttdgg}t |d3d4d5gd6d7d8gd9dd%dd3gdd4gdd5ggd-dgd6gd7gd8ggdg g ttdggtg ttdggf}t|d:d; dd<}	t |	d |	d fdd6d7d8gidd%dd6gdd7gdd8ggd-dg t |	d dd6d7d8gidd%dd6gdd7gdd8ggd-dg t |	d |	d fdd6d7d8gidd%dd6gdd7gdd8ggd-dgd6gd7gd8ggdg dddg}
t d=i dd%ddgddgddggd-d>g t d=d>d6d7d8gidd%dd6gdd7gdd8ggd-d>g td=i dttfd? d@dA }|  td td=i  ttfd? td  fdBdC}|  d S )DNr)                  r   FZx0x1x2foo)Zdefault_column_prefixZfoo0Zfoo1Zfoo2Zy0barZbar0xasdf)namey      	   )columnsZx7Zx8Zx9Zy1Zy2)indexc               @   s   e Zd Zdd ZdS )z.test_formula_likes.<locals>.ForeignModelSourcec             S   s"   t ttdggttdggS )NYX)r   r   r   )selfr   r$   r$   r%   r5      s    zGtest_formula_likes.<locals>.ForeignModelSource.__patsy_get_model_desc__N)__name__
__module____qualname__r5   r$   r$   r$   r%   ForeignModelSource   s   rZ   )rT   rU   TzX[0]zX[1]rT   c               @   s   e Zd Zdd ZdS )z1test_formula_likes.<locals>.BadForeignModelSourcec             S   s   |S )Nr$   )rV   r   r$   r$   r%   r5      s    zJtest_formula_likes.<locals>.BadForeignModelSource.__patsy_get_model_desc__N)rW   rX   rY   r5   r$   r$   r$   r%   BadForeignModelSource   s   r[   zy ~ x)rN   rK   	Interceptz~ xzx + yu   Ã©zutf-8)r   g      ?g      @g      @
         )rK   rN   c               S   s   t ddddgigS )NrK   r)   rB   rC   )r3   r$   r$   r$   r%   <lambda>+  s    z$test_formula_likes.<locals>.<lambda>)Zeval_envz
~ x_in_envx_in_env)r@   c           	   S   s0   d} t di ddddgddgddggddg d S )	NrL   z
~ x_in_envr)   TrB   rC   r\   ra   )r?   )ra   r$   r$   r%   check_nested_callF  s    z-test_formula_likes.<locals>.check_nested_callc           	      s0   d} t di  dddgddgddggddg d S )	NrL   z
~ x_in_envTr)   rB   rC   r\   ra   )r?   )ra   )er$   r%   check_nested_call_2P  s    z/test_formula_likes.<locals>.check_nested_call_2)r?   r   asarrayr   rA   r   pandasZ	DataFrameSeriesobjectr6   ZPY3Zunicodedecoder+   r   r   r   r-   r   r   r   r   	NameErrorr   Zcapture)ZdmZx_dmZy_dmrZ   Zforeign_modelr[   ZeacuteZdescZ	termlistsr=   ra   rb   rd   r$   )rc   r%   test_formula_likes   s&   " $,0&* 



rk   c              C   s  t sd S tjdddgddddgd} tjd	d
dgddddgd}tddd}t|ddgddgddggsntt|jddgst|j	j
ddgkstt|jdddgsttddd\}}t|d	gd
gdggstt|jdgst|j	j
dgkstt|jdddgstt|ddgddgddggsBtt|jddgsZt|j	j
ddgksptt|jdddgstt| dd}t|dgdgdggstt|jdgst|j	j
dgkstt|jdddgstt|| fdd\}}t|d	gd
gdggs*tt|jdgs@t|j	j
dgksTtt|jdddgsntt|dgdgdggstt|jdgst|j	j
dgkstt|jdddgstt| dddgfdd\}}	t|j| js tt|	j| jsttdddg| fdd\}
}t|
j| jsFtt|j| js\tdd l}|jj }zDd|j_ tttdddgiddd tttddgdgdddd W d ||j_ X d S )Nr)   rB   rC   ZAAr]   r^   r_   )rM   rS   rD   rE   rF   ZBBs1r(   )r*   r\   zs2 ~ s1s2      r   FrK   zy ~ x)rK   rN   )r   rf   rg   r-   r   r   r   array_equalrR   r   r   rS   r1   patsy.highlevelZ	highlevelr   r   )rl   rm   Zdf1Zdf2Zdf3Zdf4Zdf5Zdf6Zdf7Zdf8Zdf9Zdf10patsyZ
had_pandasr$   r$   r%   test_return_pandasW  s`    "$rs   c              C   sn   t ddd} td| }|jjddddgks.t|jjddgksBtt|jjdksVt|jjd tksjtd S )	NrB   )abza:br\   zb[T.b2]za[T.a2]:b[b1]za[T.a2]:b[b2]r   )	r   r-   r   r   r   
term_nameslenr   r	   )r   r   r$   r$   r%   test_term_info  s    

rx   c              C   s  dddgdddgt jdddgt jddd	dgd
ddgtdddgtd
ddgt jd
ddgtdd} td| dddgdgdggdg td| dddgdgdggdg td| dddgdgdggdg td| ddddgddgddggddg td| dddddgdddgdddggdddg td| dddddgdddgdddggddd g td!| dddddgdddgdddggd"d#d$g td%| dddddgdddgdddggd&d'd(g d S ))Nr)   rB   rC   g      ?g       @g      @)ZdtypeTFrI   rJ   Zbaz)r)   hi)rt   ru   cdrc   r>   ghz~ 0 + ar   rt   z~ 0 + bru   z~ 0 + crz   z~ 0 + dzd[False]zd[True]z~ 0 + eze[bar]ze[baz]ze[foo]z~ 0 + fzf[1]zf[2]zf[3]z~ 0 + gzg[bar]zg[baz]zg[foo]z~ 0 + hzh[1]zh[foo]zh[(1, 'hi')])r   re   Zfloat32r
   Zarrayrh   r?   )r   r$   r$   r%   test_data_types  s2    




&
&
&
r~   c              C   s  t ddd} td| ddddgddgddgddggddg td	| ddddgddgddgddggdd
g td| ddddgddgddgddggddg td| ddddddgddddgddddgddddggddddg td| ddddddgddddgddddgddddggddddg td| ddddddgddddgddddgddddggddddg t| d t| d< td| ddddgddgddgddggddg td| ddddgddgddgddggddg td| ddddgddgddgddggddg d S )NrB   )rt   ru   z~ C(a)r   Tr)   r\   z
C(a)[T.a2]z~ C(a, levels=['a2', 'a1'])zC(a, levels=['a2', 'a1'])[T.a1]z~ C(a, Treatment(reference=-1))z#C(a, Treatment(reference=-1))[T.a1]za*bza[T.a2]zb[T.b2]za[T.a2]:b[T.b2]z0 + a:bza[a1]:b[b1]za[a2]:b[b1]za[a1]:b[b2]za[a2]:b[b2]z1 + a + a:bza[a1]:b[T.b2]za[a2]:b[T.b2]rt   za[H.a2]zC(a, Treatment)zC(a, Treatment)[T.a2])r   r?   r
   r   )r   r$   r$   r%   test_categorical  sV    $










$$r   c              C   s   dddgdddgddd	gd
} t d| dddgdgdgdgdgdggdg t d| ddddgddgdd	ggddg t d| ddddgddgddggddg d S )Nr)   rB   rC   rD   rE   rF   r]   r^   r_   )rK   rN   za b cz0 + I(x + y)r   TzI(x + y)z
Q('a b c')r\   z	center(x)r   )r?   )r   r$   r$   r%   test_builtins  s    "r   c           
      s  dddgdddgddddgddd	gdg t dddddd	g} t | t |  }|t | } fd
d}td|}t| d \}}|jjdgkst|jjdddgkstt 	|dgdgdggstt 	|t 
dddgdddg|dd  fsttd|}t|g d \}|jjdddgks6tt 	|dgdgdggsTtt 	|t 
dddgdddg|dd  fsttttd| tttd| d S )Na2r)   rB   rC   )rt   rK   a1rD   rE   rF   c                  s   t  S )N)r3   r$   )datasr$   r%   r4     s    z)test_incremental.<locals>.data_iter_makerz!1 ~ a + center(np.sin(center(x)))r\   za[T.a2]zcenter(np.sin(center(x)))r   z~ a + center(np.sin(center(x)))zx ~ xrK   )r   re   sinZmeanr:   r   r   r   r   r   Zcolumn_stackr9   r   r   )rK   Zsin_center_xZx_colr4   r=   r   r   r<   r$   )r   r%   test_incremental  s>    r   c               C   sH   t dddddgidddtdgdtdgdtdggdd	g d S )
Nz~ np.sin(x)rK   r)   rB   rC   r   Tr\   z	np.sin(x))r?   r   r   r$   r$   r$   r%   test_env_transform  s    &r   c           
      s   t ddd tddd d<  d d  d<  fdd	} | d
dddddg | ddddddg | ddddddg | dddddg | dddddddg | dddddddddg d S )NrB   )rt   ru   r   r)   rD   rG   rH   c                s   t |  }|jj|kstd S )N)r-   r   rv   r   )formulaorderm)r   r$   r%   t_terms3  s    
z test_term_order.<locals>.t_termsza + b + x1 + x2r\   rt   ru   zb + a + x2 + x1z0 + x1 + a + x2 + b + 1z0 + a:b + a + b + 1za:bza + a:x1 + x2 + x1 + bza:x1z@0 + a:x1:x2 + a + x2:x1:b + x2 + x1 + a:x1 + x1:x2 + x1:a:x2:a:bzx1:x2za:x1:x2zx2:x1:bz	x1:a:x2:b)r   r   Zlinspace)r   r$   )r   r%   test_term_order.  s     r   c             C   sH   ddd}t d|d}| r0t|dggsDtnt|dggsDtd S )NrE   rB   )rK   rN   z0 + I(x / y)r)   g      @)r-   r   r   r   )Zexpect_true_divisionr   r   r$   r$   r%   _check_divisionD  s
    
r   c               C   s(   t j tjk rd S td td d S )NFz6from __future__ import division
_check_division(True)
)
__future__ZdivisionZgetMandatoryReleasesysversion_infor   execr$   r$   r$   r%   test_futureO  s    r   c              C   s   ddgddgddggddgddggd} t d| d	d
dddddddddg	dddddddddg	gdddddddddg	 t d| d	d
ddd	dd	ddgdd	dd	dddggdddddddg d S )Nr   r   r)   rB   rC   rD   )rt   rU   rT   zX*Yr   TrF   rP   ro      r\   zX[0]zX[1]zY[0]zY[1]z	X[0]:Y[0]z	X[1]:Y[0]z	X[0]:Y[1]z	X[1]:Y[1]za:X + Yz
a[a1]:X[0]z
a[a2]:X[0]z
a[a1]:X[1]z
a[a2]:X[1])r?   )r   r$   r$   r%   test_multicolumnY  s     
r   c              C   s   dddg} dddg}t tdddgddgddggs:ttd\}}t |dgdgdggsbtt |ddgddgddggstd S )	Nr)   rB   rC   rD   rE   rF   rK   zy ~ x)r   r   r-   r   r1   )rK   rN   r   r   r$   r$   r%   test_dmatrix_dmatrices_no_datam  s    

&r   c              C   sP   t ddddgdddgdd	d
gd\} }| j dks:t|j dksLtd S )Nz	y ~ x + ar)   rB   rC   rD   rE   rF   r   r   Za3)rN   rK   rt   rN   z	1 + a + x)r1   r   Zdescriber   )r   r   r$   r$   r%   test_designinfo_describeu  s
    r   c           
   C   s   dd } d}y t |dddgddd	gd
 W n> tk
rj } z |jt|d|dksZtW d d }~X Y n
X dsttyt ddi i W nd tk
r } zFtjd dkrt	|tst|jtdddkstnt	|t
stW d d }~X Y n
X dstd S )Nc             S   s   t dd S )NZWHEEEEEE)r   )rK   r$   r$   r%   raise_patsy_error  s    z2test_evalfactor_reraise.<locals>.raise_patsy_errorzraise_patsy_error(X) + Yr)   rB   rC   rD   rE   rF   )rU   rT   r    Fz1 + x[1]rK   rP   )r-   r   originr   rS   r   	Exceptionr   r   r+   KeyError)r   r   rc   r$   r$   r%   test_evalfactor_reraise|  s     . r   c           	   C   s  dddt jgt jdddgd} dg}tr2|d	 x|D ]}td
| |d}t |dddgdddggsnt|d	kr|jt	
ddgsttttd
| |dd td| |d\}}t |dgdggstt |ddgddggst|d	kr,|jt	
ddgst|jt	
ddgs,ttttd| |dd td| |d\}}t |dgdgdggsptt |dgdgdggst|d	kr|jt	
dddgst|jt	
dddgsttttd| |dd q:W d S )Nr)   rB   rC   r^   r_   (   )rK   rN   r'   r(   zx + y)r   r*   raise)r   r*   Z	NA_actionzy ~ xzy ~ 1)r   nanr   r;   r-   rp   r   rS   Zequalsrf   ZIndexr   r   r1   )r   Zreturn_typesr*   matZlmatZrmatr$   r$   r%   test_dmatrix_NA_action  s>    



r   c              C   s   dddd} xddddggfddddggfgD ]\}}t || }t||sPttt|jg| d |snttr.t| }tt |||sttt|jg|d |s.tq.W d S )	Ng?g333333?r   )rG   rH   rt   zx1 + x2r)   zC(a, levels=('a1', 'a2')) + x1r   )	r-   r   r   r   r   r   r   rf   rg   )Zdata_0dr   Zexpectedr   Zdata_seriesr$   r$   r%   test_0d_data  s    


r   c              C   s>   dddg} t di }dddg} t |ji }t||s:td S )Nr)   rB   rC   ra   r]   r^   r_   )r-   r   r   r   r   )ra   Zdesign_matrixZdesign_matrix2r$   r$   r%   test_env_not_saved_in_builder  s
    


r   c              C   s   t sd S tdddgddgg} tr6| t| d  x| D ]}d|i}ttd|ddgddgddggspt	ttd|ddgddgddggst	ttd|ddgddgddggst	ttd|ddgddgddggs<t	q<W d S )	Nr)   r   ru   rt   objzC(obj)zC(obj, levels=['b', 'a'])zC(obj, levels=['a', 'b']))
r   r   r   r;   rf   rg   r   r   r-   r   )Zobjsr   r{   r$   r$   r%   test_C_and_pandas_categorical  s.    
r   )NN)=r   r   r6   Znumpyr   Z
nose.toolsr   rr   r   Zpatsy.design_infor   r   Z
patsy.evalr   Z
patsy.descr   r   r	   Zpatsy.categoricalr
   Zpatsy.contrastsr   Zpatsy.user_utilr   r   Zpatsy.buildr   r   rq   Z
patsy.utilr   r   r   r   Zpatsy.originr   rf   r&   r0   r2   r?   rA   rk   rs   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   sT   	
< D7	4(
'	