U
    f/et                     @   s   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 d dlmZ G dd dZejdddgejd	ddgd
d ZdS )    N)is_categorical_dtype)CategoricalIndex	DataFrameIndex
MultiIndexSeriescrosstabc                   @   s  e Z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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'd( Zd)d* Zd+d, Zd-d. Zejd/d0d1gd2d3ggd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@S )ATestCrosstabc                 C   s   t dddddddddddgdddddddddddgdddddddddddgtjdtjdtjdd}|j|d	d
| _d S )Nfoobaronetwodullshiny   )ABCDEFT)Zignore_index)r   nprandomrandnappenddf)selfmethodr    r   F/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/reshape/test_crosstab.pysetup_method   sV    


/zTestCrosstab.setup_methodc                 C   sL   | j }t|d |d }|ddg  }t||dt	j
 d S )Nr   r   r   )r   r   groupbysizeunstacktmassert_frame_equalfillnaastyper   int64r   r   resultexpectedr   r   r   test_crosstab_singleD   s    z!TestCrosstab.test_crosstab_singlec                 C   s   | j }t|d |d |d g}|dddg }|dddtj}t	
|| t|d |d g|d }|dddg }|ddtj}t	
|| d S )Nr   r   r   r   )r   r   r!   r"   r#   r&   r'   r   r(   r$   r%   r)   r   r   r   test_crosstab_multipleJ   s    z#TestCrosstab.test_crosstab_multiplec                 C   s   t jjdddd}t jjdddd}t jjdddd}t|||d}t|||gdgd	d
}t|d |d |d g}t|| t||g|dgd	d}t|d |d g|d }t|| t| jd j| jd j}|j	j
dkst|jj
dkstd S )Nr      d   r"      
   abcr4   r5   r6   )rownamescolnamesr5   r6   )r9   r8   r   r   row_0col_0)r   r   randintr   r   r$   r%   r   valuesindexnameAssertionErrorcolumns)r   r4   r5   r6   r   r*   r+   r   r   r   test_crosstab_ndarrayW   s    z"TestCrosstab.test_crosstab_ndarrayc                 C   s   t dddgdddgd}t dddddgdddd	d
gd}tdddg}tddgddggtddgddtddgddd}t||}t|| t||}t|| d S )Nr      r4   r5   r6   r>   r1      dfr:   r?   r;   r>   rA   )r   r   arrayr   r   r   r$   r%   )r   r4   r5   r6   r+   r*   r   r   r   test_crosstab_non_alignedk   s     

z&TestCrosstab.test_crosstab_non_alignedc                 C   sH  t jjdddd}t jjdddd}t jjdddd}t|||d}t|||gdgd	d
d}|jjdksnt|jjddgkst|d }|	dg
 d}tt|gtdgddd}||}d|_t|| |jd }	|	ddg
 d}
|
tt|gdgd}
d|
_|
|	j}
|
dt j}
t|	|
 d S )Nr      r/   r0   r1   r.   r3   r4   r7   T)r8   r9   marginsr4   r5   r6   All i8rP   rH   rD   )r   r   r<   r   r   r>   namesr@   rA   r!   r"   r'   r   lenr   r   r?   r$   assert_series_equallocreindexr&   r(   )r   r4   r5   r6   r   r*   all_colsexp_cols
exp_marginall_rowsexp_rowsr   r   r   test_crosstab_margins}   s(    

z"TestCrosstab.test_crosstab_marginsc              
   C   s  t jjdddd}t jjdddd}t jjdddd}t|||d}t|||gdgd	d
dd}|jjdkspt|jjddgkst|d }|	dg
 d}tt|gtdgddd}||}d|_t|| |jd }	|	ddg
 d}
|
tt|gdgd}
d|
_|
|	j}
|
dt j}
t|	|
 d}dd ddgfD ]:}tjt|d  t|||gdgd	d
