a
    <b:D                     @  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 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.g d Z/e/D ],Z0eD ] Z1e0 d!e1 Z2e.e0 e.e2< qTqLd"D ](Z0eD ]Z1e0 d!e1 Z3e3e.e3< qq~eD ]Z4d#e4 e.d#e4 < qd$d%d&d'd(Z5d$d)d*d+d,Z6dQd.d%d/d0d1Z7G d2d3 d3Z8G d4d5 d5e8Z9d6d.d7d8d9Z:d$d:d$d;d<d=Z;d.d>d?d@Z<d.d>dAdBZ=d$d>dCdDZ>d$d$d.dEdFdGZ?d$d.dHdIdJZ@d$d.dHdKdLZAd$d.dHdMdNZBd$d.dHdOdPZCdS )R    )annotationsN)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)npt)cache_readonly)find_stack_level)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BYS)	r+   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=   j/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/pandas/tseries/frequencies.pyget_period_aliasc   s    r?   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   )r@   r=   r=   r>   
get_offsetj   s    
rE   Tbool)rC   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. 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.

    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.rC   z4cannot infer freq from a non-convertible index type )Zpandas.core.apirG   rH   rI   rJ   
isinstancer   Z_valuesr   r   rK   object	TypeErrorhasattrr   _TimedeltaFrequencyInfererget_freqtype_FrequencyInferer)indexrC   rG   rH   rI   rJ   valuesZinfererr=   r=   r>   
infer_freq   sD    




rW   c                   @  s:  e Zd ZdZd2d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 Zedd ZeddddZedd Z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d/d0Zd1S )3rT   z8
    Not sure if I can avoid the state machine here
    TrF   rL   c                 C  sd   || _ |j| _t|dr4|jd ur4t| 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)rU   asi8i8valuesrP   rX   r   Ztz_convert_from_utcrC   len
ValueErrorZ_is_monotonic_increasingZ_is_monotonic_decreasingis_monotonic)selfrU   rC   r=   r=   r>   __init__   s    

z_FrequencyInferer.__init__znpt.NDArray[np.int64]r:   c                 C  s
   t | jS N)r   r[   r_   r=   r=   r>   deltas   s    z_FrequencyInferer.deltasc                 C  s   t | jjS rb   )r   rU   rZ   rc   r=   r=   r>   deltas_asi8   s    z_FrequencyInferer.deltas_asi8c                 C  s   t | jdkS N   )r\   rd   rc   r=   r=   r>   	is_unique   s    z_FrequencyInferer.is_uniquec                 C  s   t | jdkS rf   )r\   re   rc   r=   r=   r>   is_unique_asi8   s    z _FrequencyInferer.is_unique_asi8r8   c                 C  s   | j r| jjsdS | jd }|r2t|tr2|  S | jddgddgg dfv rRdS | js\dS | j	d }t|t
r~t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   rg      A   )rg   rj   rk   ZBHr'   r"   r#   r$   r%   r&   )r^   rU   Z
_is_uniquerd   _is_multiple_ONE_DAY_infer_daily_rulehour_deltasri   re   	_ONE_HOUR_maybe_add_count_ONE_MINUTE_ONE_SECOND
_ONE_MILLI
_ONE_MICRO)r_   deltar=   r=   r>   rR      s*    	






z_FrequencyInferer.get_freqc                 C  s   dd | j D S )Nc                 S  s   g | ]}|t  qS r=   )rm   .0xr=   r=   r>   
<listcomp>*      z0_FrequencyInferer.day_deltas.<locals>.<listcomp>rd   rc   r=   r=   r>   
day_deltas(  s    z_FrequencyInferer.day_deltasc                 C  s   dd | j D S )Nc                 S  s   g | ]}|t  qS r=   )rp   rw   r=   r=   r>   rz   .  r{   z1_FrequencyInferer.hour_deltas.<locals>.<listcomp>r|   rc   r=   r=   r>   ro   ,  s    z_FrequencyInferer.hour_deltasz
np.ndarrayc                 C  s
   t | jS rb   )r   r[   rc   r=   r=   r>   fields0  s    z_FrequencyInferer.fieldsc                 C  s   t | jd S Nr   )r   r[   rc   r=   r=   r>   	rep_stamp4  s    z_FrequencyInferer.rep_stampc                 C  s   t | j| jjS rb   )r   r~   rU   Z	dayofweekrc   r=   r=   r>   r   8  s    z&_FrequencyInferer.month_position_checkc                 C  s&   | j d d | j d  }t|dS )Nr1      r   i8)r~   r   astype)r_   Znmonthsr=   r=   r>   mdiffs;  s    z_FrequencyInferer.mdiffsc                 C  s   t | jd dS )Nr1   r   )r   r~   r   rc   r=   r=   r>   ydiffs@  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   rY   r      
   )r      rg   r!   )_get_annual_ruler   r   r   monthrq   _get_quarterly_ruler   _get_monthly_rulerh   _get_daily_rule_is_business_daily_get_wom_rule)
r_   Zannual_ruleZnyearsr   aliasZquarterly_ruleZ	nquartersmod_dictZmonthly_ruleZwom_ruler=   r=   r>   rn   D  s0    


z#_FrequencyInferer._infer_daily_rulec                 C  sN   | j d t }|d dkr@t| j  }d| }t||d S td|S d S )Nr      r6   r   )rd   rm   r
   r   weekdayrq   )r_   dayswdr   r=   r=   r>   r   d  s    
z!_FrequencyInferer._get_daily_rulec                 C  sH   t | jdkrd S t t| jd dkr,d S |  }ddddd|S )Nrg   r   r.   r/   r   r-   csbsZcebe)r\   r   r   r~   r   r<   r_   Z	pos_checkr=   r=   r>   r   n  s    z"_FrequencyInferer._get_annual_rulec                 C  sD   t | jdkrd S | jd d dks(d S |  }ddddd|S )	Nrg   r   rY   r+   r*   r   r,   r   r\   r   r   r<   r   r=   r=   r>   r   x  s    z%_FrequencyInferer._get_quarterly_rulec                 C  s.   t | jdkrd S |  }ddddd|S )Nrg   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j}t|t}t|t	| d}t
t|dk|dk@ |dk|dk@ |dk@ B S )Nrg   rY   Fr   r      )r}   rU   r   npdiffrZ   Zfloor_dividerm   modZcumsumrF   all)r_   Zfirst_weekdayZshifts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 )Nrg   r   r   r   zWOM-)r   rU   r   r\   dayr
   )r_   r   Zweek_of_monthsweekr   r=   r=   r>   r     s    z_FrequencyInferer._get_wom_ruleN)T)__name__
__module____qualname____doc__r`   r   rd   re   rh   ri   rR   r}   ro   r~   r   r   r   r   rn   r   r   r   r   r   r   r=   r=   r=   r>   rT      s>   .


 


rT   c                   @  s   e Zd Zdd ZdS )rQ   c                 C  s   | j r|  S d S rb   )rh   r   rc   r=   r=   r>   rn     s    z,_TimedeltaFrequencyInferer._infer_daily_ruleN)r   r   r   rn   r=   r=   r=   r>   rQ     s   rQ   int)multr:   c                 C  s   | | dkS r   r=   )usr   r=   r=   r>   rl     s    rl   float)basecountr:   c                 C  s4   |dkr,|t |ksJ t |}| |  S | S d S rf   )r   )r   r   r=   r=   r>   rq     s
    rq   ra   c                 C  s2  |du s| du rdS t | } t |}t|rNt| rFtt| t|S | dv S t|r^| dv S t|rn| dv S t|r| |ddddd	d
dddh
v S |dkr| dv S |dkr| dv S |dkr| dv S |dkr| dv S |d	kr| dv S |d
k r| dv S |dkr| dv S |dkr| dv S |dkr*| dv 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  sF    



r   c                 C  sV  |du s| du rdS t | } t |}t| rnt|rDt| t|kS t|rft| }t|}t||S |dv S t| r~|dv S t| r|dv S t| r|| ddddd	d
dddh
v S | dkr|dv S | dkr|dv S | dkr|dv S | dk r|dv S | d	kr|dv S | d
kr|dv S | dkr*|dv S | dkr<|dv S | dkrN|dv 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usJ 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)rM   r   Z	rule_codeupper)coder=   r=   r>   r   ;  s    
r   )r   r   r:   c                 C  s    t |  }t | }|d |d kS )NrY   )r   )r   r   ZsnumZtnumr=   r=   r>   r   N  s    r   )ruler:   c                 C  s   |   } | dkp| dS )Nr   zA-r   
startswithr   r=   r=   r>   r   T  s    r   c                 C  s$   |   } | dkp"| dp"| dS )Nr   zQ-r,   r   r   r=   r=   r>   r   Y  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(   r6   r   r   r=   r=   r>   r   c  s    r   )T)D
__future__r   rB   Z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._typingr   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.core.dtypes.commonr   r   r   Zpandas.core.dtypes.genericr   Zpandas.core.algorithmsr   ru   rt   rs   rr   rp   rm   r;   Z_need_suffix_prefix_mkey_aliasZ_dr?   rE   rW   rT   rQ   rl   rq   r   r   r   r   r   r   r   r   r=   r=   r=   r>   <module>   s   M e8: