3
pdB                 @   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	 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 d dlmZ d d	lmZ d d
lmZmZmZ d dl m!Z! d dl"m#Z# dZ$e$d Z%e%d Z&de& Z'de' Z(de( 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+x8e+D ]0Z,x(eD ] Z-e, d'e- Z.e*e, e*e.< qNW qDW x4dPD ],Z,x$eD ]Z-e, d'e- Z/e/e*e/< qW q~W x"eD ]Z0d(e0 e*d(e0 < qW e1ee1 d)d*d+Z2e1ed,d-d.Z3dQe4ee1 d0d1d2Z5G d3d4 d4Z6G d5d6 d6e6Z7e8e4d7d8d9Z9e1e:e1d:d;d<Z;e4d=d>d?Z<e4d=d@dAZ=e1d=dBdCZ>e1e1e4dDdEdFZ?e1e4dGdHdIZ@e1e4dGdJdKZAe1e4dGdLdMZBe1e4dGdNdOZCdS )R    )OptionalN)unique_deltas)	Timestamptzconversion)DAYSMONTH_ALIASESMONTH_NUMBERSMONTHSint_to_weekday)build_field_sarraymonth_position_check)
DateOffsetDay_get_offset	to_offset)get_rule_month)cache_readonly)is_datetime64_dtypeis_period_dtypeis_timedelta64_dtype)	ABCSeries)uniquei  <      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(   r1   r,   r0   r+   r2   r-   -zW-)
offset_strreturnc             C   s   t j| dS )z4
    Alias to closest period strings BQ->Q etc.
    N)_offset_to_period_mapget)r4    r8   </tmp/pip-build-7vycvbft/pandas/pandas/tseries/frequencies.pyget_period_aliasZ   s    r:   )namer5   c             C   s   t jdtdd t| S )z
    Return DateOffset object associated with rule name.

    .. deprecated:: 1.0.0

    Examples
    --------
    get_offset('EOM') --> BMonthEnd(1)
    zWget_offset is deprecated and will be removed in a future version, use to_offset instead   )
stacklevel)warningswarnFutureWarningr   )r;   r8   r8   r9   
get_offseta   s
    
rA   T)r?   r5   c             C   s   ddl }t| trF| j}t|p0t|p0|jtksBtd| j |} t	| dsRn2t
| jrftdnt| jrt| |d}|j S t| |jrt| |j rt| |j|jfrtdt|  | j} t| |js|j| } t| |d}|j S )a  
    Infer the most likely frequency given the input index. If the frequency is
    uncertain, a warning will be printed.

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

    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.
    r   Nz>cannot infer freq from a non-convertible dtype on a Series of dtypezJPeriodIndex given. Check the `freq` attribute instead of using infer_freq.)r?   z4cannot infer freq from a non-convertible index type )Zpandas
isinstancer   Z_valuesr   r   rB   object	TypeErrorhasattrr   _TimedeltaFrequencyInfererget_freqIndexZDatetimeIndexZ
Int64IndexZFloat64Indextype_FrequencyInferer)indexr?   pdvaluesZinfererr8   r8   r9   
infer_freqx   s4    





rO   c               @   s&  e Zd ZdZd,edddZedd Zedd	 Zeed
ddZ	eed
ddZ
ee d
ddZedd Zedd Zedd Zedd Zdd Zedd Zedd Zee d
dd Zee d
d!d"Zee d
d#d$Zee d
d%d&Zed
d'd(Zee d
d)d*Zd+S )-rK   z8
    Not sure if I can avoid the state machine here
    T)r?   c             C   sd   || _ |j| _t|dr4|jd k	r4tj| j|j| _|| _t|dk rNt	d| j j
p\| j j| _d S )Ntz   z(Need at least 3 dates to infer frequency)rL   asi8i8valuesrF   rP   r   Ztz_convert_from_utcr?   len
ValueErrorZ_is_monotonic_increasingZ_is_monotonic_decreasingis_monotonic)selfrL   r?   r8   r8   r9   __init__   s    

z_FrequencyInferer.__init__c             C   s
   t | jS )N)r   rS   )rW   r8   r8   r9   deltas   s    z_FrequencyInferer.deltasc             C   s   t | jjS )N)r   rL   rR   )rW   r8   r8   r9   deltas_asi8   s    z_FrequencyInferer.deltas_asi8)r5   c             C   s   t | jdkS )N   )rT   rY   )rW   r8   r8   r9   	is_unique   s    z_FrequencyInferer.is_uniquec             C   s   t | jdkS )Nr[   )rT   rZ   )rW   r8   r8   r9   is_unique_asi8   s    z _FrequencyInferer.is_unique_asi8c             C   s   | j  s| jj rdS | jd }t|tr2| j S | jddgddgdddgfkrTdS | js^dS | j	d }t|t
rtd|t
 S t|trtd|t S t|trtd	|t S t|trtd
|t S t|trtd|t 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   r[      A   ZBHr%   r    r!   r"   r#   r$   )rV   rL   Z
_is_uniquerY   _is_multiple_ONE_DAY_infer_daily_rulehour_deltasr]   rZ   	_ONE_HOUR_maybe_add_count_ONE_MINUTE_ONE_SECOND
_ONE_MILLI
_ONE_MICRO)rW   deltar8   r8   r9   rH      s*    	







z_FrequencyInferer.get_freqc             C   s   dd | j D S )Nc             S   s   g | ]}|t  qS r8   )ra   ).0xr8   r8   r9   
<listcomp>  s    z0_FrequencyInferer.day_deltas.<locals>.<listcomp>)rY   )rW   r8   r8   r9   
day_deltas  s    z_FrequencyInferer.day_deltasc             C   s   dd | j D S )Nc             S   s   g | ]}|t  qS r8   )rd   )rk   rl   r8   r8   r9   rm     s    z1_FrequencyInferer.hour_deltas.<locals>.<listcomp>)rY   )rW   r8   r8   r9   rc     s    z_FrequencyInferer.hour_deltasc             C   s
   t | jS )N)r   rS   )rW   r8   r8   r9   fields  s    z_FrequencyInferer.fieldsc             C   s   t | jd S )Nr   )r   rS   )rW   r8   r8   r9   	rep_stamp  s    z_FrequencyInferer.rep_stampc             C   s   t | j| jjS )N)r   ro   rL   Z	dayofweek)rW   r8   r8   r9   r   #  s    z&_FrequencyInferer.month_position_checkc             C   s&   | j d d | j d  }t|jdS )Nr/      r   i8)ro   r   astype)rW   Znmonthsr8   r8   r9   mdiffs&  s    z_FrequencyInferer.mdiffsc             C   s   t | jd jdS )Nr/   rr   )r   ro   rs   )rW   r8   r8   r9   ydiffs+  s    z_FrequencyInferer.ydiffsc             C   s  | j  }|r:| jd }t| jj }| d| }t||S | j }|r| jd d }dddd}t|| jjd   }| d| }t||S | j }|rt|| jd S | j	r| j
d t }	|	d dkrt| jj  }
td	|
 |	d S td
|	S | j rdS | j }|r|S d S )Nr   r3   rQ   rq      
   )r   r<   r[      zW-r   r   )_get_annual_ruleru   r   rp   monthre   _get_quarterly_rulert   _get_monthly_ruler\   rY   ra   r
   weekday_is_business_daily_get_wom_rule)rW   Zannual_ruleZnyearsrz   aliasZquarterly_ruleZ	nquartersmod_dictZmonthly_ruledaysdayZwom_ruler8   r8   r9   rb   /  s8    