|d W 5 Q R X qXd S )Nr   rL   r/   r0   r1   r.   r3   r4   r7   TTOTAL)r8   r9   rM   margins_namerN   r5   r6   )r^   rQ   rR   rH   rD   z&margins_name argument must be a stringi  match)r   r   r<   r   r   r>   rS   r@   rA   r!   r"   r'   r   rT   r   r   r?   r$   rU   rV   rW   r&   r(   pytestraises
ValueError)r   r4   r5   r6   r   r*   rX   rY   rZ   r[   r\   msgr_   r   r   r   %test_crosstab_margins_set_margin_name   sL    	

z2TestCrosstab.test_crosstab_margins_set_margin_namec                 C   s   t jjdddd}t jjdddd}t jjdddd}t jd}t||g||t jddgd	gd
}t||||d}|jdddgd	t jd}t	|| d S )Nr   rL   r/   r0   r1   r.   r
   r   baz)aggfuncr8   r9   )r
   r   rg   r=   r=   )r>   rA   rh   )
r   r   r<   r   r   sumr   Zpivot_tabler$   r%   )r   r4   r5   r6   r=   tabler   r+   r   r   r   test_crosstab_pass_values   s(            z&TestCrosstab.test_crosstab_pass_valuesc                 C   s   t jdddddddgtd}t jdddddddgtd}t jdddddddgtd}t|||gdgd	d
gdd}tjddddgd	d
gd}t|j| d S )Nr
   r   dtyper   r   r   r   r4   r5   r6   F)r8   r9   dropna)r   r   )r   r   )r   r   )r   r   rS   )	r   rJ   objectr   r   from_tuplesr$   Zassert_index_equalrA   )r   r4   r5   r6   resmr   r   r   test_crosstab_dropna   s     
z!TestCrosstab.test_crosstab_dropnac                 C   sj   t dddgdddgd}t dddgdddgd}t||}ttg dd	d
tg ddd
d}t|| d S )NrC      r1   rD   rE   r.      r(   r:   rm   r?   r;   rI   )r   r   r   r   r$   r%   )r   s1s2actualr+   r   r   r   test_crosstab_no_overlap   s    
z%TestCrosstab.test_crosstab_no_overlapc                 C   s   t dddddtjgddddddgd}t|j|jddd}t dddgdddgddd	gg}td
ddgdd|_tdddgdd|_t	
|| d S )NrC   ru   r1   rE   r4   r5   TrM   rn   r   r.         ?       @rP   r4   rH   r5   r   r   nanr   r4   r5   r   r>   rA   r$   r%   r   r   rz   r+   r   r   r   test_margin_dropna   s    ( zTestCrosstab.test_margin_dropnac                 C   s   t dtjtjtjdtjgdtjddddgd}t|j|jddd}t dddgdddgdddgg}td	d
dgdd|_tdddgdd|_t	
|| d S )NrC   ru   r1   rE   r|   Tr}   r   r~   r   rP   r4   rH         @      @r5   r   r   r   r   r   test_margin_dropna2  s    * z TestCrosstab.test_margin_dropna2c                 C   s   t dtjtjtjtjdgddddddgd}t|j|jddd}t dddgdddgdddgg}td	d
dgdd|_tdddgdd|_t	
|| d S )NrC   ru   r1   rE   r|   Tr}   r   r~   r   rP   r4   rH   r5   r   r   r   r   r   test_margin_dropna3  s    ( z TestCrosstab.test_margin_dropna3c                 C   s   t dddddtjgddddddgd}t|j|jddd}t dd	dgdddgddd
gg}tdddgdd|_tdddgdd|_t	
|| d S )NrC   ru   r1   rE   r|   TFr}   r   rv   r~   r   rP   r4   rH   r5   r   r   r   r   r   test_margin_dropna4  s    ( z TestCrosstab.test_margin_dropna4c                 C   s   t dtjtjtjdtjgdtjddddgd}t|j|jddd}t dd	dgd	ddgddd
gg}tdddgdd|_tdddgdd|_t	
|| d S )NrC   ru   r1   rE   r|   TFr}   r   rv   r~   r   rP   r4   rH   r   r   r5   r   r   r   r   r   test_margin_dropna5'  s    * z TestCrosstab.test_margin_dropna5c                 C   s*  t jdddddddgtd}t jdddddt jdgtd}t jdddddddgtd}t|||gdgd	d
gddd}tjdddddgdddddggd	d
gd}tdddddgdddddgdddddgg|d}tdddgdd|_	t
|| t||g|dd	gd
gddd}tjdddddgdddddggdd	gd}tdddgdddgdddgdddgdddgg|d}tdddgd
d|_t
|| t||g|dd	gd
gddd}tjdddddgdddddggdd	gd}tdddgdddgdddgdddgdddgg|d}tdddgd
d|_t
|| d S )Nr
   r   rl   r   r   r   r   r4   r5   r6   TF)r8   r9   rM   rn   rP   rQ   ro   rC   r   ru   r.   r1   rL   )rA   rH   rD   rv   )r   rJ   rp   r   r   r   from_arraysr   r   r>   r$   r%   rA   )r   r4   r5   r6   rz   rs   r+   r   r   r   test_margin_dropna61  s|          &      *      * z TestCrosstab.test_margin_dropna6c           
      C   sn  t dddddgdddddgddtjddgd}tddgdd}tddgdd}t d	d
gd	dgg||d}t dd
gddgg||d}t dd
gddgg||d}tt|j|jdd| tt|j|jdd| tt|j|jdd| tt|j|jdd| tt|j|jddt|j|jdd tt|j|jd
dt|j|jdd t dd
gddgddggtdddgdddtddgdddd}t dd
d	gdddggtddgdddtdddgdddd}t d	d
d	gd	ddgdddggtdddgdddtdddgdddd}	tt|j|jddd| tt|j|jddd| tt|j|jddd|	 d S )NrC   ru   r1   rE   r3   r4   rH   r5   皙?r   333333?rI   r~         ?      ?      ?all	normalizeTr>   rA   皙?rP   rp   r?   rm   g?r   rM   )	r   r   r   r   r$   r%   r   r4   r5   )
r   r   rindexZcindexZfull_normalZ
row_normalZ
col_normalZrow_normal_marginsZcol_normal_marginsZall_normal_marginsr   r   r   test_crosstab_normalizeb  s^    *    z$TestCrosstab.test_crosstab_normalizec                 C   st  t dddddgdddddgddtjddgd}ttddddgtddddggtddddg t dddgddd	gdddggtddd
gdddtddd
gddd}t|j|j|jdddd}t	
|| t dddddgdddddgddtjddgd}t dddgdddgdddggtddd
gdddtddd
gdddd}t|j|j|jtjddd}t	
|| d S )NrC   ru   r1   rE   r3   r   r   r   r   rP   r4   rp   r   r5   rH   rI   countr   T)rh   r   rM           r   r   )r   r   r   r   rJ   r   r4   r5   r6   r$   r%   ri   )r   r   Znorm_countsZ	test_caseZnorm_sumr   r   r   test_crosstab_normalize_arrays  sL    *"      *     z+TestCrosstab.test_crosstab_normalize_arraysc                 C   s  t dddddgdddddgtjtjtjtjtjgd}t ddgddggtddgddd	tddgd
dd}dD ](}t|j|j|jd|d}t	|| qpt dtjgddggtddgddd	tddgd
dd}|r|d 
d|d< t|j|j|jddd}t	|| d S )NrC   ru   r1   rE   r3   r   r4   r(   r   r5   rH   rI   )Tr>   rA   r   )r=   rh   r   F)r   r   r   r   r   r4   r5   r6   r$   r%   r'   )r   Zusing_array_managerr   emptyiZ
calculatedZnansr   r   r   test_crosstab_with_empties  s.    z'TestCrosstab.test_crosstab_with_emptiesc              	   C   s&  t dddddgdddddgddtjddgd}d}tjt|d t|j|j|j	d W 5 Q R X d	}tjt|d t|j|jtj
d
 W 5 Q R X d}tjt|d t|j|jdd W 5 Q R X tjt|d t|j|jdd W 5 Q R X d}tjt|d t|j|jddd W 5 Q R X d S )NrC   ru   r1   rE   r3   z)values cannot be used without an aggfunc.r`   )r=   z%aggfunc cannot be used without values)rh   zNot a valid normalize argumentZ42r   *   zNot a valid margins argumentr   r   )r   r   r   rb   rc   rd   r   r4   r5   r6   Zmean)r   r   errorr   r   r   test_crosstab_errors  s"    *z!TestCrosstab.test_crosstab_errorsc                 C   s   t ddddddgddddddgd}dddg}|d d	j||d< t|d
 |d }tdddgd
d}t||ddd}dddgdddgdddgg}t |||d}t|| d S )NZHondaZAcuraZTeslaZSedanZElectricZPickup)MAKEMODELr   categoryr   rH   F)
categoriesZorderedr?   ru   r   rC   rI   )	r   r'   catZset_categoriesr   r   r   r$   r%   )r   r   r   r*   expected_indexZexpected_columnsexpected_datar+   r   r   r   %test_crosstab_with_categorial_columns  s,    
     z2TestCrosstab.test_crosstab_with_categorial_columnsc                 C   sp  t ddddgd dddgd d	d	d	d
d
d
gd tjdtjdd}t|d |d g|d gdtj|d d}tddddgddddggddddddddddg
ddddddddddg
gddgd}td
d	dgddd}tdddgdddgdddgdtj	dgtj	ddgdtj	dgtj	ddgdtj	dgtj	ddgdddgg
}t |||d}|d 
d|d< t|| d S ) Nr   r   threerv   r   r   r      r
   r   rE      r   r   r   r   r   Tr   )r>   rA   rM   rh   r=   rP   rQ   rC   ru   r1   r   levelscodesrS   rp   rw   r   r   g      (@g      8@rI   r(   )r   r   r   r   r   r"   r   r   rJ   r   r'   r$   r%   )r   r   r*   r   Zexpected_columnr   r+   r   r   r   test_crosstab_with_numpy_size	  sR    

	.





  z*TestCrosstab.test_crosstab_with_numpy_sizec                 C   s   t tddd}t tdddd}t tdddd}t tddd}ddi}t||}t||j|dd}t|| t||g|}t||g|j|d	d
}t|| t|||g}t|||gj|dd}t|| d S )Nr1   r
   rH   rC   rE   r   Zwaldo)rA   axisr   )r>   r   )r   ranger   Zrename_axisr$   r%   )r   rx   Zs2_fooZs2_barZs3Zmapperr*   r+   r   r   r   test_crosstab_duplicate_names6  s    
z*TestCrosstab.test_crosstab_duplicate_namesrS   r4   r7   r|   r6   c                 C   sv   t td|d d}t tdd|d d}tjtdtddg|d}t d|djddd}t||}t|| d S )	Nr1   r   rH   rC   rE   ro   rD   )Z
fill_value)r   r   r   r   r#   r   r$   r%   )r   rS   rx   ry   mir+   r*   r   r   r   test_crosstab_tuple_nameR  s    
z%TestCrosstab.test_crosstab_tuple_namec                 C   sj   t tddd}t tddd}ttjdddttdddttdddd}t||}t|| d S )Nr1   r|   rH   )r6   rF   r(   rl   rI   )	r   r   r   r   Zeyer   r   r$   r%   )r   rx   ry   r+   r*   r   r   r   test_crosstab_both_tuple_names]  s    
z+TestCrosstab.test_crosstab_both_tuple_namesc                 C   s   t dddgdddgddd	d
gd}t|j|j|jg}td	d
dgdd}tjdddgddgd}t dddgdddgdddgg||d}t	|| d S )Nr1   rC   ru   r.   rE   rv   )r5   r4   r   r   r   rD   r:   rH   )rC   rE   )ru   rv   )r1   r.   r5   r4   ro   r   rI   )
r   r   r>   r5   r4   r   r   rq   r$   r%   )r   r   r*   Ze_idxZ	e_columnsr+   r   r   r   test_crosstab_unsorted_orderj  s    $  z)TestCrosstab.test_crosstab_unsorted_orderc                 C   s   t ddddgd dddgd d	d	d	d
d
d
gd dgd dgd d}t|j|jg|j|jtjddd}t tjdgd dg t	d
ddtd
d	dgdddtjdddddddd d!d"g
ddgd#d$}t|| d S )%Nr   r   r   rv   r   r   r   r   r
   r   rE   r   r   r   T)r=   rh   r   rM      rC   rl   r2   r1   rP   rp   rw   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   rO   ro   )rA   r>   )r   r   r   r   r   r   r   ri   rJ   floatZreshaper   r   rq   r$   r%   r)   r   r   r   (test_crosstab_normalize_multiple_columnst  sF    	
 z5TestCrosstab.test_crosstab_normalize_multiple_columnsc                 C   sT  t dddddddddg	dddddddddg	dddddddddg	dddd	d	d
dddg	dd
dddddddg	d}t|j|jg|jdddd}t ddgddgddgddgddgg}tdddgdddggdddddgdddddggddgd|_tddgddd |_t	
|| t|j|jg|jdddd}t d!d"d#gd!d"d#gdd"dgdd$d#gg}tdddgddd |_tddgddggddddgddddggddgd|_t	
|| t|j|jg|jdddd}t d%d%d#gd%d%d#gd#d%dgd&d#d#gdd'dgg}tdddgddd |_tdddgdddggdddddgdddddggddgd|_t	
|| d S )(Nr
   r   r   r   smalllargerC   ru   r1   rE   r.   rv   rL   r   	   r   Tz	Sub-Totalr   )rM   r_   r   r   g]QJVU?F]kSU?9?q?'c`?rQ   r   r   r   rp   r   rw   r   r   9?q?r   9?q?r   g#G?)r   r   r   r   r   r   r>   r   rA   r$   r%   r)   r   r   r   test_margin_normalize  s    
     
      
    	  z"TestCrosstab.test_margin_normalizec                 C   s  t dddddddddg	dddddddddg	dddddddddg	dddd	d	d
dddg	dd
dddddddg	d}t|j|j|jgdddd}t dddddgdddddgdddddggdddgd}tdddgdddggdddddgdddddggddgd |_d!|j_t	
|| d S )"Nr
   r   r   r   r   r   rC   ru   r1   rE   r.   rv   rL   r   r   r   Tmargin)r>   rA   rM   r_   r   r   r   r   r   r   r   r~   rD   rQ   r   r   r   r   r   )r   r   r   r   r   r   rA   r>   r?   r$   r%   r)   r   r   r   &test_margin_normalize_multiple_columns  sL    
z3TestCrosstab.test_margin_normalize_multiple_columnsN)#__name__
__module____qualname__r    r,   r-   rB   rK   r]   rf   rk   rt   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   markparametrizer   r   r   r   r   r   r   r   r   r   r	      s<   22
13$ -


(Qr	   a_dtyper   r(   b_dtypec                 C   s  t jd}t|jdddd| }t|jdddd|}t||ddd	}tdd
dgddd}tdd
ddgddd}dddgdddgdddgdddgg}t|||}	t	
||	 d|j|d
k< t|j}
|
r| jd
 dkstt||ddd	}dddgddt jgdddgdddgg}t|||}	|
sR|	jdddg }	|	d d|	d< t| t|	 t|	jdddg  t	
||	 d S )Nivr   r1   r/   r0   ru   TFr}   rC   rP   rp   r;   rw   r:         "       4   0   B   r(   )r   r   ZRandomStater   r<   r'   r   r   r   r$   r%   rV   r   rm   Zvalue_countsr@   r   repr)r   r   gr4   r5   r*   rA   r>   r=   r+   Za_is_catr   r   r   test_categoricals  s,    $
&r   )Znumpyr   rb   Zpandas.core.dtypes.commonr   Zpandasr   r   r   r   r   r   Zpandas._testingZ_testingr$   r	   r   r   r   r   r   r   r   <module>   s          