
    .imH                    r   d dl mZ d dlmZ d dl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mZmZmZ d dl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!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- erd dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 g dZ6e6D ]  Z7eD ]  Z8e7 de8 Z9ee7   ee9<     dD ]  Z7eD ]  Z8e7 de8 Z:e:ee:<     eD ]  Z;de; ede; <    d*dZ< e"d      	 	 	 	 d+d       Z= G d d      Z> G d de>      Z?d,dZ@d-d ZAd.d!ZBd.d"ZCd/d#ZDd0d$ZEd1d%ZFd1d&ZGd1d'ZHd1d(ZIg d)ZJy)2    )annotations)TYPE_CHECKINGN)lib)unique_deltas)	Timestampget_unit_from_dtypeperiods_per_daytz_convert_from_utc)DAYSMONTH_ALIASESMONTH_NUMBERSMONTHSint_to_weekday)OFFSET_TO_PERIOD_FREQSTR)build_field_sarraymonth_position_check)
DateOffsetDay	to_offset)get_rule_month)cache_readonly
set_module)is_numeric_dtype)
ArrowDtypeDatetimeTZDtypePeriodDtype)ABCIndex	ABCSeries)unique)npt)DatetimeIndexSeriesTimedeltaIndex)DatetimeLikeArrayMixin)QSBQEBQSYSBYEBYS-)YQW-c                .    t        j                  | d      S )z4
    Alias to closest period strings BQ->Q etc.
    N)r   get)
offset_strs    X/var/www/app/trading-bot/venv/lib/python3.12/site-packages/pandas/tseries/frequencies.pyget_period_aliasr3   O   s     $''
D99    pandasc                d   ddl m} t        | t              r| j                  }t        | j
                  t              rCddl}|j                  j                  |j
                  j                        r|j                         }t        j                  |j
                  d      sEt        |j
                  t              s+|j
                  t        k(  st!        d| j
                         |} t#        | d      snt        | j
                  t$              rt!        d      t        j                  | j
                  d      rt'        |       }|j)                         S t+        | j
                        rt!        d	| j
                         t        | |      s
 || d
      } t-        |       }|j)                         S )a  
    Infer the most likely frequency given the input index.

    This method attempts to deduce the most probable frequency (e.g., 'D' for daily,
    'H' for hourly) from a sequence of datetime-like objects. It is particularly useful
    when the frequency of a time series is not explicitly set or known but can be
    inferred from its values.

    Parameters
    ----------
    index : DatetimeIndex, TimedeltaIndex, Series or array-like
      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.

    See Also
    --------
    date_range : Return a fixed frequency DatetimeIndex.
    timedelta_range : Return a fixed frequency TimedeltaIndex with day as the default.
    period_range : Return a fixed frequency PeriodIndex.
    DatetimeIndex.freq : Return the frequency object if it is set, otherwise None.

    Examples
    --------
    >>> idx = pd.date_range(start="2020/12/01", end="2020/12/30", periods=30)
    >>> pd.infer_freq(idx)
    'D'
    r   )r!   NmMz>cannot infer freq from a non-convertible dtype on a Series of dtypezJPeriodIndex given. Check the `freq` attribute instead of using infer_freq.mz8cannot infer freq from a non-convertible index of dtype F)copy)pandas.core.apir!   
isinstancer   _valuesr8   r   pyarrowtypesis_timestamppyarrow_dtype_to_datetimearrayr   is_np_dtyper   object	TypeErrorhasattrr   _TimedeltaFrequencyInfererget_freqr   _FrequencyInferer)indexr!   valuespainferers        r2   
infer_freqrN   Z   s]   T .%#ekk:. xx$$V\\%?%?@113 OOFLL$/&,,8||v%""'++0   5'"	EKK	-X
 	
 
c	*,U3!!	%++	&Fu{{mT
 	
 e]+e%0&Gr4   c                     e Zd ZdZ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dd
       Zedd       ZddZedd       Zedd       ZddZddZddZddZddZddZddZy)rI   z8
    Not sure if I can avoid the state machine here
    c                $   || _         |j                  | _        t        |t              r/t        |j                  j                  j                        | _	        n$t        |j                  j                        | _	        t        |d      r=|j                  1t        | j                  |j                  | j                        | _        t        |      dk  rt        d      | j                   j                  xs | j                   j                   | _        y )Ntzreso   z(Need at least 3 dates to infer frequency)rJ   asi8i8valuesr<   r   r   _data_ndarrayr8   _cresorF   rQ   r
   len
ValueError_is_monotonic_increasing_is_monotonic_decreasingis_monotonic)selfrJ   s     r2   __init__z_FrequencyInferer.__init__   s    


 eX& .$$**DK
 .enn.B.BCDK 5$xx# 3MM588$++! u:>GHH JJ//V4::3V3V 	r4   c                ,    t        | j                        S N)r   rV   r_   s    r2   deltasz_FrequencyInferer.deltas   s    T]]++r4   c                @    t        | j                  j                        S rb   )r   rJ   rU   rc   s    r2   deltas_asi8z_FrequencyInferer.deltas_asi8   s     TZZ__--r4   c                2    t        | j                        dk(  S N   )rZ   rd   rc   s    r2   	is_uniquez_FrequencyInferer.is_unique   s    4;;1$$r4   c                2    t        | j                        dk(  S rh   )rZ   rf   rc   s    r2   is_unique_asi8z _FrequencyInferer.is_unique_asi8   s    4##$))r4   c                   | j                   r| j                  j                  sy| j                  d   }t	        | j
                        }|rt        ||      r| j                         S | j                  ddgddgg dfv ry| j                  sy| j                  d   }|dz  }|d	z  }|d	z  }t        ||      rt        d
||z        S t        ||      rt        d||z        S t        ||      rt        d||z        S t        ||dz        rt        d||dz  z        S t        ||dz        rt        d||dz  z        S t        d|      S )z
        Find the appropriate frequency string to describe the inferred
        frequency of self.i8values

        Returns
        -------
        str or None
        Nr   ri      A   )ri   rn   ro   bh   <   hminsi  msi@B usns)r^   rJ   
_is_uniquerd   r	   rY   _is_multiple_infer_daily_rulehour_deltasrl   rf   _maybe_add_count)r_   deltappdpphppmppss         r2   rH   z_FrequencyInferer.get_freq   sW      

(=(=Adkk*\%-))++ B!R+>>
 ""  #RiRiRis##C55%%#E53;77%%#C55%#+/#D%3$;*?@@%#"24#D%3)3C*DEE $D%00r4   c                p    t        | j                        }| j                  D cg c]  }||z  	 c}S c c}w rb   r	   rY   rd   )r_   r   xs      r2   
day_deltasz_FrequencyInferer.day_deltas  s,    dkk*!%-AC---s   3c                v    t        | j                        dz  }| j                  D cg c]  }||z  	 c}S c c}w )Nrq   r   )r_   r   r   s      r2   r|   z_FrequencyInferer.hour_deltas!  s1    dkk*b0!%-AC---s   6c                D    t        | j                  | j                        S )NrR   )r   rV   rY   rc   s    r2   fieldsz_FrequencyInferer.fields&  s    !$--dkkBBr4   c                ^    t        | j                  d   | j                  j                        S )Nr   )unit)r   rV   rJ   r   rc   s    r2   	rep_stampz_FrequencyInferer.rep_stamp*  s     q)

@@r4   c                V    t        | j                  | j                  j                        S rb   )r   r   rJ   	dayofweekrc   s    r2   r   z&_FrequencyInferer.month_position_check.  s    #DKK1E1EFFr4   c                z    | j                   d   dz  | j                   d   z   }t        |j                  d            S )Nr,      Mi8)r   r   astype)r_   nmonthss     r2   mdiffsz_FrequencyInferer.mdiffs1  s7    ++c"R'$++c*::W^^D122r4   c                P    t        | j                  d   j                  d            S )Nr,   r   )r   r   r   rc   s    r2   ydiffsz_FrequencyInferer.ydiffs6  s!    T[[-44T:;;r4   c                >   | j                         }|r?| j                  d   }t        | j                  j                     }| d| }t        ||      S | j                         }|rN| j                  d   dz  }dddd}t        || j                  j                  dz        }| d| }t        ||      S | j                         }|rt        || j                  d         S | j                  r| j                         S | j                         ry| j                         }	|	r|	S y )	Nr   r+   rT   r      
   )r      ri   B)_get_annual_ruler   r   r   monthr}   _get_quarterly_ruler   _get_monthly_rulerj   _get_daily_rule_is_business_daily_get_wom_rule)
r_   annual_rulenyearsr   aliasquarterly_rule	nquartersmod_dictmonthly_rulewom_rules
             r2   r{   z#_FrequencyInferer._infer_daily_rule:  s    ++-[[^F!$.."6"67E"m1UG,E#E622113A*I",H!(4>>+?+?!+C"DEE%&aw/E#E955--/#L$++a.AA>>''))""$%%'Or4   c                    t        | j                        }| j                  d   |z  }|dz  dk(  r5t        | j                  j                            }d| }t        ||dz        S t        d|      S )Nr      r.   D)r	   rY   rd   r   r   weekdayr}   )r_   r   dayswdr   s        r2   r   z!_FrequencyInferer._get_daily_ruleZ  sm    dkk*{{1~#!8q= 6 6 89BIE#E4!844#C..r4   c                    t        | j                        dkD  ry t        t        | j                  d               dkD  ry | j	                         }|y dddddj                  |      S )Nri   r   r(   r*   YEr)   csbscebe)rZ   r   r   r   r   r0   r_   	pos_checks     r2   r   z"_FrequencyInferer._get_annual_rulee  se    t{{avdkk#&'(1,--/	e4uEII)TTr4   c                    t        | j                        dkD  ry | j                  d   dz  dk(  sy | j                         }|y dddddj                  |      S )	Nri   r   rT   r%   r'   QEr&   r   rZ   r   r   r0   r   s     r2   r   z%_FrequencyInferer._get_quarterly_rules  s_    t{{a{{1~!Q&--/	e4uEII)TTr4   c                    t        | j                        dkD  ry | j                         }|y dddddj                  |      S )Nri   MSBMSMEBMEr   r   r   s     r2   r   z#_FrequencyInferer._get_monthly_rule  sG    t{{a--/	e4uEII)TTr4   c                   | j                   ddgk7  ry| j                  d   j                         }t        j                  | j
                        }t        | j                        }t        j                  ||      }t        j                  |t        j                  |      z   d      }t        t        j                  |dk(  |dk(  z  |dkD  |dk  z  |dk(  z  z              S )Nri   rT   Fr   r      )r   rJ   r   npdiffrV   r	   rY   floor_dividemodcumsumboolall)r_   first_weekdayshiftsr   weekdayss        r2   r   z$_FrequencyInferer._is_business_daily  s    ??q!f$ 

1--/'dkk*-66-"))F*;;Q?FFa-FaK0qLX]3v{CE
 	
r4   c                (   t        | j                  j                        }t        |      dkD  ry t        | j                  j                  dz
  dz        }||dk     }t        |      dk(  st        |      dkD  ry |d   dz   }t
        |d      }d| | S )Nri   r   r   r   zWOM-)r   rJ   r   rZ   dayr   )r_   r   week_of_monthsweekr   s        r2   r   z_FrequencyInferer._get_wom_rule  s    $**,,-x=1!!3 9:'(:;~!#s>':Q'> a 1$HQK(dVB4  r4   N)returnNone)r   znpt.NDArray[np.int64]r   r   )r   
str | None)r   z	list[int])r   z
np.ndarray)r   r   )__name__
__module____qualname____doc__r`   r   rd   rf   rj   rl   rH   r   r|   r   r   r   r   r   r{   r   r   r   r   r   r    r4   r2   rI   rI      s   
> , , . .
 % % * *01d . . . . C C A AG 3 3 < <@	/UUU
&!r4   rI   c                      e Zd Zd Zy)rG   c                <    | j                   r| j                         S y rb   )rj   r   rc   s    r2   r{   z,_TimedeltaFrequencyInferer._infer_daily_rule  s    >>'')) r4   N)r   r   r   r{   r   r4   r2   rG   rG     s    *r4   rG   c                    | |z  dk(  S )Nr   r   )rw   mults     r2   rz   rz     s    9>r4   c                R    |dk7  r!|t        |      k(  sJ t        |      }| |  S | S rh   )int)basecounts     r2   r}   r}     s8    zE
"""E
r4   c                   || yt        |       } t        |      }t        |      r-t        |       rt        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(  r| dv S y)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
    F>
   r   Cr   r   rs   ru   rv   rx   rw   rt   >	   r   r   r   rs   ru   rv   rx   rw   rt   r   r   r   rs   rt   ru   rv   rw   rx   >   r   rs   ru   rv   rx   rw   rt   >   r   rs   ru   rv   rx   rw   rt   >   r   rs   ru   rv   rx   rw   rt   >   rs   ru   rv   rx   rw   rt   >   ru   rv   rx   rw   rt   >   ru   rv   rx   rw   >   rv   rx   rw   >   rx   rw   >   rx   )_maybe_coerce_freq
_is_annual_is_quarterly_quarter_months_conformr   _is_monthly
_is_weekly)sourcetargets     r2   is_subperiodr     sZ     ~'F'F& *v&v(>  PPP	v	PPP	V	KKK	F	&#sCeS$dSSS	3AAA	3AAA	3AAA	3<<<	5777	3000	4+++	4%%	4r4   c                   || yt        |       } t        |      }t        |       rSt        |      rt        |       t        |      k(  S t        |      r"t        |       }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(  r|dv S y)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
    F>
   r   r   r   r   rs   ru   rv   rx   rw   rt   >	   r   r   r   rs   ru   rv   rx   rw   rt   r   r   r   rs   rt   ru   rv   rw   rx   >   rs   ru   rv   rx   rw   rt   >   ru   rv   rx   rw   rt   >   ru   rv   rx   rw   >   rv   rx   rw   >   rx   rw   >   rx   )r   r   r   r   r   r   r   )r   r   smonthtmonths       r2   is_superperiodr     sz     ~'F'F&f!&)^F-CCC #F+F#F+F*66::PPP	v	PPP	V	KKK	F	&#sCeS$dSSS	3KKK	3KKK	3KKK	3<<<	5777	3000	4+++	4%%	4r4   c                    | J t        | t              r(t        t        | j                              j
                  } | dv r| S | 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
    >   rs   ru   rv   rx   rw   rt   )r<   r   r   r   name_freqstrupper)codes    r2   r   r   8  sM     $
#9TYY/09922zz|r4   c                <    t         |    }t         |   }|dz  |dz  k(  S )NrT   )r   )r   r   snumtnums       r2   r   r   N  s)     D D!8taxr4   c                R    | j                         } | dk(  xs | j                  d      S )Nr,   zY-r   
startswithrules    r2   r   r   T  %    ::<D3;/$//$//r4   c                R    | j                         } | dk(  xs | j                  d      S )Nr-   )zQ-BQr   r   s    r2   r   r   Y  s%    ::<D3;7$//,77r4   c                *    | j                         } | dv S )N)r   BM)r   r   s    r2   r   r   ^  s    ::<D;r4   c                R    | j                         } | dk(  xs | j                  d      S )NWr.   r   r   s    r2   r   r   c  r   r4   )r   r3   rN   r   r   r   )r1   strr   r   )rJ   z@DatetimeIndex | TimedeltaIndex | Series | DatetimeLikeArrayMixinr   r   )r   r   r   r   )r   r  r   floatr   r  r   )r   r  )r   r  r   r  r   r   )r   r  r   r   )K
__future__r   typingr   numpyr   pandas._libsr   pandas._libs.algosr   pandas._libs.tslibsr   r   r	   r
   pandas._libs.tslibs.ccalendarr   r   r   r   r   pandas._libs.tslibs.dtypesr   pandas._libs.tslibs.fieldsr   r   pandas._libs.tslibs.offsetsr   r   r   pandas._libs.tslibs.parsingr   pandas.util._decoratorsr   r   pandas.core.dtypes.commonr   pandas.core.dtypes.dtypesr   r   r   pandas.core.dtypes.genericr   r   pandas.core.algorithmsr   pandas._typingr    r5   r!   r"   r#   pandas.core.arrays.datetimeliker$   _need_suffix_prefix_mkey_alias_dr3   rN   rI   rG   rz   r}   r   r   r   r   r   r   r   r   __all__r   r4   r2   <module>r"     s   "     ,   @ 
 7
 7 

 *" 
 G 8 JG J	2$(@(I %JJ
  2G 29AbT"+1 (22
  4B,.rd)r"Y'4: HVKVV Vry! y!x*!2 *4n7t, 0
8

0
r4   