z#_FrequencyInferer._infer_daily_rulec             C   sH   t | jdkrd S t t| jd dkr,d S | j }dddddj|S )Nr[   r   r,   r-   r   r+   )csbscebe)rT   ru   r   ro   r   r7   )rW   	pos_checkr8   r8   r9   ry   U  s    z"_FrequencyInferer._get_annual_rulec             C   sD   t | jdkrd S | jd d dks(d S | j }dddddj|S )	Nr[   r   rQ   r)   r(   r   r*   )r   r   r   r   )rT   rt   r   r7   )rW   r   r8   r8   r9   r{   _  s    z%_FrequencyInferer._get_quarterly_rulec             C   s.   t | jdkrd S | j }dddddj|S )Nr[   r.   ZBMSr   r'   )r   r   r   r   )rT   rt   r   r7   )rW   r   r8   r8   r9   r|   i  s    z#_FrequencyInferer._get_monthly_rulec             C   s~   | j ddgkrdS | jd j }tj| jj}tj|t}tj|tj	| d}tj
|dk|dk@ |dk|dk@ |dk@ B S )Nr[   rQ   Fr   rx      )rn   rL   r}   npZdiffrR   Zfloor_dividera   modZcumsumall)rW   Zfirst_weekdayZshiftsweekdaysr8   r8   r9   r~   o  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 )Nr[   rx   r   r   zWOM-)r   rL   r}   rT   r   r
   )rW   r   Zweek_of_monthsweekwdr8   r8   r9   r   ~  s    z_FrequencyInferer._get_wom_ruleN)T)__name__
__module____qualname____doc__boolrX   r   rY   rZ   r\   r]   r   strrH   rn   rc   ro   rp   r   rt   ru   rb   ry   r{   r|   r~   r   r8   r8   r8   r9   rK      s,   -&

rK   c               @   s   e Zd Zdd ZdS )rG   c             C   sT   | j rP| jd t }|d dkrFt| jj  }d| }t||d S td|S d S )Nr   rx   zW-r   )r\   rY   ra   r
   rp   r}   re   )rW   r   r   r   r8   r8   r9   rb     s    
z,_TimedeltaFrequencyInferer._infer_daily_ruleN)r   r   r   rb   r8   r8   r8   r9   rG     s   rG   )multr5   c             C   s   | | dkS )Nr   r8   )usr   r8   r8   r9   r`     s    r`   )basecountr5   c             C   s4   |dkr,|t |kstt |}| |  S | S d S )Nr[   )intAssertionError)r   r   r8   r8   r9   re     s
    re   )r5   c             C   s:  |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r2| 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
    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   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targetr8   r8   r9   is_subperiod  sD    







r   c             C   s\  |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r0|dkS | dkrB|dkS | dkrT|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   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   ZsmonthZtmonthr8   r8   r9   is_superperiod  sJ    









r   c             C   s$   | dk	st t| tr| j} | j S )z we might need to coerce a code to a rule_code
    and uppercase it

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

    Returns
    -------
    str
    N)r   rC   r   Z	rule_codeupper)coder8   r8   r9   r   &  s    
r   )r   r   r5   c             C   s    t |  }t | }|d |d kS )NrQ   )r   )r   r   ZsnumZtnumr8   r8   r9   r   9  s    r   )ruler5   c             C   s   | j  } | dkp| jdS )Nr   zA-)r   
startswith)r   r8   r8   r9   r   ?  s    r   c             C   s$   | j  } | dkp"| jdp"| jdS )Nr   zQ-r*   )r   r   )r   r8   r8   r9   r   D  s    r   c             C   s   | j  } | dkp| dkS )Nr   r'   )r   )r   r8   r8   r9   r   I  s    r   c             C   s   | j  } | dkp| jdS )Nr&   zW-)r   r   )r   r8   r8   r9   r   N  s    r   )r   r   )T)Dtypingr   r>   numpyr   Zpandas._libs.algosr   Zpandas._libs.tslibsr   r   Zpandas._libs.tslibs.ccalendarr   r   r   r	   r
   Zpandas._libs.tslibs.fieldsr   r   Zpandas._libs.tslibs.offsetsr   r   r   r   Zpandas._libs.tslibs.parsingr   Zpandas.util._decoratorsr   Zpandas.core.dtypes.commonr   r   r   Zpandas.core.dtypes.genericr   Zpandas.core.algorithmsr   ri   rh   rg   rf   rd   ra   r6   Z_need_suffix_prefix_mkeyZ_aliasZ_dr   r:   rA   r   rO   rK   rG   r   r`   floatre   r   r   r   r   r   r   r   r   r8   r8   r8   r9   <module>   s   




B ]8: