o
    EhT                     @   s   d Z ddlmZmZ ddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZ ddlmZ ejdd Zejd	d
 ZG dd dZdS )z5
test with the TimeGrouper / grouping with datetimes
    )datetime	timedeltaN)	DataFrameDatetimeIndexIndex
MultiIndexSeries	Timestamp
date_rangeoffsets)Grouper)
BinGrouperc                  C   s`   t g dtdddddtdddddtdddd	dtddd
ddtjtdddddgd} | S )z
    DataFrame used by groupby_with_truncated_bingrouper, made into
    a separate fixture for easier reuse in
    test_groupby_apply_timegrouper_with_nat_apply_squeeze
                	   r     r   r      r   r   
      r         )QuantityDate)r   r	   pdNaT)df r   Elib/python3.10/site-packages/pandas/tests/groupby/test_timegrouper.pyframe_for_truncated_bingrouper   s   r!   c                 C   s:   | }t ddd}||}t|jjt|jjksJ |S )a.  
    GroupBy object such that gb._grouper is a BinGrouper and
    len(gb._grouper.result_index) < len(gb._grouper.group_keys_seq)

    Aggregations on this groupby should have

        dti = date_range("2013-09-01", "2013-10-01", freq="5D", name="Date")

    As either the index or an index level.
    r   5Dkeyfreq)r   groupbylen_grouperZresult_indexZgroup_keys_seq)r!   r   tdggbr   r   r    !groupby_with_truncated_bingrouper4   s
   
r+   c                   @   s  e Zd Zdd Zejdddgdd Zdd	 Zejd
g d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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zejj d:d; Z!d<S )=TestGroupByc                 C   s  t d g dtdddddtdddddtdd	dd
dtdd	dd	dtdddddtdddddgd}|jdd}||fD ]}|dg}tddddd|jjd}t |rYdnddd|d}|dt	i}|rq|ddi}d|j
d< d|j
d < d!|j
d"< tjg d#d$d%|j
g d&df< |d }t|| | }|tdd' }	t|	| |tdd' }
t|
| q@d S )(NzCarl Carl Carl Carl Joe Carlr   r   r   r   r   r   r   r   r   r      r   r   Buyerr   r   r   byr   Z20130901Z20131205r"   left)r%   nameZ	inclusiveunit )r/   r   indexr/   strZCarlCarlCarl)r   r   ZCarlCarl)   r   Joe)r   r   )   r9   r   int64dtype)r   r9   r   r%   )r   splitr   sort_values	set_indexr
   r7   r4   astypeobjectilocnpZarrayresamplesumtmassert_frame_equal
sort_indexr&   r   )selfZusing_infer_stringdf_originaldf_reorderedr   Zexp_dtiexpectedresult1	df_sortedresult2Zresult3r   r   r    test_groupby_with_timegrouperL   sT   


 z)TestGroupBy.test_groupby_with_timegroupershould_sortTFc                 C   s   t d d g dtdddddtdddddtdd	dd
dtdd	dd	dtdddddtdddddgd}|rB|jddd}|jddd}|tdd}|jsVJ t|j	t
s^J |j}t|tshJ t|dkspJ d S )NzA A A A A BzCarl Mark Carl Joe Joe Carl)r   r   r      r   r   r   r   r   r   r   r   r   r   r-   r   ZBranchr/   r   r   r   Fr1   Z	ascendingr   ZdropZ6MEr?   r   )r   r@   r   rA   rB   r&   r   
group_keys
isinstancer(   r   groupsdictr'   )rL   rT   r   gr[   r   r   r    %test_groupby_with_timegrouper_methods   s,   
z1TestGroupBy.test_groupby_with_timegrouper_methodsc                 C   sX  t d d g dtdddddtdddddtdd	dd
dtdd	dd	dtdd	dd
dtdd	dd	dtdddddtdddddgdd}|jddd}||fD ]}t d g dtdddddtdddddtdddddgdddg}d}|tdddgjdd}t	|| t d g dtdddddtdddddtdddddtdddddgdddg}|td ddgjdd}t	|| qUt d d g dtdd	dddtdd	dddtdd	dd
dtdd	dd	dtdd	dd
dtdd	dd	dtdd	dddtdd	dddgdd}|jddd}||fD ]}t d! g d"tdd	dddtdd	dddtdd	dddtdd	dddtdd	dddgdddg}|td#ddgjdd}t	|| |td$ddgjdd}t d g dtdd	dddtdd	dddtdd	dddgdddg}t	|| |
 }|td$dd%dgjdd}t	|| tjtd&d' |td$d(d%dg  W d    n	1 sw   Y  |d}|td$dd)dgjdd}t	|| |td$dd)dgjdd}t	|| tjtd*d' |td$d(d)dg  W d    n	1 s<w   Y  | }|jtd |d< |td$dd%dgjdd}t d g dtdd+d,ddtdd+d,ddtdd+d,ddgdddg}t	|| d-}tjt|d' |td$ddd.dg  W d    n	1 sw   Y  t dggdgttdd	dddgt dd/d0}|td$djdd}t	|| |td$dgjdd}t	|| |jd|_|jjt ksJ |td$dd%jdd}t	|| |td$dd%gjdd}t	|| q*d S )1NzA A A A A A A Bz$Carl Mark Carl Carl Joe Joe Joe Carl)r   r   r   r   rU   r   r   r   r   r   r   r   r   r   r   r   r-   r   rV   r   r   FrW   zCarl Joe Mark)r   r   r      r.   r/   z!The default value of numeric_onlyYEr?   T)Znumeric_onlyzCarl Mark Carl Joe)r   r   r   r      Z6MSzCarl Joe Mark Carl Joe)r9   rU   r      r   Z1DZ1MEr%   r$   z#'The grouper name foo is not found'matchfoo)r%   levelzThe level foo is not valid      z2The Grouper cannot specify both a key and a level!)r%   r$   rg   r%   r3   columnsr7   )r   r@   r   rB   rA   r&   r   rH   rI   rJ   reset_indexpytestZraisesKeyError
ValueErrorcopyr7   r   ZMonthEndr   shiftr%   )rL   rM   rQ   r   rO   msgresultr   r   r     test_timegrouper_with_reg_groups   s<  








z,TestGroupBy.test_timegrouper_with_reg_groupsr%   )DMEr`   zQE-APRc                 C   s   t tg dg dg dg ddd}|dd |jd	d
 ddg	 
