U
    sVc|I                     @  s  d dl mZ d dl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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l#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/ Z0e,e. e,e0< qFq>d'D ](Z.eD ]Z/e. d&e/ Z1e1e,e1< qxqpeD ]Z2d(e2 e,d(e2 < qd)d*d+d,d-Z3d)d.d/d0d1Z4dXd3d*d4d5d6Z5G d7d8 d8Z6G d9d: d:e6Z7d;d3d<d=d>Z8d)d?d)d@dAdBZ9d3dCdDdEZ:d3dCdFdGZ;d)dCdHdIZ<d)d)d3dJdKdLZ=d)d3dMdNdOZ>d)d3dMdPdQZ?d)d3dMdRdSZ@d)d3dMdTdUZAdVd1d-d6dEdGdWgZBdS )Y    )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)
BaseOffset
DateOffsetDay_get_offset	to_offset)get_rule_month)npt)cache_readonly)find_stack_level)is_datetime64_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,   r5   r0   r4   r/   r6   r1   -)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)r;    r?   >/tmp/pip-unpacked-wheel-xj8nt62q/pandas/tseries/frequencies.pyget_period_aliasb   s    rA   r   )namer<   c                 C  s   t jdtt d t| S )z
    Return DateOffset object associated with rule name.

    .. deprecated:: 1.0.0

    Examples
    --------
    get_offset('EOM') --> BMonthEnd(1)
    zXget_offset is deprecated and will be removed in a future version, use to_offset instead.
stacklevel)warningswarnFutureWarningr   r   )rB   r?   r?   r@   
get_offseti   s    
rH   TboolrF   r<   c                 C  s   ddl m}m}m}m} t| trV| j}t|sRt	|sR|j
tksRtd| j
 |} t| dsbn2t| j
rvtdnt	| j
rt| |d}| S t| |rt| |st| ||frtdt|  | j} t| |s|| } t| |d}| S )a}  
    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).
    warn : bool, default True
      .. deprecated:: 1.5.0

    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Float64IndexIndex
Int64Indexz>cannot infer freq from a non-convertible dtype on a Series of dtypezJPeriodIndex given. Check the `freq` attribute instead of using infer_freq.)rF   z4cannot infer freq from a non-convertible index type )Zpandas.core.apirK   rL   rM   rN   
isinstancer   Z_valuesr   r   rO   object	TypeErrorhasattrr   _TimedeltaFrequencyInfererget_freqtype_FrequencyInferer)indexrF   rK   rL   rM   rN   valuesZinfererr?   r?   r@   
infer_freq   s@    





rZ   c                   @  sT  e Zd ZdZd5d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	d0d1Zdd	d2d3Zd4S )6rW   z8
    Not sure if I can avoid the state machine here
    TrI   NonerJ   c                 C  s   || _ |j| _t|tr*t|jjj| _	nt|jj| _	t
|dr\|jd k	r\t| j|j| _|dk	rvtjdtt d || _t|dk rtd| j jp| j j| _d S )NtzTzSwarn is deprecated (and never implemented) and will be removed in a future version.rC      z(Need at least 3 dates to infer frequency)rX   asi8i8valuesrP   r   r   _dataZ_ndarrayrO   _resorS   r\   r   rE   rF   rG   r   len
ValueErrorZ_is_monotonic_increasingZ_is_monotonic_decreasingis_monotonic)selfrX   rF   r?   r?   r@   __init__   s*    


z_FrequencyInferer.__init__znpt.NDArray[np.int64]r<   c                 C  s
   t | jS N)r   r_   re   r?   r?   r@   deltas   s    z_FrequencyInferer.deltasc                 C  s   t | jjS rh   )r   rX   r^   ri   r?   r?   r@   deltas_asi8   s    z_FrequencyInferer.deltas_asi8c                 C  s   t | jdkS N   )rb   rj   ri   r?   r?   r@   	is_unique  s    z_FrequencyInferer.is_uniquec                 C  s   t | jdkS rl   )rb   rk   ri   r?   r?   r@   is_unique_asi8  s    z _FrequencyInferer.is_unique_asi8r:   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   rm      A   ZBH   <   r)   r$   r%   i  r&   i@B r'   r(   )rd   rX   Z
_is_uniquerj   r   ra   _is_multiple_infer_daily_rulehour_deltasro   rk   _maybe_add_count)re   deltappdpphppmZppsr?   r?   r@   rU   
  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ry   r?   r@   
<listcomp>?  s     z0_FrequencyInferer.day_deltas.<locals>.<listcomp>r   ra   rj   ri   r?   r   r@   
day_deltas<  s    
z_FrequencyInferer.day_deltasc                   s"   t | jd   fdd| jD S )Nrr   c                   s   g | ]}|  qS r?   r?   r|   rz   r?   r@   r   D  s     z1_FrequencyInferer.hour_deltas.<locals>.<listcomp>r   ri   r?   r   r@   rv   A  s    z_FrequencyInferer.hour_deltasz
np.ndarrayc                 C  s   t | j| jdS )N)Zreso)r   r_   ra   ri   r?   r?   r@   fieldsF  s    z_FrequencyInferer.fieldsr   c                 C  s   t | jd S Nr   )r   r_   ri   r?   r?   r@   	rep_stampJ  s    z_FrequencyInferer.rep_stampc                 C  s   t | j| jjS rh   )r   r   rX   Z	dayofweekri   r?   r?   r@   r   N  s    z&_FrequencyInferer.month_position_checkc                 C  s&   | j d d | j d  }t|dS )Nr3      r   i8)r   r   astype)re   Znmonthsr?   r?   r@   mdiffsQ  s    z_FrequencyInferer.mdiffsc                 C  s   t | jd dS )Nr3   r   )r   r   r   ri   r?   r?   r@   ydiffsV  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   r7   r]   r      
   )r      rm   r#   )_get_annual_ruler   r	   r   monthrw   _get_quarterly_ruler   _get_monthly_rulern   _get_daily_rule_is_business_daily_get_wom_rule)
re   Zannual_ruleZnyearsr   aliasZquarterly_ruleZ	nquartersmod_dictZmonthly_ruleZwom_ruler?   r?   r@   ru   Z  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      r8   r   )r   ra   rj   r   r   weekdayrw   )re   ry   dayswdr   r?   r?   r@   r   z  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 )Nrm   r   r0   r1   r!   r/   csbsZcebe)rb   r   r   r   r   r>   re   Z	pos_checkr?   r?   r@   r     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 )	Nrm   r   r]   r-   r,   r    r.   r   rb   r   r   r>   r   r?   r?   r@   r     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 )Nrm   r2   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j}t| j}t||}t	|t
| d}tt|dk|dk@ |dk|dk@ |dk@ B S )Nrm   r]   Fr   r      )r   rX   r   npZdiffr^   r   ra   Zfloor_dividemodZcumsumrI   all)re   Zfirst_weekdayZshiftsry   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 )Nrm   r   r   r   zWOM-)r   rX   r   rb   dayr   )re   r   Zweek_of_monthsweekr   r?   r?   r@   r     s    z_FrequencyInferer._get_wom_ruleN)T)__name__
__module____qualname____doc__rf   r   rj   rk   rn   ro   rU   r   rv   r   r   r   r   r   ru   r   r   r   r   r   r   r?   r?   r?   r@   rW      s>   &2 
rW   c                   @  s   e Zd Zdd ZdS )rT   c                 C  s   | j r|  S d S rh   )rn   r   ri   r?   r?   r@   ru     s    z,_TimedeltaFrequencyInferer._infer_daily_ruleN)r   r   r   ru   r?   r?   r?   r@   rT     s   rT   int)multr<   c                 C  s   | | dkS r   r?   )usr   r?   r?   r@   rt     s    rt   float)basecountr<   c                 C  s4   |dkr,|t |kstt |}| |  S | S d S rl   )r   AssertionError)r   r   r?   r?   r@   rw     s
    rw   rg   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   rP   r   Z	rule_codeupper)coder?   r?   r@   r   _  s    
r   )r   r   r<   c                 C  s    t |  }t | }|d |d kS )Nr]   )r
   )r   r   ZsnumZtnumr?   r?   r@   r   r  s    r   )ruler<   c                 C  s   |   } | dkp| dS )Nr!   zA-r   
startswithr   r?   r?   r@   r   x  s    r   c                 C  s$   |   } | dkp"| dp"| dS )Nr    zQ-r.   r   r   r?   r?   r@   r   }  s    r   c                 C  s   |   } | dkp| dkS )Nr   r+   )r   r   r?   r?   r@   r     s    r   c                 C  s   |   } | dkp| dS )Nr*   r8   r   r   r?   r?   r@   r     s    r   r   r   )T)C
__future__r   rE   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   r   r   Zpandas._libs.tslibs.parsingr   Zpandas._typingr   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.core.dtypes.commonr   r   r   Zpandas.core.dtypes.genericr   r   Zpandas.core.algorithmsr   r=   Z_need_suffix_prefix_mkey_aliasZ_drA   rH   rZ   rW   rT   rt   rw   r   r   r   r   r   r   r   r   __all__r?   r?   r?   r@   <module>   s   M  8: