a
    ߙfbKW                     @   sD  d dl Z d dlZd dlmZmZmZmZmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d dlm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'j(e oed.d/d0d1 Z)d2d3 Z*d4d5 Z+d6d7 Z,dS )8    N)TableColumnQTabletable_helpersNdarrayMixinunique)NUMPY_LT_1_22NUMPY_LT_1_22_1)AstropyUserWarning)time)units)coordinatesc                 C   s   t | t |kS N)sorted)Zlist1Zlist2 r   >lib/python3.9/site-packages/astropy/table/tests/test_groups.pysort_eq   s    r   c                 C   s   dD ]}t | |d}|d  }||d }t|jjtg dksNJ ||d }t|jjtg dks|J ||d  }t|jjtg dksJ qd S )NFTmaskedar            r   br   r      r         r   )	r   copygroup_bynpallgroupsindicesarrayas_array)T1r   t1Zt1aZt1agr   r   r   test_column_group_by   s      r+   c              	   C   s  dD ]}t | |d}|d}t|jjtg dks@J t|jdksRJ t|d jdkshJ | g dks|J |j	d d	ksJ |d
 j	d d	ksJ |d
 j
dksJ ||d }| | ksJ ddgdfD ]D}||}t|jjtg dksJ | g dksJ q||d }| | ksNJ ||d  }| | ksvJ |tg d}t|jjtg dksJ | g dksJ qdS )zl
    Test basic table group_by functionality for possible key types and for
    masked/unmasked tables.
    r   r   r   r   z<TableGroups indices=[0 1 4 8]>z <ColumnGroups indices=[0 1 4 8]>)
 a   b   c   d --- --- --- ---  0   a 0.0   4  1   b 3.0   5  1   a 2.0   6  1   a 1.0   7  2   c 7.0   0  2   b 5.0   1  2   b 6.0   2  2   a 4.0   3tar   ccolumn cr   r   r   )
r,   r-   r.   r0   r1   r/   r5   r3   r4   r2   )r   r   r   r      r   r   r   )r   r   r    r   )
r,   r-   r2   r4   r0   r1   r3   r5   r/   r.   N)r   r"   r#   r$   r%   r&   r'   strpformatmetadescriptionr(   )r)   r   r*   tgtg2keysr   r   r   test_table_group_by$   s.    

 

