U
    >vfD                     @  s  d dl mZ d dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZmZmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z' ddddddddddddddddddddddddddddZ(ddddd d!d"d#d$g	Z)e)D ],Z*eD ] Z+e* d%e+ Z,e(e* e(e,< q.q&d&D ](Z*eD ]Z+e* d%e+ Z-e-e(e-< q`qXeD ]Z.d'e. e(d'e. < qd(d)d*d+d,Z/d)d-d.d/Z0G d0d1 d1Z1G d2d3 d3e1Z2d4d5d6d7d8Z3d(d9d(d:d;d<Z4d5d-d=d>Z5d5d-d?d@Z6d(d-dAdBZ7d(d(d5dCdDdEZ8d(d5dFdGdHZ9d(d5dFdIdJZ:d(d5dFdKdLZ;d(d5dFdMdNZ<dOd,d/d>d@dPgZ=dS )Q    )annotationsN)unique_deltas)	Timestampget_unit_from_dtypeperiods_per_daytz_convert_from_utc)DAYSMONTH_ALIASESMONTH_NUMBERSMONTHSint_to_weekday)build_field_sarraymonth_position_check)
DateOffsetDay	to_offset)get_rule_month)npt)cache_readonly)is_datetime64_dtypeis_numeric_dtypeis_period_dtypeis_timedelta64_dtype)ABCIndex	ABCSeries)uniqueDMQACBTSLUNHW)ZWEEKDAYZEOMBMBQSQSBQBAASBASMSr   r    r!   r"   r#   r$   r%   r&   r'   r   r   r(   r   YBYYSBYSr+   r,   r*   r3   r.   r2   r-   r4   r/   -)r   r   W-str
str | None)
offset_strreturnc                 C  s   t | dS )z4
    Alias to closest period strings BQ->Q etc.
    N)_offset_to_period_mapget)r9    r=   >/tmp/pip-unpacked-wheel-vdrwu74i/pandas/tseries/frequencies.pyget_period_alias^   s    r?   r:   c                 C  s   ddl m}m} t| trN| j}t|sJt|sJ|jt	ksJt
d| j |} t| dsZn.t| jrnt
dnt| jrt| }| S t| |rt| |st| rt
d| j | j} t| |s|| } t| }| S )aC  
    Infer the most likely frequency given the input index.

    Parameters
    ----------
    index : DatetimeIndex or TimedeltaIndex
      If passed a Series will use the values of the series (NOT THE INDEX).

    Returns
    -------
    str or None
        None if no discernible frequency.

    Raises
    ------
    TypeError
        If the index is not datetime-like.
    ValueError
        If there are fewer than three values.

    Examples
    --------
    >>> idx = pd.date_range(start='2020/12/01', end='2020/12/30', periods=30)
    >>> pd.infer_freq(idx)
    'D'
    r   )DatetimeIndexIndexz>cannot infer freq from a non-convertible dtype on a Series of dtypezJPeriodIndex given. Check the `freq` attribute instead of using infer_freq.z8cannot infer freq from a non-convertible index of dtype )Zpandas.core.apirA   rB   
isinstancer   Z_valuesr   r   rC   object	TypeErrorhasattrr   _TimedeltaFrequencyInfererget_freqr   _FrequencyInferer)indexrA   rB   valuesZinfererr=   r=   r>   
infer_freqi   s@    






rM   c                   @  sP  e Zd ZdZddddZeddddZeddd	d
ZeddddZeddddZ	ddddZ
eddddZeddddZeddddZeddddZddddZeddd d!Zeddd"d#Zddd$d%Zddd&d'Zddd(d)Zddd*d+Zddd,d-Zddd.d/Zddd0d1Zd2S )3rJ   z8
    Not sure if I can avoid the state machine here
    Noner@   c                 C  s   || _ |j| _t|tr*t|jjj| _	nt|jj| _	t
