gL iEXddlmZddlmZddlZddlmZddlm Z ddl m Z m Z m Z mZddlmZmZmZmZmZddlmZmZdd lmZmZdd lmZmZmZdd lm Z dd l!m"Z"dd l#m$Z$ddl%m&Z&m'Z'ddl(m)Z)m*Z*ddl+m,Z,erddl-m.Z.ddl/m0Z0m1Z1m2Z2ddl3m4Z4gdZ5e5D]Z6eD]Z7e6de7Z8ee6ee8<dD]Z6eD]Z7e6de7Z9e9ee9<eD] Z:de:ede:<d)dZ; d*dZ<GddZ=Gdde=Z>d+dZ?d,dZ@d-d ZAd-d!ZBd.d"ZCd/d#ZDd0d$ZEd0d%ZFd0d&ZGd0d'ZHgd(ZIy)1) annotations) TYPE_CHECKINGN)lib) unique_deltas) Timestampget_unit_from_dtypeperiods_per_daytz_convert_from_utc)DAYS MONTH_ALIASES MONTH_NUMBERSMONTHSint_to_weekday)OFFSET_TO_PERIOD_FREQSTRfreq_to_period_freqstr)build_field_sarraymonth_position_check) DateOffsetDay to_offset)get_rule_month)cache_readonly)is_numeric_dtype)DatetimeTZDtype PeriodDtype)ABCIndex ABCSeries)unique)npt) DatetimeIndexSeriesTimedeltaIndex)DatetimeLikeArrayMixin)QSBQEBQSYSBYEBYS-)YQW-c.tj|dS)z4 Alias to closest period strings BQ->Q etc. N)rget) offset_strs `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/pandas/tseries/frequencies.pyget_period_aliasr2Ns $ ' ' D 99cddlm}t|trs|j}t j |jdsEt|jts+|jtk(std|j|}t|dsnt|jtr tdt j |jdrt|}|jSt|jrtd|jt||s||}t!|}|jS) aW Infer the most likely frequency given the input index. 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. Examples -------- >>> idx = pd.date_range(start='2020/12/01', end='2020/12/30', periods=30) >>> pd.infer_freq(idx) 'D' r)r 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 )pandas.core.apir isinstancer_valuesr is_np_dtyper6robject TypeErrorhasattrr_TimedeltaFrequencyInfererget_freqr_FrequencyInferer)indexr valuesinferers r1 infer_freqrEYs:.%# OOFLL$ /&,,8||v%""'++0  5' " EKK - +   c *,U3!! %++ &Fu{{m T   e] +e$&G    r3ceZdZdZddZeddZeddZeddZeddZ ddZ eddZ edd Z edd Z edd Zdd Zedd ZeddZddZddZddZddZddZddZddZy)rAz8 Not sure if I can avoid the state machine here c$||_|j|_t|tr/t |j jj|_ n$t |jj|_ t|dr=|j1t|j|j|j|_t|dkr td|jjxs|jj |_y)Ntzresoz(Need at least 3 dates to infer frequency)rBasi8i8valuesr9rr_data_ndarrayr6_cresor>rHr len ValueError_is_monotonic_increasing_is_monotonic_decreasing is_monotonic)selfrBs r1__init__z_FrequencyInferer.__init__s    eX &. $$**DK .enn.B.BCDK 5$ xx# 3MM588$++!  u:>GH H JJ / / V4::3V3V r3c,t|jSN)rrMrVs r1deltasz_FrequencyInferer.deltassT]]++r3c@t|jjSrY)rrBrLrZs r1 deltas_asi8z_FrequencyInferer.deltas_asi8sTZZ__--r3c2t|jdk(SN)rQr[rZs r1 is_uniquez_FrequencyInferer.is_uniques4;;1$$r3c2t|jdk(Sr_)rQr]rZs r1is_unique_asi8z _FrequencyInferer.is_unique_asi8s4##$))r3c|jr|jjsy|jd}t |j }|rt ||r|jS|jddgddggdfvry|jsy|jd}|dz}|d z}|d z}t ||rtd ||z St ||rtd ||z St ||rtd ||z St ||d zrtd||d zz St ||dzrtd||dzz Std|S)z Find the appropriate frequency string to describe the inferred frequency of self.i8values Returns ------- str or None Nrr`A)r`rerfbh<hminsimsi@Busns) rUrB _is_uniquer[r rP _is_multiple_infer_daily_rule hour_deltasrcr]_maybe_add_count)rVdeltappdpphppmppss r1r@z_FrequencyInferer.get_freqsW   (=(= Adkk* \%-))+ +   B!R+> > ""  #RiRiRi s ##C5 5 % %#E53;7 7 % %#C5 5 %#+ /#D%3$;*?@ @ %#"2 4#D%3)3C*DE E$D%0 0r3cpt|j}|jDcgc]}||z  c}Scc}wrYr rPr[)rVrvxs r1 day_deltasz_FrequencyInferer.day_deltass,dkk*!%-AC---s 3cvt|jdz}|jDcgc]}||z  c}Scc}w)Nrhr{)rVrwr|s r1rsz_FrequencyInferer.hour_deltas s1dkk*b0!%-AC---s 6cDt|j|jS)NrI)rrMrPrZs r1fieldsz_FrequencyInferer.fieldss!$--dkkBBr3c^t|jd|jjS)Nr)unit)rrMrBrrZs r1 rep_stampz_FrequencyInferer.rep_stamps q) @@r3cVt|j|jjSrY)rrrB dayofweekrZs r1rz&_FrequencyInferer.month_position_checks#DKK1E1EFFr3cz|jddz|jdz}t|jdS)Nr+ Mi8)rrastype)rVnmonthss r1mdiffsz_FrequencyInferer.mdiffss7++c"R'$++c*::W^^D122r3cPt|jdjdS)Nr+r)rrrrZs r1ydiffsz_FrequencyInferer.ydiffs!s!T[[-44T:;;r3c>|j}|r?|jd}t|jj}|d|}t ||S|j }|rN|jddz }dddd}t||jjdz}|d|}t ||S|j}|rt ||jdS|jr|jS|jry|j} | r| Sy) Nrr*rKr )rr`B) _get_annual_rulerr rmonthrt_get_quarterly_ruler_get_monthly_rulera_get_daily_rule_is_business_daily _get_wom_rule) rV annual_rulenyearsraliasquarterly_rule nquartersmod_dict monthly_rulewom_rules r1rrz#_FrequencyInferer._infer_daily_rule%s ++- [[^F!$.."6"67E"m1UG,E#E62 2113  A*I",H!(4>>+?+?!+C"DEE%&aw/E#E95 5--/ #L$++a.A A >>'') )  " " $%%' Or3ct|j}|jd|z }|dzdk(r5t|jj }d|}t ||dz St d|S)Nrr-D)r rPr[rrweekdayrt)rVrvdayswdrs r1rz!_FrequencyInferer._get_daily_ruleEsmdkk*{{1~# !8q= 6 6 89BIE#E4!84 4#C. .r3ct|jdkDrytt|jddkDry|j }|ydddddj |S)Nr`rr'r)YEr(csbscebe)rQrrrrr/rV pos_checks r1rz"_FrequencyInferer._get_annual_rulePse t{{ a  vdkk#&' (1 ,--/  e4uEII)T Tr3ct|jdkDry|jddzdk(sy|j}|ydddddj|S) Nr`rrKr$r&QEr%rrQrrr/rs r1rz%_FrequencyInferer._get_quarterly_rule^s_ t{{ a {{1~!Q&--/  e4uEII)T Tr3ct|jdkDry|j}|ydddddj|S)Nr`MSBMSMEBMErrrs r1rz#_FrequencyInferer._get_monthly_rulelsG t{{ a --/  e4uEII)T Tr3c|jddgk7ry|jdj}tj|j }t |j}tj||}tj|tj|zd}ttj|dk(|dk(z|dkD|dkz|dk(zzS)Nr`rKFrr) r}rBrnpdiffrMr rP floor_dividemodcumsumboolall)rV first_weekdayshiftsrvweekdayss r1rz$_FrequencyInferer._is_business_dailyvs ??q!f $ 1 --/ 'dkk*-66-"))F*;;Q? FFa-FaK0qLX]3v{CE   r3c(t|jj}t|dkDryt|jjdz dz}||dk}t|dk(st|dkDry|ddz}t |d}d||S)Nr`rrrzWOM-)rrBrrQdayr)rVrweek_of_monthsweekrs r1rz_FrequencyInferer._get_wom_rules$**,,- x=1 !!3 9:'(:; ~ ! #s>':Q'>a 1$ HQK (dVB4  r3N)returnNone)rznpt.NDArray[np.int64]rr)r str | None)rz list[int])rz np.ndarray)rr)__name__ __module__ __qualname____doc__rWrr[r]rarcr@r}rsrrrrrrrrrrrrrr3r1rArAs  >,,.. %%**01d....CCAAG33<<@ / U UU &!r3rAceZdZdZy)r?c<|jr|jSyrY)rarrZs r1rrz,_TimedeltaFrequencyInferer._infer_daily_rules >>'') ) r3N)rrrrrrr3r1r?r?s*r3r?c||zdk(S)Nrr)rnmults r1rqrqs 9>r3cR|dk7r!|t|k(sJt|}||S|Sr_)int)basecounts r1rtrts8 zE """E  r3c ||yt|}t|}t|r-t|rtt |t |S|dvSt|r|dvSt |r|dvSt |r||dddddd d d d h vS|dk(r|d vS|dk(r|dvS|dk(r|dvS|dk(r|dvS|dk(r|dvS|d k(r|dvS|d k(r|dvS|d k(r|dvS|d k(r|dvSy)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> rCrrrjrlrmrornrk> rrrrjrlrmrornrkrrrrjrkrlrmrnro>rrjrlrmrornrk>rrjrlrmrornrk>rrjrlrmrornrk>rjrlrmrornrk>rlrmrornrk>rlrmrorn>rmrorn>rorn>ro)_maybe_coerce_freq _is_annual _is_quarterly_quarter_months_conformr _is_monthly _is_weekly)sourcetargets r1 is_subperiodrsZ ~  'F  'F&  *v&v(> PPP v PPP V KKK F &#sCeS$dSSS 3AAA 3AAA 3AAA 3<<< 5777 3000 4+++ 4%% 4r3c ||yt|}t|}t|rSt|rt|t|k(St|r"t|}t|}t ||S|dvSt|r|dvSt |r|dvSt |r||dddddd d d d h vS|dk(r|dvS|dk(r|dvS|dk(r|dvS|dk(r|d vS|dk(r|dvS|d k(r|dvS|d k(r|dvS|d k(r|dvS|d k(r|dvSy)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> rrrrrjrlrmrornrk> rrrrjrlrmrornrkrrrrjrkrlrmrnro>rjrlrmrornrk>rlrmrornrk>rlrmrorn>rmrorn>rorn>ro)rrrrrrr)rrsmonthtmonths r1is_superperiodrsz ~  'F  'F& f !&)^F-CC C  #F+F#F+F*66: :PPP v PPP V KKK F &#sCeS$dSSS 3KKK 3KKK 3KKK 3<<< 5777 3000 4+++ 4%% 4r3c|Jt|trtd|j}|dvr|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 r`>rjrlrmrornrk)r9rrnameupper)codes r1rr#sD   $ #%a3 22 zz|r3c<t|}t|}|dz|dzk(S)NrK)r )rrsnumtnums r1rr9s)  D  D !8tax r3cR|j}|dk(xs|jdS)Nr+zY-r startswithrules r1rr?% ::rs" ,  726 *" G8 JGJ 2$(@(I %JJ 2G29AbT"+1 (22 4B,.rd)r"Y'4:C KCCLy!y!x*!2* 4n7t, 0 8  0  r3