B
    yJ[ty                 @   sN  d dl m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mZ d dlmZmZ d dlT d dlmZ d d	lmZmZ d d
lmZmZ erd dlZdd Zdd Zdd Zd6ddZd7ddZdd Zdd Z dd Z!de!_"dd Z#dd Z$d d! Z%d"d# Z&d$d% Z'd&d' Z(d(d) Z)d*d+ Z*d,d- Z+d.d/ Z,d0d1 Z-d2d3 Z.d4d5 Z/dS )8    )print_functionN)assert_raises)
PatsyError)atleast_2d_column_defaulthave_pandashave_pandas_categorical)Term	INTERCEPT)*)C)balancedLookupFactor)DesignMatrix
DesignInfoc             C   sP   t | } | jd dkrdS tj| \}}}t|dk}|| jd ksLtd S )N   r   Tg|=)r   shapenpZlinalgZsvdsumAssertionError)musvZrank r   /lib/python3.7/site-packages/patsy/test_build.pyassert_full_rank   s    r   c               C   s   t td t ddgddgddgddgg ttt ddgddgg ttt ddgddgg ttt dddgdddgg ttt dddgddd	gdd	d
gg d S )N
   r   r            d            )r   r   Zeyer   r   r   r   r   r   test_assert_full_rank#   s     r$   c              G   s.   g }x$| D ]}| tdd |D  q
W |S )Nc             S   s   g | ]}t |qS r   )r   ).0namer   r   r   
<listcomp>3   s    z!make_termlist.<locals>.<listcomp>)appendr   )entriestermsentryr   r   r   make_termlist0   s    
r,   c             C   s\   t |  t| jjt|ks t|d k	r8| jj|ks8t| jdksFt| jd |ksXtd S )Nr   r   )r   setdesign_infor*   r   column_namesndimr   )Zmmexpected_ranktermlistr/   r   r   r   check_design_matrix6   s    r3   c       	         s   t | } fdd}t|g|dd}t| }|d }|d j|jjksLt|d j|jjksbt|j|d ksttt||||d |S )Nc               3   s
    V  d S )Nr   r   )datar   r   
iter_maker@   s    zmake_matrix.<locals>.iter_makerr   )eval_env)r/   )r,   design_matrix_buildersbuild_design_matricesZterm_slicesr.   r   r/   r3   )	r4   r1   r)   r/   r2   r5   Zdesign_infosZmatricesmatrixr   )r4   r   make_matrix>   s    
r:   c              C   s  t ddd} tddt| d  }| d< | d d  }| d< t| ddggdd	gd
}t|ddgddgddgddggs~tt| dg dggddgd
}t|ddgddgddgddggstt| dddggddddgd
}t|ddddgddddgddddgddddggstt| dg dgdgddggddddgd
}t|ddddgddddgddddgddddggsztt| dg dgdgddggddddgd
}t|ddddgddddgddddgddddggstt| ddgdgddggdd	ddgd
}t|dd|d dgdd|d dgdd|d |d gdd|d |d ggsTtt| ddgdgddggdddgd
}t|t|||| fstd S )Nr   )abr   r   r;   x1x2za[a1]za[a2])r/   	Interceptza[T.a2]r   r<   za[a1]:b[b1]za[a2]:b[b1]za[a1]:b[b2]za[a2]:b[b2]zb[T.b2]za[T.a2]:b[T.b2]zb[T.b2]:a[T.a2]z
a[T.a2]:x1r   zx2:x1)r   r   linspacelenr:   allcloser   Zcolumn_stack)r4   r=   r>   r   r   r   r   test_simpleN   sJ    ((





rC   c              C   sp   t dddd} tddt| d | d< t| dg ddgg t| d	ddgddgg t| d	dd
gddgg d S )Nr   )r;   r<   cr   r   r;   xr   r<   r"   rD   )r   r   r@   rA   r:   )r4   r   r   r   test_R_bugs|   s
    rF   c                 s  t dddd} tddt| d | d< | d d | d<  fd	d
 t d}t |}tt| ddgddgddgddgddgg}d}dd l}| }x|D ]}t|}x|D ]\}	}