|drb|jd k	rbt| j|j| j	d| _t|dk rvtd| j jp| j j| _d S )NtzZreso   z(Need at least 3 dates to infer frequency)rK   asi8i8valuesrD   r   r   _dataZ_ndarrayrC   _cresorG   rO   r   len
ValueErrorZ_is_monotonic_increasingZ_is_monotonic_decreasingis_monotonic)selfrK   r=   r=   r>   __init__   s$    


  z_FrequencyInferer.__init__znpt.NDArray[np.int64]c                 C  s
   t | jS N)r   rS   rY   r=   r=   r>   deltas   s    z_FrequencyInferer.deltasc                 C  s   t | jjS r[   )r   rK   rR   r\   r=   r=   r>   deltas_asi8   s    z_FrequencyInferer.deltas_asi8boolc                 C  s   t | jdkS N   )rV   r]   r\   r=   r=   r>   	is_unique   s    z_FrequencyInferer.is_uniquec                 C  s   t | jdkS r`   )rV   r^   r\   r=   r=   r>   is_unique_asi8   s    z _FrequencyInferer.is_unique_asi8r8   c                 C  s"  | j r| jjsdS | jd }t| j}|r<t||r<|  S | jddgddgdddgfkr^dS | j	shdS | j
d }|d }|d }|d }t||rtd	|| S t||rtd
|| S t||rtd|| S t||d rtd||d  S t||d rtd||d  S td|S dS )z
        Find the appropriate frequency string to describe the inferred
        frequency of self.i8values

        Returns
        -------
        str or None
        Nr   ra      A   ZBH   <   r'   r"   r#   i  r$   i@B r%   r&   )rX   rK   Z
_is_uniquer]   r   rU   _is_multiple_infer_daily_rulehour_deltasrc   r^   _maybe_add_count)rY   deltappdpphppmZppsr=   r=   r>   rI      s2    	





z_FrequencyInferer.get_freqz	list[int]c                   s   t | j  fdd| jD S )Nc                   s   g | ]}|  qS r=   r=   .0xrm   r=   r>   
<listcomp>  s     z0_FrequencyInferer.day_deltas.<locals>.<listcomp>r   rU   r]   r\   r=   rs   r>   
day_deltas  s    
z_FrequencyInferer.day_deltasc                   s"   t | jd   fdd| jD S )Nrf   c                   s   g | ]}|  qS r=   r=   rp   rn   r=   r>   rt   "  s     z1_FrequencyInferer.hour_deltas.<locals>.<listcomp>ru   r\   r=   rw   r>   rj     s    z_FrequencyInferer.hour_deltasz
np.ndarrayc                 C  s   t | j| jdS )NrP   )r   rS   rU   r\   r=   r=   r>   fields$  s    z_FrequencyInferer.fieldsr   c                 C  s   t | jd S Nr   )r   rS   r\   r=   r=   r>   	rep_stamp(  s    z_FrequencyInferer.rep_stampc                 C  s   t | j| jjS r[   )r   rx   rK   Z	dayofweekr\   r=   r=   r>   r   ,  s    z&_FrequencyInferer.month_position_checkc                 C  s&   | j d d | j d  }t|dS )Nr1      r   i8)rx   r   astype)rY   Znmonthsr=   r=   r>   mdiffs/  s    z_FrequencyInferer.mdiffsc                 C  s   t | jd dS )Nr1   r|   )r   rx   r}   r\   r=   r=   r>   ydiffs4  s    z_FrequencyInferer.ydiffsc           
      C  s   |   }|r:| jd }t| jj }| d| }t||S |  }|r| jd d }dddd}t|| jjd   }| d| }t||S |  }|rt|| jd S | j	r| 
 S |  rdS |  }	|	r|	S d S )	Nr   r5   rQ   r{      
   )r      ra   r!   )_get_annual_ruler   r	   rz   monthrk   _get_quarterly_ruler~   _get_monthly_rulerb   _get_daily_rule_is_business_daily_get_wom_rule)
rY   Zannual_ruleZnyearsr   aliasZquarterly_ruleZ	nquartersmod_dictZmonthly_ruleZwom_ruler=   r=   r>   ri   8  s0    


z#_FrequencyInferer._infer_daily_rulec                 C  sX   t | j}| jd | }|d dkrJt| j  }d| }t||d S td|S d S )Nr      r6   r   )r   rU   r]   r   rz   weekdayrk   )rY   rm   dayswdr   r=   r=   r>   r   X  s    

z!_FrequencyInferer._get_daily_rulec                 C  sX   t | jdkrd S t t| jd dkr,d S |  }|d kr@d S ddddd|S d S )Nra   r   r.   r/   r   r-   csbsZcebe)rV   r   r   rx   r   r<   rY   Z	pos_checkr=   r=   r>   r   c  s    z"_FrequencyInferer._get_annual_rulec                 C  sT   t | jdkrd S | jd d dks(d S |  }|d kr<d S ddddd|S d S )	Nra   r   rQ   r+   r*   r   r,   r   rV   r~   r   r<   r   r=   r=   r>   r   q  s    z%_FrequencyInferer._get_quarterly_rulec                 C  s>   t | jdkrd S |  }|d kr&d S ddddd|S d S )Nra   r0   ZBMSr   r)   r   r   r   r=   r=   r>   r     s    z#_FrequencyInferer._get_monthly_rulec                 C  s   | j ddgkrdS | jd  }t| j}t| j}t||}t	|t
| d}tt|dk|dk@ |dk|dk@ |dk@ B S )Nra   rQ   Fr   r      )rv   rK   r   npZdiffrS   r   rU   Zfloor_dividemodZcumsumr_   all)rY   Zfirst_weekdayZshiftsrm   weekdaysr=   r=   r>   r     s    
z$_FrequencyInferer._is_business_dailyc                 C  s~   t | jj}t|dkrd S t | jjd d }||dk  }t|dksTt|dkrXd S |d d }t|d  }d| | S )Nra   r   r   r   zWOM-)r   rK   r   rV   dayr   )rY   r   Zweek_of_monthsweekr   r=   r=   r>   r     s    z_FrequencyInferer._get_wom_ruleN)__name__
__module____qualname____doc__rZ   r   r]   r^   rb   rc   rI   rv   rj   rx   rz   r   r~   r   ri   r   r   r   r   r   r   r=   r=   r=   r>   rJ      s>   2 
rJ   c                   @  s   e Zd Zdd ZdS )rH   c                 C  s   | j r|  S d S r[   )rb   r   r\   r=   r=   r>   ri     s    z,_TimedeltaFrequencyInferer._infer_daily_ruleN)r   r   r   ri   r=   r=   r=   r>   rH     s   rH   intr_   )multr:   c                 C  s   | | dkS ry   r=   )usr   r=   r=   r>   rh     s    rh   float)basecountr:   c                 C  s4   |dkr,|t |kstt |}| |  S | S d S r`   )r   AssertionError)r   r   r=   r=   r>   rk     s
    rk   c                 C  s2  |dks| dkrdS t | } t |}t|rNt| rFtt| t|S | dkS t|r^| dkS t|rn| dkS t|r| |ddddd	d