d}d|_|	 t|ddgd  }t|| |t|ddgd  }t|| d S )N)20121002Z20121007201301302013020220130305rx   Z20121207ry   rz   r{   rz   r{   )r   r   r   r   r   r   r   r   r   r   r   r   )i  il  i  i     io  Z   i8  g  i-  r~   i!  )r-      r   r;   '   r   r   r}   -   "   r   r-   )dateuser_id
whole_costZcost1r   r   r   r   )Z	min_countr<   r?   )r   r   to_datetimerB   r&   rG   rH   ZdropnaZreorder_levelsrK   rC   r3   r   rI   assert_series_equal)rL   r%   r   rO   rP   rR   r   r   r    %test_timegrouper_with_reg_groups_freqZ  s4   #&
	z1TestGroupBy.test_timegrouper_with_reg_groups_freqc                 C   s  t d g dtdddddtdddddtdd	dd
dtdd	dd	dtdddddtdddddgd}|jdd}|jg d |jddg |jdg g}g d}||fD ]$}|tddd}t||D ]\}}t|}	|	|	}
t
|
| qgqW|jdg |jdg |jdg g}g d}||fD ]*}|dtdddg}t||D ]\\}}}t|}	|	||	f}
t
|
| qq|d}|jdd}|jg d |jddg |jdg g}||fD ]#}|tdd}t||D ]\}}t|}	|	|	}
t
|
| qqd S )NzCarl Joe Joe Carl Joe Carlr   r   r   r   r   r   r   r   r   r   r-   r   r   r.   r   r0   )r   r   r   rb   )
2013-09-30
2013-10-31
2013-12-31rw   r   rc   ))r:   r   )ZCarlr   )r:   r   r/   r?   )r   r@   r   rA   rE   r&   r   zipr	   	get_grouprI   rJ   rB   )rL   rM   rN   Zexpected_listZdt_listr   groupedtrO   dtrt   Zg_listbr   r   r    test_timegrouper_get_group  sf   







z&TestGroupBy.test_timegrouper_get_groupc                 C   s   t ddgddgd}| }t|d |d< dd }d	}tjt|d
 |tdd	|}W d    n1 s;w   Y  d	}tjt|d
 |tddd	|}W d    n1 s`w   Y  t
|jdd|jdd d S )N
10/10/2000
11/10/2000r   r   r   valuer   c                 S   s   t | d  gdS )Nr   )rH   )r   rH   xr   r   r    sumfunc_series  s   zMTestGroupBy.test_timegrouper_apply_return_type_series.<locals>.sumfunc_series7DataFrameGroupBy.apply operated on the grouping columnsrd   r$   rw   rc   TrX   )r   rq   r   r   rI   assert_produces_warningFutureWarningr&   r   applyrJ   rm   )rL   r   df_dtr   rs   rO   rt   r   r   r    )test_timegrouper_apply_return_type_series  s   z5TestGroupBy.test_timegrouper_apply_return_type_seriesc                 C   s   t ddgddgd}| }t|d |d< dd }d	}tjt|d
 |tdd	|}W d    n1 s;w   Y  tjt|d
 |tddd	|}W d    n1 s^w   Y  t
|jdd|jdd d S )Nr   r   r   r   r   r   c                 S   s
   | j  S N)r   rH   r   r   r   r    sumfunc_value  s   
zKTestGroupBy.test_timegrouper_apply_return_type_value.<locals>.sumfunc_valuer   rd   r   rw   rc   TrX   )r   rq   r   r   rI   r   r   r&   r   r   r   rm   )rL   r   r   r   rs   rO   rt   r   r   r    (test_timegrouper_apply_return_type_value  s   z4TestGroupBy.test_timegrouper_apply_return_type_valuec                 C   sb   d}t dd|d}tt|t|d|d}|dd }|j}ttt|	 t
s/J d S )	Ni  z2012/1/1Z5min)startr%   periods)ZhighZlowr6   c                 S   s   t | j| j| jS r   )r   ZyearmonthZdayr   r   r   r    <lambda>  s    z?TestGroupBy.test_groupby_groups_datetimeindex.<locals>.<lambda>)r
   r   rF   aranger&   r[   rZ   nextiterkeysr   )rL   r   Zindr   r   r[   r   r   r    !test_groupby_groups_datetimeindex   s   z-TestGroupBy.test_groupby_groups_datetimeindexc           
      C   s   t dddd}tg dg dd|d}|jdd	j}g d
}dd |D }t|| |jdd	}|D ]/}||}|j|df |j|df gg}t|gdd|j	d}	t|t
d|	d}t|| q4d S )Nz
2015/01/01r   r   )r   r3   )r   r9   ra   rU   r   )r   r   r   rb   r   ABr6   rg   )z
2015-01-05z
2015-01-04z
2015-01-03z
2015-01-02z
2015-01-01c                 S   s    i | ]}t |t|gd dqS )r   r3   )r	   r   ).0r   r   r   r    
<dictcomp>  s    zBTestGroupBy.test_groupby_groups_datetimeindex2.<locals>.<dictcomp>r   r   rv   )r3   r%   r>   ZABrk   )r
   r   r&   r[   rI   Zassert_dict_equalr   locr   r>   listrJ   )
rL   r7   r   rt   datesrO   r   r   dataZexpected_indexr   r   r    "test_groupby_groups_datetimeindex2  s$   
z.TestGroupBy.test_groupby_groups_datetimeindex2c           	      C   s4  g d}t g d|tjdddddgd d	}|d
 dd |d
< tg ddd
d}tddgd dd}t||g}t g dg dd|ddgd}|d
dg	 }t
|| t|dd}t tjdddg dd|d}tg ddd}t g dg d d|ddgd}|jd!d"	 }t
|| d S )#N2011-07-19 07:00:002011-07-19 08:00:002011-07-19 09:00:00r   r   r   ar   r   r   r   r   r9   r<   r=   r   r   r   )labelr   value1value2r   c                 S   s   t | ddS )N
US/Pacifictz)r	   )dr   r   r    r   4      zBTestGroupBy.test_groupby_groups_datetimeindex_tz.<locals>.<lambda>r   r   r   r   r   r   r   )r   r3   r   r   r   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   r7   rl   z
Asia/Tokyor   r   r   r   r   r   r   r6   r   r   r   r   r   ra   r   rb   r9   r   r   )r   rF   r   r   r   r   r   from_arraysr&   rH   rI   rJ   	rL   r   r   Zexp_idx1Zexp_idx2Zexp_idxrO   rt   Zdidxr   r   r    $test_groupby_groups_datetimeindex_tz"  sN   
z0TestGroupBy.test_groupby_groups_datetimeindex_tzc                 C   sR   t dtdfdtdfgddgd}|d }|d d tdks'J d S )Nr   z
2012-07-03z
2012-07-04r   r   )rl   )r   rF   
datetime64r&   firstr	   )rL   r   rt   r   r   r    &test_frame_datetime64_handling_groupbya  s   z2TestGroupBy.test_frame_datetime64_handling_groupbyc              	   C   s   t tdg dg dd}|jdddjdd	 }ttd
ddtdddtdddtdddtdddgdtd}t	|| d}|dj
|}t|j|}tg dg ddd}t|j|}t	|| d S )Nr   )2000-01-28 16:47:002000-01-29 16:48:00z2000-01-30 16:49:002000-01-31 16:50:00z2000-01-01 16:50:00)America/Chicagor   America/Los_Angelesr   America/New_York)r   r   r   r   F)rY   c                 S   s   t | j| jS r   )r   r   r   tz_localizer3   r   r   r   r    r     s    z9TestGroupBy.test_groupby_multi_timezone.<locals>.<lambda>z2000-01-28 16:47:00-0600r   r   z2000-01-29 16:48:00-0600z2000-01-30 16:49:00-0800r   z2000-01-31 16:50:00-0600z2000-01-01 16:50:00-0500r   r   )r3   r>   )r   r   r   )r   r   r   r7   r3   )r   ranger&   r   r   r   r	   rD   rI   r   r   r   r   r   r   )rL   r   rt   rO   r   Z
res_valuesZ
exp_valuesr   r   r    test_groupby_multi_timezonej  s<   




z'TestGroupBy.test_groupby_multi_timezonec           	      C   s.  g d}t g ddd |D tjddddd	gd
 d}tjg dddd}tddgd
 dd}t||g}t g dg dd|ddgd}|ddg	 }t
|| tj|dd}t tjdddg dd|d}tjg ddd}t g dg dd|ddgd}|jd d!	 }t
|| d S )"Nr   r   c                 S   s   g | ]	}t j|d dqS )hr?   )r   ZPeriod)r   r   r   r   r    
<listcomp>  s    z;TestGroupBy.test_groupby_groups_periods.<locals>.<listcomp>r9   r<   r=   r   r   r   )r   periodr   r   r   r   r   rj   r   r   r   r   r   r   r   r   r   r   r?   r   r6   r   r   r   r   r   )r   rF   r   r   ZPeriodIndexr   r   r   r&   rH   rI   rJ   r   r   r   r    test_groupby_groups_periods  sL   
	z'TestGroupBy.test_groupby_groups_periodsc                 C   s   t ddg}|d d|d< t|d jjtjsJ |jdd }|d j}t|jtjs1J |d jdd }|j}t|jtjsGJ d S )N)r        |>c )r   r   r   zM8[ns]r   r   )	r   rC   
issubclassr>   typerF   r   r&   r   )rL   r   rt   Zgot_dtr   r   r    test_groupby_first_datetime64  s   
z)TestGroupBy.test_groupby_first_datetime64c                 C   sX   t tdtdd}|dd dd d}|dd  }t	|| d S )NZ20130101r   r   r   c                 S   s   |   S r   )maxr   r   r   r    r     s    z9TestGroupBy.test_groupby_max_datetime64.<locals>.<lambda>zM8[s])
r   r	   rF   r   r&   r   rC   r   rI   r   )rL   r   rO   rt   r   r   r    test_groupby_max_datetime64  s   z'TestGroupBy.test_groupby_max_datetime64c                 C   sV   t tdtdgd d}|dd d}ttdgd dd}t|| d S )Nr   z	2000-01-1r   r   r   minr   )r   r   r	   r&   Z	transformr   rI   r   rL   r   rt   rO   r   r   r    test_groupby_datetime64_32_bit  s   z*TestGroupBy.test_groupby_datetime64_32_bitc                 C   sb   t tjdjddddtddddd	d
}|d d }|dd  }t	|| d S )Nr   r   r   <   )sizez01/01/2000 00:00sZUTC)r   r%   r   )factortimer   r   )
r   rF   ZrandomZdefault_rngZintegersr
   r&   r   rI   r   )rL   r   Zdf1Zdf2r   r   r    $test_groupby_with_timezone_selection  s   z0TestGroupBy.test_groupby_with_timezone_selectionc                 C   sn   t dgttjgd}|d d jtjksJ t dg di}ttj|d< |d d jtjks5J d S )Nr   )r   r   r   r   r   r   r   r   )r   r   nowpytzZutcZtzinfo)rL   r   r   r   r    test_timezone_info  s
   zTestGroupBy.test_timezone_infoc                 C   s^   t g dd tddddd}|dj }tg d	tg ddd
dd}t|| d S )Nr   r   r   r9   r   )r   r%   )r   r   r   )r   r   r   r   r   r   )	r   r
   r&   r   countr   r   rI   r   r   r   r   r    test_datetime_count  s   zTestGroupBy.test_datetime_countc                 C   s   t tjdddtjgtjtddtddtddtjgd}t|j|_d	|d
< ||j  }|d
}|d
}t	
| |  t	
| |  t	
| |  t	
| |  d S )Nz2015-07-24 10:10z2015-07-25 11:11z2015-07-23 12:12r   )Zdaysr   r   )r   Ztdr   group)r   rF   nanr   r   r   r   Znotnar&   rI   rJ   r   r   r   Zlast)rL   Zdf_testZdf_refZgrouped_testZgrouped_refr   r   r    $test_first_last_max_min_on_time_data  s0   

z0TestGroupBy.test_first_last_max_min_on_time_datac                 C   sz   t tdtjtdgg dd}tddd}||d  }||j  |d  }|j	
d |_	t|| d S )	Nz2016-06-28 09:35:35z2016-06-28 16:46:28)123)r   r   r   r   r#   r   )r   r	   r   r   r   r&   Znuniquer   Znotnullr7   
_with_freqrI   r   )rL   testgrouperrt   rO   r   r   r    %test_nunique_with_timegrouper_and_nat;  s   z1TestGroupBy.test_nunique_with_timegrouper_and_natc                 C   sn   g dt g dddg dd}t|d}tdd	}||}| }||g}| }t|| d S )
N)shanghaiZbeijingr  )z2017-08-09 13:32:23z2017-08-11 23:23:15z2017-08-11 22:23:15zdatetime64[ns]r=   r   )locationr   r   r   rv   r?   )r   r   rB   r   r&   r   rI   rJ   )rL   Z
data_framer  r   rt   rO   r   r   r    !test_scalar_call_versus_list_callN  s   

z-TestGroupBy.test_scalar_call_versus_list_callc                 C   sl   d}t jd|ddd}tt||d}||jj }tt|ttd|d |j	dd}t
|| d S )	Nr   z2018-01MZMonth)r   r   r%   r3   r6   r   r   )r   Zperiod_ranger   r   r&   r7   r   rH   r   r3   rI   r   )rL   r   r7   Zperiod_seriesrt   rO   r   r   r    test_grouper_period_indexb  s   z%TestGroupBy.test_grouper_period_indexc           	      C   st   |}|d  dd }|j}|d jj}tdddd|d}t|d	gt| g}tg d
|dd}t	
|| d S )Nr   c                 S   s   dt | iS )Nrf   )r'   r   r   r   r    r   x  r   zRTestGroupBy.test_groupby_apply_timegrouper_with_nat_dict_returns.<locals>.<lambda>r   
2013-09-01
2013-10-01r"   r%   r3   r4   rf   )r   r   r   r   r   r   r   r   )r   obj_valuesr4   r
   r   r   r'   r   rI   r   )	rL   r+   r*   resr   r4   dtimirO   r   r   r    4test_groupby_apply_timegrouper_with_nat_dict_returnsp  s   z@TestGroupBy.test_groupby_apply_timegrouper_with_nat_dict_returnsc                 C   sv   |}|d  dd }|j}|d jj}tdddd|d}td	tjtjtjtjtjd
g|d dd}t	
|| d S )Nr   c                 S   s   t | r	| jd S tjS )Nr   )r'   rE   rF   r   r   r   r   r    r     s    zTTestGroupBy.test_groupby_apply_timegrouper_with_nat_scalar_returns.<locals>.<lambda>r   r  r	  r"   r
  r   r   r   )r   r  r  r4   r
   r   rF   r   r   rI   r   )rL   r+   r*   r  r   r4   r  rO   r   r   r    6test_groupby_apply_timegrouper_with_nat_scalar_returns  s   zBTestGroupBy.test_groupby_apply_timegrouper_with_nat_scalar_returnsc           	      C   s   |}t ddd}||}|jdksJ |j|jjdks J d}tjt	|d |
dd }W d    n1 s;w   Y  ttd	g|d jdd
}tg dg|tg dddd}t|| d S )Nr   Z100YEr#   r   r   rd   c                 S   s   | d d S )Nr   r   r   r   r   r   r    r     r   zSTestGroupBy.test_groupby_apply_timegrouper_with_nat_apply_squeeze.<locals>.<lambda>r   )r>   r3   )$   r9   r9   r   r   )r   r   r   r   r   r   r   r   )r   r&   ZngroupsZ_selected_objZ	_get_axisZaxisZnlevelsrI   r   r   r   r   r	   r>   r   rJ   )	rL   r!   r   r)   r*   rs   r  r  rO   r   r   r    5test_groupby_apply_timegrouper_with_nat_apply_squeeze  s    
zATestGroupBy.test_groupby_apply_timegrouper_with_nat_apply_squeezec                 C   sv   t d |}|d jdd dd}|d d}t|| |dg jdd dd}|dg d}t|| d S )NZnumbar   c                 S   
   t | S r   rF   Znanmeanvaluesr7   r   r   r    r        
 zITestGroupBy.test_groupby_agg_numba_timegrouper_with_nat.<locals>.<lambda>)ZengineZmeanc                 S   r  r   r  r  r   r   r    r     r  )rn   ZimportorskipZ	aggregaterI   r   rJ   )rL   r+   r*   rt   rO   Z	result_dfZexpected_dfr   r   r    +test_groupby_agg_numba_timegrouper_with_nat  s   

z7TestGroupBy.test_groupby_agg_numba_timegrouper_with_natN)"__name__
__module____qualname__rS   rn   ZmarkZparametrizer^   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  Z
single_cpur  r   r   r   r    r,   K   s@    8
  6
:B?	2=		
"r,   )__doc__r   r   ZnumpyrF   rn   r   Zpandasr   r   r   r   r   r   r	   r
   r   Zpandas._testingZ_testingrI   Zpandas.core.groupby.grouperr   Zpandas.core.groupby.opsr   Zfixturer!   r+   r,   r   r   r   r    <module>   s    (