""rA   c                 C   s   |  d}|jj}|jjdks"J t|d tg dksBJ |  ddg}|jj}|jjdkshJ t|d tg dksJ t|d tg dksJ |  | d }|jj}|jjd u sJ d S )Nr   r   r   r   r9   r   r   )r   r   r   r9   r9   r9   )r   r   r   r   r   r7   )r"   r%   r@   dtypenamesr#   r$   r'   )r)   r>   r@   r   r   r   test_groups_keysk   s    
   rF   c                 C   s`   |  d}t|jD ]F\}}| |j|  ks6J |d d |d |jj|  ksJ qd S )Nr   r   )r"   	enumerater%   r;   r&   )r)   r>   Ziigroupr   r   r   test_groups_iterator}   s    
rI   c           	      C   s   dD ]}t | |d}|d}| }t|jj|jjks@J t|jj|jjksZJ |d  }t|jj|d jjksJ |d  }||d }| }t|jjtg dksJ qdS )zH
    Test that copying a table or column copies the groups properly
    r   r   r   r   N)	r   r"   r!   r#   r$   r%   r&   r@   r'   )	r)   r   r*   r>   ZtgcZtacZc1Zgc1Zgc1cr   r   r   test_grouped_copy   s    
rJ   c              	   C   sd   dD ]Z}t | |d}|d}|dd }t|jjtdt|gksNJ |jjdu sJ qdS )z=
    Test that slicing a table removes previous grouping
    r   r   r   r   r   r   N)	r   r"   r#   r$   r%   r&   r'   lenr@   )r)   r   r*   r>   r?   r   r   r   test_grouped_slicing   s    
$rL   c                 C   s\   | d  t| d }t|jjtg dks8J t|jjtg dksXJ dS )z0
    Group a column that is part of a table
    r7   r   rC   r   N)r"   r#   r'   r$   r%   r@   r&   )r)   Zcgr   r   r   test_group_column_from_table   s     rM   c                 C   s   dD ]}t | |dd}|jtg d }t|jdks@J |jd  |jd  ks`J |jd  |jd  ksJ t|jjd tddgksJ qdS )	z<
    Use boolean mask as item in __getitem__ for groups
    r   r   r   )TFTr9   r   r   N	r   r"   r%   r#   r'   rK   r;   r$   r@   r)   r   r*   t2r   r   r   test_table_groups_mask_index   s      rQ   c                 C   s   dD ]}t | |dd}|jtddg }t|jdks@J |jd  |jd  ks`J |jd  |jd  ksJ t|jjd tddgksJ qdS )z;
    Use numpy array as item in __getitem__ for groups
    r   r   r   r   r9   r   NrN   rO   r   r   r   test_table_groups_array_index   s      rR   c                 C   s  dD ]}t | |dd}|jdd }t|jdks<J |jd  |jd  ks\J |jd  |jd  ks|J t|jjd tddgksJ |jdd }t|jdksJ |jd  |jd  ksJ t|jjd tdgksJ |jddd }t|jdks(J |jd  |jd  ksJJ |jd  |jd  kslJ t|jjd tddgksJ qdS )	z.
    Test that slicing table groups works
    r   r   r   r   r9   r   r   N)	r   r"   r%   rK   r;   r#   r$   r@   r'   rO   r   r   r   test_table_groups_slicing   s     
  $ $""rS   c                 C   s   dD ]}t | |d}|d}|d }t|jj|jjks@J t|jj|jjksZJ |jtj}|	 g dks|J |d }t|jj|jjksJ t|jj|jjksJ |jtj}|	 g dksJ qdS )	z5
    Test that column slicing preserves grouping
    r   r   r   r   r7   d a   c    d --- ---- ---  0  0.0   4z  1  6.0  18  2 22.0   6)r7   rU   )z c    d z---- ---z 0.0   4z 6.0  18z22.0   6N)
r   r"   r#   r$   r%   r@   r&   	aggregatesumr;   )r)   r   r*   r>   ZtgsZtgsar   r   r   test_grouped_item_access   s    
r]   c              	   C   sJ  dD ]>}t | |d}|d}|d t|jjtdt|gksNJ |jj	du s^J |d}|
d t|jjtdt|gksJ |jj	du sJ |d}|jj }|tdtt|d	 t|jj|ksJ t|d jj|ks
J t|d jj	|jj	ks*J |d}|d
 t|jj|ksVJ |jj	jjdkslJ t|d jj|ksJ |d}|d t|jj|ksJ |jj	jjdksJ t|d
 jj|ksJ |d}|dd t|jj|ksJ |jj	jjdks*J t|d jj|ksJ qdS )z
    Operations like adding or deleting a row should removing grouping,
    but adding or removing or renaming a column should retain grouping.
    r   r   r   )r   r         @r   r   Nr   e)namedatar   rB   Zaa)r   r"   Zadd_rowr#   r$   r%   r&   r'   rK   r@   Z
remove_rowr!   Z
add_columnr   arangeZremove_columnrD   rE   Zrename_column)r)   r   r*   r>   r&   r   r   r   test_mutable_operations  s>    


$

$
 




rc   c                 C   sF   t | dd}d|d jd< d|d jd< |d g dksBJ d S )	NTr   r7   r   rU   r   r   )
r,   r-   z  0   a  --   4z  1   b 3.0  --r0   r1   r2   r3   r4   r5   )r   maskr"   r;   )r)   t1mr   r   r   test_group_by_masked:  s    rf   c                 C   s2  t t | d W d   n1 s*0    Y  t t | ddg W d   n1 sb0    Y  t t$ | tddg W d   n1 s0    Y  t t | d W d   n1 s0    Y  t| dd}d|d jd	< t t |d W d   n1 s$0    Y  dS )
z(
    Appropriate errors get raised.
    fNgr   r9   Tr   r   r   )	pytestZraises
ValueErrorr"   r#   r'   	TypeErrorr   rd   )r)   r*   r   r   r   test_group_by_errorsJ  s    (,2(rl   c                 C   sT  |  d}|jjjd du s J |d jjjd du s:J |jd jjjd du sVJ |d jtg d jjjd du sJ |  | d }|jjjd d	u sJ |d jjjd d	u sJ |jd jjjd d	u sJ |  | d  }t|jjd
rJ t|d jjd
rJ |  | d }d|jjjvs8J d|d jjjvsPJ dS )zF
    Make sure the keys meta['grouped_by_table_cols'] is working.
    r   Zgrouped_by_table_colsTr7   r   rU   )FTTr   Fr<   N)r"   r%   r@   r<   r#   r'   r(   hasattr)r)   r>   r   r   r   test_groups_keys_metae  s&    
rn   c                 C   s  | d }| d}|jtj}| g dks4J t|jjtddgksTJ |jj	du sdJ |j
d dksvJ |d	 j
d dksJ |d	 jd
ksJ t|dd}d|d	 jdd< d|d jdd< | d}tjtdd |jtj}W d   n1 s0    Y  | g dks,J t|dd}d|d	 jd< d|d jd< | d}|jtj}| g dksJ |  d}tjtdd |jtj}W d   n1 s0    Y  | g dksJ dS )z
    Aggregate a table
    rT   r   rV   r   r   Nr6   r   r7   r8   Tr   r      rU   z"converting a masked element to nanmatch)z a   c    d  z--- ---- ----z  0  nan  nanz  1  3.0 13.0z  2 22.0  6.0r   )rW   rX   rY   z  1  3.0  13rZ   Cannot aggregate column)r"   r%   r[   r#   r\   r;   r$   r&   r'   r@   r<   r=   r   rd   ri   warnsUserWarningr
   )r)   r*   r>   tgare   r   r   r   test_table_aggregate  s4    
 
.	

.rv   c                 C   s2  dd }dd }dd }| d }| d}|jtj}|jtj}|j|}t||ksdJ t||ksvJ | g d	ksJ |jtj}|j|}t||ksJ | g d
ksJ | d }	|	 d}t	j
tdd |j|}
W d   n1 s0    Y  |
 g dks.J dS )zE
    Aggregate table with functions which have a reduceat method
    c                 S   s
   t | S r   )r#   meanxr   r   r   np_mean  s    z.test_table_aggregate_reduceat.<locals>.np_meanc                 S   s
   t | S r   )r#   r\   rx   r   r   r   np_sum  s    z-test_table_aggregate_reduceat.<locals>.np_sumc                 S   s
   t | S r   )r#   addrx   r   r   r   np_add  s    z-test_table_aggregate_reduceat.<locals>.np_addrT   r   rV   ) a   c   d --- --- ---z  0 0.0 4.0z  1 2.0 6.0z  2 5.5 1.5)r   r7   rr   rp   N) a ---z  0z  1z  2)r"   r%   r[   r#   r\   r|   r$   r;   rw   ri   rs   r
   )r)   rz   r{   r}   r*   r>   Ztga_rZtga_aZtga_nrP   ru   r   r   r   test_table_aggregate_reduceat  s(    

,r   c                 C   sF   dD ]<}t | |dd}|d jtj}| g dksJ qdS )z)
    Aggregate a single table column
    r   r   r   r7   )z c  z----z 0.0z 6.0z22.0N)r   r"   r%   r[   r#   r\   r;   )r)   r   r>   ru   r   r   r   test_column_aggregate  s    r   z+https://github.com/numpy/numpy/issues/20699)reasonc                  C   sT   dD ]J} t dtjdddi| dd}|d jtj}| g dksJ qdS )	z/https://github.com/astropy/astropy/issues/12706r   r   r9   z>f8rD   r   )r   r   0.01.0N)r   r#   rb   r"   r%   r[   r\   r;   )r   r>   ru   r   r   r   test_column_aggregate_f8  s     r   c                  C   sh   dd } t jg ddd}|d}|j| }|jd  g dksJJ |jd	  g d
ksdJ dS ) 
    Table groups filtering
    c                    s:    fdd| j D }|D ]}t| | dk r dS qdS )Nc                    s   g | ]}| vr|qS r   r   ).0r`   key_colnamesr   r   
<listcomp>      z;test_table_filter.<locals>.all_positive.<locals>.<listcomp>r   FT)colnamesr#   any)tabler   r   Zcolnamer   r   r   all_positive  s
    z'test_table_filter.<locals>.all_positive
z a c dz	 -2 7.0 0z	 -2 5.0 1z 0 0.0 4z 1 3.0 5z	 1 2.0 -6z 1 1.0 7z 3 3.0 5z	 3 -2.0 6z 3 1.0 7asciiformatr   r   )r~   r   z -2 7.0   0z -2 5.0   1r   )r~   r   z  0 0.0   4N)r   readr"   r%   filterr;   )r   tr>   rP   r   r   r   test_table_filter  s    


r   c                  C   s   dd } t jg ddd}|d}|d j| }t|jdksFJ |jd	  g d
ks`J |jd  g dkszJ |jd  g dksJ dS )r   c                 S   s   t | dk rdS dS )Nr   FT)r#   r   )columnr   r   r   r   8  s    z(test_column_filter.<locals>.all_positiver   r   r   r   r7   r   r   ) c r   z7.0z5.0r   )r   r   r   r9   )r   r   z3.0z2.0r   N)r   r   r"   r%   r   rK   r;   )r   r   r>   Zc2r   r   r   test_column_filter4  s    


r   c               
   C   s  t d} t g d}|tj }t|tj }t|tj }t	j
dddt	j|d dd }tj||d}t|}t jg d	d
dt}t| ||||||||g	g dd}	g d}
|
D ]}|	|}t |d g dksJ dD ]|}t |	| ddg |jd | ksJ t |	| dg |jd | ksBJ t |	| dg |jd | ksJ qqt|	|
d}t|dksJ t |d g dksJ t |d g dksJ |	d |	|
 }t |g dksJ dS )z2
    Test grouping a table with mixin columns
    r   )r^         ?       @r   i  Zjyearr   g|=Zsec)ZraZdec))r   r7   r   r   )r9   r   r   z<i4,|S1r   )	idxry   qlonlattmscawnd)rE   )ry   r   r   r   r   r   r   r   r   )r   r   r9   r   )ry   r   r   r   r   r   r   r   r   r   r9   )r@   )r   r9   r   ry   )r   r   r^   N)r#   rb   r'   umr   Z	LongitudeZdegZLatituder   ZTimeZ	TimeDeltaZSkyCoordr   ZArrayWrapperZviewr   r   r"   r$   r%   r   rK   )r   ry   r   r   r   r   r   r   r   ZqtZ
mixin_keyskeyZqtgr`   ZuqtZidxgr   r   r   test_group_mixinsQ  s<    

 


*(*r   )-ri   Znumpyr#   Zastropy.tabler   r   r   r   r   r   Zastropy.utils.compatr   r	   Zastropy.utils.exceptionsr
   Zastropyr   r   r   r   r   r+   rA   rF   rI   rJ   rL   rM   rQ   rR   rS   r]   rc   rf   rl   rn   rv   r   r   ZmarkZskipifr   r   r   r   r   r   r   r   <module>   sB    G	3@4
"