dddh
kS |dkr| dkS |dkr| dkS |dkr| dkS |dkr| dkS |d	kr| dkS |d
k r| dkS |dkr| dkS |dkr| dkS |dkr*| dkS dS dS )a  
    Returns True if downsampling is possible between source and target
    frequencies

    Parameters
    ----------
    source : str or DateOffset
        Frequency converting from
    target : str or DateOffset
        Frequency converting to

    Returns
    -------
    bool
    NF
   r$   r    r'   r   r"   r&   r%   r!   r   r#   	   r$   r    r'   r&   r"   r%   r!   r   r#   r   r    r!   r'   r"   r#   r$   r%   r&   >   r$   r'   r&   r"   r%   r!   r#   >   r$   r    r'   r&   r"   r%   r#   >   r$   r'   r&   r"   r%   r   r#      r$   r'   r&   r"   r%   r#      r$   r&   r"   r%   r#      r#   r&   r%   r$      r&   r%   r$      r&   r%      r&   )_maybe_coerce_freq
_is_annual_is_quarterly_quarter_months_conformr   _is_monthly
_is_weekly)sourcetargetr=   r=   r>   is_subperiod  sH     



r   c                 C  sV  |dks| dkrdS t | } t |}t| rnt|rDt| t|kS t|rft| }t|}t||S |dkS t| r~|dkS t| r|dkS t| r|| ddddd	d
dddh
kS | dkr|dkS | dkr|dkS | dkr|dkS | dk r|dkS | d	kr|dkS | d
kr|dkS | dkr*|dkS | dkr<|dkS | dkrN|dkS dS dS )a  
    Returns True if upsampling is possible between source and target
    frequencies

    Parameters
    ----------
    source : str or DateOffset
        Frequency converting from
    target : str or DateOffset
        Frequency converting to

    Returns
    -------
    bool
    NFr   r   r   r    r!   r'   r"   r#   r$   r%   r&   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   ZsmonthZtmonthr=   r=   r>   is_superperiod  sJ    






r   c                 C  s$   | dk	st t| tr| j} |  S )zwe might need to coerce a code to a rule_code
    and uppercase it

    Parameters
    ----------
    source : str or DateOffset
        Frequency converting from

    Returns
    -------
    str
    N)r   rD   r   Z	rule_codeupper)coder=   r=   r>   r   7  s    
r   )r   r   r:   c                 C  s    t |  }t | }|d |d kS )NrQ   )r
   )r   r   ZsnumZtnumr=   r=   r>   r   J  s    r   )ruler:   c                 C  s   |   } | dkp| dS )Nr   zA-r   
startswithr   r=   r=   r>   r   P  s    r   c                 C  s$   |   } | dkp"| dp"| dS )Nr   zQ-r,   r   r   r=   r=   r>   r   U  s    r   c                 C  s   |   } | dkS )N)r   r)   )r   r   r=   r=   r>   r   Z  s    r   c                 C  s   |   } | dkp| dS )Nr(   r6   r   r   r=   r=   r>   r   _  s    r   r   r   )>
__future__r   Znumpyr   Zpandas._libs.algosr   Zpandas._libs.tslibsr   r   r   r   Zpandas._libs.tslibs.ccalendarr   r	   r
   r   r   Zpandas._libs.tslibs.fieldsr   r   Zpandas._libs.tslibs.offsetsr   r   r   Zpandas._libs.tslibs.parsingr   Zpandas._typingr   Zpandas.util._decoratorsr   Zpandas.core.dtypes.commonr   r   r   r   Zpandas.core.dtypes.genericr   r   Zpandas.core.algorithmsr   r;   Z_need_suffix_prefix_mkey_aliasZ_dr?   rM   rJ   rH   rh   rk   r   r   r   r   r   r   r   r   __all__r=   r=   r=   r>   <module>   s   I }8: