U
    Kvf1y                     @   sJ  d dl mZ d dlZd dlZd dl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d5ddZd6d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+d/d0 Z,d1d2 Z-d3d4 Z.dS )7    )print_functionN)
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   4/tmp/pip-unpacked-wheel-68fdvdus/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eyepytestraisesr   r   r   r   r   test_assert_full_rank#   s$         r%   c                  G   s*   g }| D ]}| tdd |D  q|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   )mmexpected_ranktermlistr0   r   r   r   check_design_matrix6   s    r5   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   Zeval_envr0   )r-   design_matrix_buildersbuild_design_matricesZterm_slicesr/   r   r0   r5   )	r8   r3   r*   r0   r4   r9   Zdesign_infosZmatricesmatrixr   r7   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x2a[a1]a[a2]r;   	Intercepta[T.a2]r   rA   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)r8   rB   rC   r   r   r   r   test_simpleN   sh    (( 


 


 



rK   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@   rA   cr   r   r@   xr   rA   r!   rL   )r   r   rH   rI   r?   r7   r   r   r   test_R_bugs|   s
    rN   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}| }|D ]}t|}|D ]\}	}
|	|kr|
|kr qqt }|D ]F}tdd |D }dd |D } |D ]}|	t
||  qqt|}|dkrHttt| || nt| || |d7 }|d dkrtd| qtd| | f  d S )Nr   r    )r@   rA   repeatr   r   r@   rB   rC   c                 3   sR   | st  V  n@| d } | dd  D ]&}t t|V  t t|f| V  q&d S )Nr   r   )tuplesorted)lobjsubsetall_subsetsr   r   rV      s    
z/test_redundancy_thoroughly.<locals>.all_subsets)r@   rA   rB   rC   )rA   )r@   )rC   )rB   )rA   rC   )r@   rB   )r@   rA   rC   )r@   rA   rB   )rA   rB   rC   )r@   rB   rC   c                 S   s   g | ]}| d r|qS rM   
startswithr&   tr   r   r   r(      s     
 z.test_redundancy_thoroughly.<locals>.<listcomp>c                 S   s   g | ]}| d s|qS rW   rX   rZ   r   r   r   r(      s     
 )r   )r   r   z
Completed:zTook %0.2f seconds)r   r   rH   rI   listprinttimer.   rP   add	frozensetr#   r$   r   r?   )r8   	all_termsZall_termlist_templatesZ	redundantcountr^   startZtermlist_templateZtermlist_setZdispreferred	preferredZexpanded_termsZterm_templatenumericrestZsubset_restr3   r   rU   r   test_redundancy_thoroughly   sP    	
  rg   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	
|}	||	 |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d S )Na1a2r   r   r   r   )r@   rM   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_typerl   r   r   r   r(      s     rM   )r@   ZS2dtype)r@   ZU2rD   rE   za[a1]:xza[a2]:xr;   r   )dictr   arrayr\   zipintviewZrecarrayr   pandas	DataFramer)   r?   rJ   r   )Z
basic_dictZbasic_dict_bytesZbasic_dict_unicodeZstructured_array_bytesZstructured_array_unicodeZrecarray_bytesZrecarray_unicodedatasZdf_bytesZ
df_unicoder8   r   r   r   r   test_data_types   sP    





 







ry   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 )
NrM   r   r   r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9      s    z4test_build_design_matrices_dtype.<locals>.iter_makerr   ro   float128)
r<   r-   r=   rp   r   Zfloat64r   Zfloat32hasattrrz   r9   buildermatr   r7   r    test_build_design_matrices_dtype   s    
r   c                     sl   ddddgi  fdd} t tdg| dd }t|g dd	d }t|tsRttjtt|g d
d	 d S )NrM   r   r   r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9      s    z$test_return_type.<locals>.iter_makerr   r>   return_typeZasdfsadf)	r<   r-   r=   
isinstancer   r   r#   r$   r   r|   r   r7   r   test_return_type   s      r   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j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rM   rL   c                   3   s
    V  d S r6   r   r   Zinitial_datar   r   r9     s    z"test_NA_action.<locals>.iter_makerrM   rL   r   g      $@g      4@ro   )r   r         ?        drop)	NA_action)NAAction)ZNA_types)r   r   raise)r<   r-   r=   r   nanasarrayobjectr   r   array_equalZpatsy.missingr   ZtestingZassert_array_equalr#   r$   r   )r9   r}   r~   r   r   r   r   r   test_NA_action
  sd    



 
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 )Nr         @r   r   c3r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9   ;  s    z1test_NA_drop_preserves_levels.<locals>.iter_makerrM   rL   r   zc[c1]zc[c2]zc[c3])r   r   r   )	r   r   r<   r-   r0   r   r=   r   r   )r9   r/   r~   r   r7   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sdt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s:t|jjdgksNt|	jjdgksbt|jjdgksvt|	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sDtt	|jdgsZtt	|	jdgspt|jjdgkst|	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s8tt|gdd d!gd
d%d&gd"dd\}t|tjsnt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jtt|gddddgidd W 5 ||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!   rh   ri   )rM   yr@   r         )indexc                   3   s
    V  d S r6   r   r   r7   r   r   r9   O  s    z+test_return_type_pandas.<locals>.iter_makerr   r   rM   r:   r@   rM   r@   rM   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 )NrM   r   )rv   rw   __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	dataframer   r"      	   )r   rM         Fr   r   ro   r   )r   r   )r   rv   rw   r<   r-   r#   r$   r   r=   r   rJ   r   r   r   r   columnsr/   r0   Z
term_namesequalsZIndexpatsy.buildbuildr   r   r   )r9   Zint_builderZ	y_builderZ	x_builderZx_a_builderZx_y_builderr   r~   Zy_dfZx_dfZx_a_dfZx_y_dfZint_dfpatsyZ
had_pandasr   r7   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}| D ]2\}}||| ||| ||| ||| q(|D ]\}}||| ||| q`|D ]\}}||| ||| qtttdddgddddgdddgdgg d S )Nr   r   r   TFr@   rA   rL   )levelsdrM   c                    sZ    fdd}z.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 NrM   r   r   data1data2r   r   r9     s    
z=test_data_mismatch.<locals>.t_incremental.<locals>.iter_makerr   rM   )r<   r=   r   r   r   r   r9   buildersr4   r   r   t_incremental  s    z)test_data_mismatch.<locals>.t_incrementalc                    s2    fdd}t g|d}ttt|d|i d S )Nc                   3   s   d iV  d S r   r   r   r   r   r   r9     s    z?test_data_mismatch.<locals>.t_setup_predict.<locals>.iter_makerr   rM   )r<   r#   r$   r   r=   r   r   r   r   t_setup_predict  s      z+test_data_mismatch.<locals>.t_setup_predictr   r   r   )r
   r-   r#   r$   r   r?   )Ztest_cases_twowayZtest_cases_onewayZsetup_predict_onlyr   r   r@   rA   r   r   r   test_data_mismatch  sD    $0







  
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sntt	
|dgdgdggstd S )
NrM   r   r   r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9      s    z1test_data_independent_builder.<locals>.iter_makerr   r:   )r   r   )r<   r-   r#   r$   r   r=   r   rv   rw   r   rJ   r   r   )	r9   Znull_builderZintercept_builderZint_mZnull_mZ
x_termlistr   Zx_mZintercept_mr   r7   r   test_data_independent_builder  sP    
 

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   rh   ri   r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9   1  s    z4test_same_factor_in_two_matrices.<locals>.iter_makerrM   r@   r   r:   r;   zx:a[a1]zx:a[a2])r-   r<   r=   r5   r   rJ   r   )r9   t1t2r   m1m2r   r7   r    test_same_factor_in_two_matrices/  s    
r   c                     s6   ddddgi  fdd} t tttdg| d d S )NrM   r   r   r   c                   3   s
    V  d S r6   r   r   r7   r   r   r9   >  s    z.test_eval_env_type_builder.<locals>.iter_makerZfoo)r#   r$   	TypeErrorr<   r-   )r9   r   r7   r   test_eval_env_type_builder<  s    r   c                  C   st   ddddgi} dt dddgi}| |g}trJdtdddgi}|| dd }|D ]}|D ]}||| q^qVd S )Nr@   rh   ri   c                    s0    fdd}t tdgg|dd}t|| d S )Nc                   3   s
    V  d S r6   r   r   r   r   r   r9   J  s    z/test_categorical.<locals>.t.<locals>.iter_makerr@   r   r:   )r<   r-   r=   r   r   r   r   r[   I  s    ztest_categorical.<locals>.t)r
   r   rv   ZCategoricalr)   )Zdata_stringsZ
data_categrx   Zdata_pandasr[   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|| 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sxtqxt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s.t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|| 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qt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sLt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Sumrh   a3ri   r@   r   rD   rE   za[a3]r;   r   za[mean]za[S.a1]za[S.a2]r   )Zomitza[S.a3]rF   rG   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   rJ   r   )r   r   valuesr   r   r   r   r   test_contrastT  s    
  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std S )Nr   r   g@g	@gffffff@g@r    r!   )rM   r   zrM   r   r   c                   3   s
    V  d S r6   r   r   )all_datar   r   r9     s    z*test_DesignInfo_subset.<locals>.iter_makerr   c                    sz     | }i }|D ]}| ||< qt|g|d }d d |f }t| tjsft| t|jksftt	||svtd S )Nr   )
rT   r=   r   rm   string_typesrI   r+   r   r   r   )Zwhich_terms	variablesr   Zsub_design_infoZsub_datavariableZ
sub_matrixZsub_full_matrixZall_builderr   Zfull_matrixr   r   r[     s    
z!test_DesignInfo_subset.<locals>.tz~ 0 + x + y + zz~ 0 + x + zr   z~ 0 + z + xz~ 0 + yza ~ az~ asdfZasdfr@   rA   rL   )r-   r<   r=   slicerm   PY3unicodern   r#   r$   r   rT   KeyErrorr   r   r0   r   r+   )ra   r9   r[   Zmin_diZmin_di_subsetr   r   r   test_DesignInfo_subset  s\     $  $  
r   )N)N)/
__future__r   rm   Znumpyr   r#   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   rv   r   r%   r-   r5   r?   rK   rN   rg   Zslowry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   sD   

.8#-~91N