|	|kr|
|krP qW t }xR|D ]J}tdd |D }dd |D }x$ |D ]}|	t
||  qW qW t|}|dkrRttt| || nt| || |d7 }|d dkrtd| qW td| | f  d S )Nr   r!   )r;   r<   repeatr   r   r;   r=   r>   c             3   sV   | st  V  nD| d }x: | dd  D ]&}t t|V  t t|f| V  q(W d S )Nr   r   )tuplesorted)lobjsubset)all_subsetsr   r   rM      s    
z/test_redundancy_thoroughly.<locals>.all_subsets)r;   r<   r=   r>   )r<   )r;   )r>   )r=   )r<   r>   )r;   r=   )r;   r<   r>   )r;   r<   r=   )r<   r=   r>   )r;   r=   r>   c             S   s   g | ]}| d r|qS )rE   )
startswith)r%   tr   r   r   r'      s    z.test_redundancy_thoroughly.<locals>.<listcomp>c             S   s   g | ]}| d s|qS )rE   )rN   )r%   rO   r   r   r   r'      s    )r   )r   r    z
Completed:zTook %0.2f seconds)r   r   r@   rA   listprinttimer-   rH   add	frozensetr   r   r:   )r4   	all_termsZall_termlist_templatesZ	redundantcountrR   startZtermlist_templateZtermlist_setZdispreferredZ	preferredZexpanded_termsZterm_templateZnumericrestZsubset_restr1   r   )rM   r   test_redundancy_thoroughly   sH    	



rY   r   c              C   s  ddddgddddgd} t | }dd	 |d
 D |d
< ddddgddddgd}t | }dd	 |d
 D |d
< tjtt| d
 | d ddtfgd}tjtt| d
 | d ddtfgd}|tj}|tj}| ||||g}trt	
|}|| t	
|}	||	 xj|D ]b}
t|
dd
gd
dggddddgd}t|ddddgddddgddddgddddggstqW d S )Na1a2r   r   r   r   )r;   rE   c             S   s   g | ]}| d qS )ascii)encode)r%   r   r   r   r   r'      s    z#test_data_types.<locals>.<listcomp>r;   c             S   s   g | ]}t |qS r   )six	text_type)r%   r   r   r   r   r'      s    rE   )r;   ZS2)dtype)r;   ZU2za[a1]za[a2]za[a1]:xza[a2]:x)r/   r   )dictr   ZarrayrP   zipintZviewZrecarrayr   pandas	DataFramer(   r:   rB   r   )Z
basic_dictZbasic_dict_bytesZbasic_dict_unicodeZstructured_array_bytesZstructured_array_unicodeZrecarray_bytesZrecarray_unicodedatasZdf_bytesZ
df_unicoder4   r   r   r   r   test_data_types   s<    










rg   c                 s   ddddgi  fdd} t tdg| dd }t|g d }|jttjksVtt|g tjdd }|jttjkstttd	rt|g tj	dd }|jttj	kstd S )
NrE   r   r   r   c               3   s
    V  d S )Nr   r   )r4   r   r   r5      s    z4test_build_design_matrices_dtype.<locals>.iter_makerr   )r`   float128)
r7   r,   r8   r`   r   Zfloat64r   Zfloat32hasattrrh   )r5   buildermatr   )r4   r    test_build_design_matrices_dtype   s    
rl   c                 sj   ddddgi  fdd} t tdg| dd }t|g dd	d }t|tsRtttt|g d
d	 d S )NrE   r   r   r   c               3   s
    V  d S )Nr   r   )r4   r   r   r5      s    z$test_return_type.<locals>.iter_makerr   r9   )return_typeZasdfsadf)r7   r,   r8   
isinstancer   r   r   r   )r5   rj   rk   r   )r4   r   test_return_type   s    ro   c           	      s  dddgdddgd  fdd} t td	d
g| dd }t|gdtjdgtjddd gtddd }|jdksvtt	|dddggstt|gdtjdgtjddd gtddddd }|jdkstt	|dddggstddl
m} |g d}t|gdtjgtjddgtdd|dd }|jdks:ttj|dddgddtjgg ttt|gdtjdgtjddd gtdddd d S )Nr   r   r   c1c2)rE   rD   c               3   s
    V  d S )Nr   r   )initial_datar   r   r5     s    z"test_NA_action.<locals>.iter_makerrE   rD   r   g      $@g      4@)r`   )r   r   g      ?g        drop)	NA_action)NAAction)ZNA_types)r   r   raise)r7   r,   r8   r   nanasarrayobjectr   r   array_equalZpatsy.missingru   ZtestingZassert_array_equalr   r   )r5   rj   rk   ru   rt   r   )rr   r   test_NA_action
  s@    





 

r{   c                 s   dt jdgdddgd  fdd} ttd	d
g| dd }|jdddd	gksRtt|g \}|jdksntt |ddddgddddggstd S )Ng      ?g      @rp   rq   Zc3)rE   rD   c               3   s
    V  d S )Nr   r   )r4   r   r   r5   ;  s    z1test_NA_drop_preserves_levels.<locals>.iter_makerrE   rD   r   zc[c1]zc[c2]zc[c3])r   r   g        )	r   rw   r7   r,   r/   r   r8   r   rz   )r5   r.   rk   r   )r4   r   test_NA_drop_preserves_levels7  s    r|   c           	      s  t sd S tjdddgdddgdddgd	d
ddgd  fdd} ttg g| d\}ttdtdg| dd\}}ttddg| dd\}ttddg| dd\}ttt|g d  d d d d d ttt||g d  d d d d d G dd dtj}ttt|g|  t|g d dddgd\}t	|ddgddgddggs^t
t||g dd\}}	t|tjst
t|	tjst
t|dgdgdggst
t|	dgdgdggst
t|jd
ddgst
t|	jd
ddgst
t|jdgst
t|	jdgs4t
|jjdgksHt
|	jjdgks\t
|jjdgkspt
|	jjdgkst
t||gdd d!g d d"dd\}}	t|tjst
t|	tjst
t|dgd gd!ggst
t|	dgdgdggs
t
t|jd
ddgs$t
t|	jd
ddgs>t
t|jdgsTt
t|	jdgsjt
|jjdgks~t
|	jjdgkst
|jjdgkst
|	jjdgkst
t|gdd#d$g d ddd\}
t|
tjst
t|
dddgddd#gddd$ggst
t|
jd
ddgs2t
t|gdd d!gd
d%d&gd"dd\}t|tjsht
t|d
dgd%d gd&d!ggst
t|jdddgst
t|g dd\}t|tjst
t|dgdgdggst
|jtd
ddgst
dd l}|jj }z*d'|j_ ttt|gddddgidd W d ||j_ X t|gd(tjd)gtjd ddgtd*dd+dd,\}	|	jtdgst
d S )-Nr   r   r   r   r!   r"   rZ   r[   )rE   yr;   r         )indexc               3   s
    V  d S )Nr   r   )r4   r   r   r5   O  s    z+test_return_type_pandas.<locals>.iter_makerr   r}   rE   )r6   r;   )rE   r;   )rE   r}   c               @   s   e Zd Zdd ZdS )z2test_return_type_pandas.<locals>.CheatingDataFramec             S   s2   |dkr t j| |d d d S t j| |S d S )NrE   r   )rd   re   __getitem__)selfkeyr   r   r   r   j  s    z>test_return_type_pandas.<locals>.CheatingDataFrame.__getitem__N)__name__
__module____qualname__r   r   r   r   r   CheatingDataFramei  s   r   (   2   <   Z	dataframe)rm   r#      	   )r}   rE         Fg      ?g      @)r`   rs   )rt   rm   )r   rd   re   r7   r,   r   r   r8   r   rB   r   rn   rz   r   columnsr.   r/   Z
term_namesZequalsZIndexpatsy.buildZbuildrw   rx   ry   )r5   Zint_builderZ	y_builderZ	x_builderZx_a_builderZx_y_builderr   rk   Zy_dfZx_dfZx_a_dfZx_y_dfZint_dfpatsyZ
had_pandasr   )r4   r   test_return_type_pandasG  s    

"
$

*
$




r   c                 s  dddgdddgft dddgdddgd	t dddgdddgd	fdgdgdggddgddgddggfdddgdddgdddggddgddgddggfg} dddgdddgfdddgt dddgfdddgt dddgfdddgdddgfg}dddgddd
gfg}tdg  fdd} fdd}x:| D ]2\}}||| ||| ||| ||| q*W x&|D ]\}}||| ||| qfW x&|D ]\}}||| ||| qW tttdddgddddgdddgdgg d S )Nr   r   r   TFr;   r<   rD   )ZlevelsdrE   c                sZ    fdd}y.t g|d}t|d i t|di W n tk
rP   Y nX td S )Nc               3   s   d iV  diV  d S )NrE   r   r   )data1data2r   r   r5     s    
z=test_data_mismatch.<locals>.t_incremental.<locals>.iter_makerr   rE   )r7   r8   r   r   )r   r   r5   builders)r2   )r   r   r   t_incremental  s    z)test_data_mismatch.<locals>.t_incrementalc                s0    fdd}t g|d}ttt|d|i d S )Nc               3   s   d iV  d S )NrE   r   r   )r   r   r   r5     s    z?test_data_mismatch.<locals>.t_setup_predict.<locals>.iter_makerr   rE   )r7   r   r   r8   )r   r   r5   r   )r2   )r   r   t_setup_predict  s    z+test_data_mismatch.<locals>.t_setup_predictr   )rE   r}   r}   )r   r,   r   r   r:   )Ztest_cases_twowayZtest_cases_onewayZsetup_predict_onlyr   r   r;   r<   r   )r2   r   test_data_mismatch  s6    $4





r   c        	         s  ddddgi  fdd} t t g| dd }ttt|g  t tg g| ddd }ttt|g  ttt||g  trt||gt \}}t	|dgdgdggst
|jd	kst
tdg}t |t g| dd}t| \}}t	|dgdgdggst
|jd	kst
t |tg g| dd}t| \}}t| \}}t	|dgdgdggsht
t	|dgdgdggst
d S )
NrE   r   r   r   c               3   s
    V  d S )Nr   r   )r4   r   r   r5      s    z1test_data_independent_builder.<locals>.iter_makerr   )r6   )r   r   )r7   r,   r   r   r8   r   rd   re   r   rB   r   r   )	r5   Znull_builderZintercept_builderZint_mZnull_mZ
x_termlistr   Zx_mZintercept_mr   )r4   r   test_data_independent_builder  s>    


r   c                 s   dddgdddgd  fdd} t d	g}t d	d
g}t||g| dd}t| \}}t|d|d	gd t|dgdgdggstt|d|ddgd t|ddgddgddggstd S )Nr   r   r   rZ   r[   )rE   r;   c               3   s
    V  d S )Nr   r   )r4   r   r   r5   1  s    z4test_same_factor_in_two_matrices.<locals>.iter_makerrE   r;   r   )r6   )r/   zx:a[a1]zx:a[a2])r,   r7   r8   r3   r   rB   r   )r5   Zt1Zt2r   Zm1Zm2r   )r4   r    test_same_factor_in_two_matrices/  s    
r   c                 s4   ddddgi  fdd} t tttdg| d d S )NrE   r   r   r   c               3   s
    V  d S )Nr   r   )r4   r   r   r5   >  s    z.test_eval_env_type_builder.<locals>.iter_makerZfoo)r   	TypeErrorr7   r,   )r5   r   )r4   r   test_eval_env_type_builder<  s    r   c              C   s|   ddddgi} dt dddgi}| |g}trJdtdddgi}|| dd }x$|D ]}x|D ]}||| qbW qXW d S )Nr;   rZ   r[   c                s0    fdd}t tdgg|dd}t|| d S )Nc               3   s
    V  d S )Nr   r   )r   r   r   r5   J  s    z/test_categorical.<locals>.t.<locals>.iter_makerr;   r   )r6   )r7   r,   r8   )r   r   r5   r   r   )r   r   rO   I  s
    ztest_categorical.<locals>.t)r   r   rd   ZCategoricalr(   )Zdata_stringsZ
data_categrf   Zdata_pandasrO   r   r   r   r   r   test_categoricalB  s    


r   c           
   C   s  ddl m} m} ddddg}tdt|iddggdd	d
gd}t|dddgdddgdddgdddggsntxf|| fD ]X}tdt||iddggdddgd}t|dddgdddgdddgdddggsztqzW tdt||ddiddggdddgd}t|dddgdddgdddgdddggs2ttdt|idg dggdddgd}t|dddgdddgdddgdddggstxl|| fD ]^}tdt||idg dggdddgd}t|dddgdddgdddgdddggstqW tdt||ddidg dggdddgd}t|dddgdddgdddgdddggsTttdt|ddgddgddggiddggddgd}t|ddgddgddgddggsttdt|| ddgddgddggddgiddggdd gd}t|ddgddgddgddggstd S )!Nr   )ContrastMatrixSumrZ   Za3r[   r;   r   za[a1]za[a2]za[a3])r/   r   za[mean]za[S.a1]za[S.a2]r   )Zomitza[S.a3]r?   za[T.a2]za[T.a3]r#   r   r      r   z
a[custom0]z
a[custom1]z[foo]z[bar]za[foo]za[bar])Zpatsy.contrastsr   r   r:   r   r   rB   r   )r   r   valuesr   r   r   r   r   test_contrastT  sv    r   c                 s  ddgddgddggddgd	t d
dd} fdd}t| g|dd  t gd  fdd}|dd
ddgtd  |d
ddgd
ddgtd  tjs|td
tdtdgd
ddgtd  || d
ddgtd  || d d| d gd
ddgtd  |dd
dgddg |d
dgd
dgddg tjsX|td
tdgd
dgddg || d | d gd
dgddg || d dgd
dgddg |dd
dgddg |dd
gd
dgddg |tdtd
gd
dgddg || d | d gd
dgddg || d d
gd
dgddg |ddgddg |dgdgddg |tdgdgddg || d gdgddg tt	 j
d tt j
d tt j
dg tt j
tdgg tdddg}|
ddg}|jddgkst|jd kstd S )Nr   r   g@g	@gffffff@g@r!   r"   )rE   r}   zrE   r}   r   c               3   s
    V  d S )Nr   r   )all_datar   r   r5     s    z*test_DesignInfo_subset.<locals>.iter_makerr   c                s~     | }i }x|D ]}| ||< qW t|g|d }d d |f }t| tjsjt| t|jksjtt	||sztd S )Nr   )
rL   r8   rn   r^   Zstring_typesrA   r*   r   r   rz   )Zwhich_termsZ	variablesr   Zsub_design_infoZsub_dataZvariableZ
sub_matrixZsub_full_matrix)all_builderr   full_matrixr   r   rO     s    

z!test_DesignInfo_subset.<locals>.tz~ 0 + x + y + zz~ 0 + x + zr   z~ 0 + z + xz~ 0 + yza ~ az~ asdfZasdfr;   r<   rD   )r,   r7   r8   slicer^   ZPY3Zunicoder_   r   r   rL   KeyErrorr   r   r/   r   r*   )rU   r5   rO   Zmin_diZmin_di_subsetr   )r   r   r   r   test_DesignInfo_subset  sP    $  $ r   )N)N)0Z
__future__r   r^   Znumpyr   Z
nose.toolsr   r   r   Z
patsy.utilr   r   r   Z
patsy.descr   r	   r   Zpatsy.categoricalr   Zpatsy.user_utilr   r   Zpatsy.design_infor   r   rd   r   r$   r,   r3   r:   rC   rF   rY   Zslowrg   rl   ro   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   sD   

.8#-~91N