
    N jM                    t   S SK Jr  S SKrS SKJrJrJrJrJr  S SK	r	S SK
rS SKJrJrJr  S SKrS SKJrJrJr  SSKJr  SSKJrJrJr  SS	KJr  SS
KJr  SSKJr   " S S5      r \ S3r!Sr"S/ SQ/ SQS/SSSSS.S.S/ SQ/ SQ/ SQSSS0S.S/ S Q/ S!QS"/S#S$S%S&S'S(.S.S/ S)Q/ S*/SS+S,0S.S-.r# " S. S/5      r$g)0    )annotationsN)AnyOptionalListUnionDict)SessionResponse
exceptions)datetimedate	timedelta   )_QUERY1_URL_)log_indent_decoratorget_yf_logger_parse_user_dt)screen)YfData)YFExceptionc                  J    \ rS rSrSrS	S jrS
S jr\SS j5       rSS jr	Sr
g)CalendarQuery   a  
Simple CalendarQuery class for calendar queries, similar to yf.screener.query.QueryBase.

Simple operand accepted by YF is of the form:
    `{ "operator": operator, "operands": [field, ...values] }`

Nested operand accepted by YF:
    `{ "operator": operator, "operands": [ ...CalendarQuery ] }`

### Simple example:
```python
op = CalendarQuery('eq', ['ticker', 'AAPL'])
print(op.to_dict())
```
c                <    UR                  5       nXl        X l        g)z
:param operator: Operator string, e.g., 'eq', 'gte', 'and', 'or'.
:param operand: List of operands: can be values (str, int), or other Operands instances (nested).
N)upperoperatoroperands)selfr   operands      c/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/yfinance/calendars.py__init__CalendarQuery.__init__"   s    
 >>#     c                :    U R                   R                  U5        g)z|
Append an operand to the operands list.

:param operand: CalendarQuery to append (can be value or CalendarQuery instance).
N)r   append)r   r   s     r    r%   CalendarQuery.append+   s     	W%r#   c                2    [        U R                  5      S:H  $ )za
Check if the operands list is empty.

:return: True if operands list is empty, False otherwise.
r   )lenr   r   s    r    is_emptyCalendarQuery.is_empty3   s     4==!Q&&r#   c                    U R                   nU R                  nUU Vs/ s H*  n[        U[        5      (       a  UR	                  5       OUPM,     snS.$ s  snf )z
Query-ready dict for YF.

Simple operand accepted by YF is of the form:
    `{ "operator": operator, "operands": [field, ...values] }`

Nested operand accepted by YF:
    `{ "operator": operator, "operands": [ ...CalendarQuery ] }`
)r   r   )r   r   
isinstancer   to_dict)r   opopsos       r    r.   CalendarQuery.to_dict<   sR     ]]mmUXYUXPQ
1m(D(D!KUXY
 	
Ys   1A)r   r   N)r   strr   z'Union[List[Any], List['CalendarQuery']])r   r   returnNone)r4   bool)r4   dict)__name__
__module____qualname____firstlineno____doc__r!   r%   propertyr*   r.   __static_attributes__ r#   r    r   r      s*      & ' '
r#   r   z/v1/finance/visualizationz%Y-%m-%dintradaymarketcap)	tickercompanyshortnamer@   	eventnamestartdatetimestartdatetimetypeepsestimate	epsactualepssurprisepct)Surprise (%)zEPS EstimatezReported EPSEvent Start DateSymbolzSurprise(%)Company	Marketcap)rI   zCompany NamezMarket Cap (Intraday))	sortFieldincludeFieldsnan_colsdatetime_colsdf_indexrenamesrD   )rA   rB   exchange_short_name
filingdaterD   amendeddate	pricefrompriceto
offerpricecurrencynamesharesdealtype)z
Price FromzPrice ToPriceShares)zFiling DateDatezAmended DatezExchange Short NameExchange)econ_releasecountry_coderD   periodafter_release_actualconsensus_estimateprior_release_actualoriginally_reported_actual)ActualMarket ExpectationPrior to ThisRevised fromz
Event TimeEventRegionExpectedLastRevised)zCountry Coderi   rj   rk   )rA   rB   rD   
optionableold_share_worthshare_worthz
Payable OnzOptionable?
Optionable)sp_earningsipo_infoeconomic_eventsplitsc                  p   \ rS rSrSr   S     SS jjrSS jr S     SS jjrSS jrSS jr	\
 S   SS	 jj5       rSSS
 jjr\
       S     S S jj5       r\
 S! S"S jj5       r\
 S! S"S jj5       r\
 S! S"S jj5       r\S"S j5       r\S"S j5       r\S"S j5       r\S"S j5       rSrg)#	Calendars   a  
Get economic calendars, for example, Earnings, IPO, Economic Events, Splits

### Simple example default params:
```python
import yfinance as yf
calendars = yf.Calendars()
earnings_calendar = calendars.get_earnings_calendar(limit=50)
print(earnings_calendar)
```Nc                   [        5       U l        U=(       d
    [        5       U l        [	        US9U l        U R                  U5      nU R                  U5      nU=(       d(    [        R                  " 5       R                  [        5      U l        U=(       dB    [        R                  " U R                  [        5      [        SS9-   R                  [        5      U l        U(       d?  U(       a8  U R                  R                  SU R                  < SU R                  < 35        OFU(       a?  U(       d8  U R                  R                  SU R                  < SU R                  < S35        [!        S/ 5      U l        0 U l        0 U l        g	)
z
:param str | datetime | date start: start date (default today)             eg. start="2025-11-08"
:param str | datetime | date end: end date (default `start + 7 days`)             eg. end="2025-11-08"
:param session: requests.Session object, optional
)session   )dayszFIncomplete boundary: did not provide `start`, using today self._start=z to self._end=z>Incomplete boundary: did not provide `end`, using self._start=z: +7 days from self._startorN)r   _loggerr	   r}   r   _data_parse_date_paramr   nowstrftimeDATE_STR_FORMAT_startstrptimer   _enddebugr   _most_active_qy_cache_request_body	calendars)r   startendr}   r   r   s         r    r!   Calendars.__init__   s/    %+')#G4
''.%%c*H 7 7 H{X..t{{OLy^_O``jjkz{	LL!h\`\g\g[iixnrnwnwmyz{3LL!`TXT_T_Saapfjfofoeq  rL   M  N.;D".E#% 24r#   c                N    U(       d  g[        U5      R                  [        5      $ )N )r   r   r   )r   _dates     r    r   Calendars._parse_date_param   s    !%(11/BBr#   c                   U[         ;  a  [        SU 35      eSSS.nSU[         U   S   [         U   S   [        US5      UUR                  5       S	.nU R                  R                  US 5      (       aY  U(       dR  U R                  U   nX:X  a>  XR                  ;   a/  U R                  R                  S
U< S35        U R                  U   $ XpR                  U'   U R                  R                  SU< SU< 35        U R                  R                  [        XgS9n	 U	R                  5       n
U
R                  S0 5      R                  S0 5      (       a+  [        U
R                  S0 5      R                  S0 5      5      eU R                  U
5      U R                  U'   U R!                  U5      $ ! [        R                   a#    U R                  R                  U S35        0 n
 Nf = f)NzUnknown calendar type: zen-USUS)langregionDESCrN   rO   d   )sortTypeentityIdTyperN   rO   sizeoffsetqueryzGetting calendar_type=z from local cachezFetching calendar_type=z with limit=)paramsbodyz: Failed to retrieve calendar.financeerror)PREDEFINED_CALENDARSr   minr.   r   getr   r   r   r   post_CALENDAR_URL_jsonJSONDecodeErrorr   
_create_df_cleanup_df)r   calendar_typer   limitr   forcer   r   
cache_bodyresponse	json_datas              r    	_get_dataCalendars._get_data   s     44 7GHH!T2)-m<[I1-@QsO]]_
 ##''t<<U11-@J!m~~&E""%<m-==N#OP~~m4426  /5}&6mUHEF!ZZ__^F_V	 I ==B'++GR88immIr:>>wKLL(,	(B}%.. ## 	LL-0NOPI	s   F/ /4G&%G&c                    / nUS   S   S   S   S   S    H2  nUR                  US   5        US   S:X  d  M"  US   S	:X  d  M-  S
US'   M4     US   S   S   S   S   S   n[        R                  " XBS9$ )Nr   resultr   	documentscolumnslabelrJ   typeSTRINGTimingrows)r   )r%   pd	DataFrame)r   r   r   colr   s        r    r   Calendars._create_df  s    Y'1!4[A!DYOCNN3w<(7|11c&kX6M& P #H-a0=a@H||D22r#   c                   [         U   nU R                  U   nUR                  (       a  U$ US   nU(       a3  X4   R                  S5      R	                  S[
        R                  5      X4'   UR                  US   SS9  US   R                  5        H  u  pVUR                  XV0SS9  M     US	    H  n[        R                  " X7   5      X7'   M     U$ )
NrP   float64g        rR   T)inplacerS   )r   r   rQ   )r   r   emptyastypereplacenpnan	set_indexitemsrenamer   to_datetime)r   r   
predef_caldfrP   rename_from	rename_todatetime_cols           r    r   Calendars._cleanup_df  s    />
>>-888I $J/<..y9AA#rvvNBL 	Z
+T:&0&;&A&A&C"KII{6IE 'D '7L!~~b.>?B 8 	r#   c                   U R                   R                  (       d  U(       d  U R                   $ U R                  R                  S5         [	        SSS9nUR                  S0 /5      n[        S/ 5      U l         U Hu  n[        U5      [        La  M  UR                  SS	5      nUR                  S
S5      nU(       d  MD  Ub  Xq:  d  MN  U R                   R                  [        SSU/5      5        Mw     U R                   $ ! [
        R                   a*    U R                  R                  S5        U R                   s $ f = f)a@  
Retrieve tickers from YF, converts them into operands accepted by YF.
Saves the operands in self._most_active_qy.
Will not re-query if already populated.

Used for earnings calendar optional filter.

:param force: if True, will re-query even if operands already exist
:return: list of operands for active traded stocks
z.Fetching 200 most_active for earnings calendarMOST_ACTIVES   )r   countz&Failed to retrieve most active stocks.quotesr   symbolr   	marketCapr   eqrA   )r   r*   r   r   r   r   	HTTPErrorr   r   r   r   r7   r%   )r   _market_capr   json_rawrawstockrA   t_market_caps           r    _get_most_active_operands#Calendars._get_most_active_operands&  s    ##,,U'''KL	(#.DH
 ll8bT*,T26EE{$&YYx,F 99[!4Lv;.,2M$$++M$6@R,ST  #### ## 	(LLGH'''	(s   
D   ;D>=D>c           
     J   U R                  U5      nU R                  U5      nU(       a  U(       a  U(       a!  U(       d  [        R                  " S[        SS9  [	        S[	        SSU=(       d    U R
                  /5      [	        SSU=(       d    U R                  /5      /5      $ )zv
Get startdatetime operands for start/end dates.
If no dates passed, defaults to internal date set on initialization.
pWhen prividing custom `start` and `end` parameters, you may want to specify both, to avoid unexpected behaviour.   
stacklevelandgterD   lte)r   warningswarnUserWarningr   r   r   )r   r   r   r   r   s        r    _get_startdatetime_operators&Calendars._get_startdatetime_operatorsN  s    
 ''.%%c*#3uMM C eov7L%MNeot7Htyy%IJ
 	
r#   c                   U R                  U5      nU R                  U5      n	U(       a  U(       a  U(       a!  U(       d  [        R                  " S[        SS9  [	        S[	        SSS/5      [	        S[	        SS	S
/5      [	        SS	S/5      /5      [	        SSU=(       d    U R
                  /5      [	        SSU	=(       d    U R                  /5      /5      n
UbA  US:  a  [        R                  " SU S3[        SS9  U
R                  [	        SSU/5      5        U(       a'  U(       d   U
R                  U R                  U5      5        U R                  SU
UUUS9$ )a  
Retrieve earnings calendar from YF as a DataFrame.
Will re-query every time it is called, overwriting previous data.

:param market_cap: market cap cutoff in USD, default None
:param filter_most_active: will filter for actively traded stocks (default True)
:param str | datetime | date start: overwrite start date (default set by __init__)             eg. start="2025-11-08"
:param str | datetime | date end: overwrite end date (default set by __init__)             eg. end="2025-11-08"
:param limit: maximum number of results to return (YF caps at 100)
:param offset: offsets the results for pagination. YF default 0
:param force: if True, will re-query even if cache already exists
:return: DataFrame with earnings calendar
r   r   r   r   r   r   usr   	eventtypeEADERAr   rD   r   i zmarket_cap z, is very low, did you mean to set it higher?r@   ru   r   r   r   r   r   )
r   r   r   r   r   r   r   r%   r   r   )r   
market_capfilter_most_activer   r   r   r   r   r   r   r   s              r    get_earnings_calendarCalendars.get_earnings_calendarf  sS   4 ''.%%c*#3uMM C dXt$45%d[%,@A%d[%,@A eov7L%MNeot7Htyy%IJ
  !J&!*-YZ 
 LLu/BJ.OPQfLL77
CD~~'  
 	
r#   c                (   U R                  U5      nU R                  U5      nU(       a  U(       a  U(       a!  U(       d  [        R                  " S[        SS9  [	        S[	        SSU=(       d    U R
                  U=(       d    U R                  /5      [	        SSU=(       d    U R
                  U=(       d    U R                  /5      [	        SSU=(       d    U R
                  U=(       d    U R                  /5      /5      nU R                  S	UUUUS
9$ )a  
Retrieve IPOs calendar from YF as a Dataframe.

:param str | datetime | date start: overwrite start date (default set by __init__)             eg. start="2025-11-08"
:param str | datetime | date end: overwrite end date (default set by __init__)             eg. end="2025-11-08"
:param limit: maximum number of results to return (YF caps at 100)
:param offset: offsets the results for pagination. YF default 0
:param force: if True, will re-query even if cache already exists
:return: DataFrame with IPOs calendar
r   r   r   r   gteltrD   rU   rV   rv   r   )r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   s	            r    get_ipo_info_calendarCalendars.get_ipo_info_calendar  s      ''.%%c*#3uMM C g9N4;;PTPaX\XaXa'bcgf6KTM^UYU^U^'_`gv7LdN_VZV_V_'`a
 ~~$  
 	
r#   c                F    U R                  SU R                  X5      UUUS9$ )a  
Retrieve Economic Events calendar from YF as a DataFrame.

:param str | datetime | date start: overwrite start date (default set by __init__)             eg. start="2025-11-08"
:param str | datetime | date end: overwrite end date (default set by __init__)             eg. end="2025-11-08"
:param limit: maximum number of results to return (YF caps at 100)
:param offset: offsets the results for pagination. YF default 0
:param force: if True, will re-query even if cache already exists
:return: DataFrame with Economic Events calendar
rw   r   r   r   r   r   r   r   r   r   s         r    get_economic_events_calendar&Calendars.get_economic_events_calendar  s4      ~~*33E?  
 	
r#   c                F    U R                  SU R                  X5      UUUS9$ )a  
Retrieve Splits calendar from YF as a DataFrame.

:param str | datetime | date start: overwrite start date (default set by __init__)             eg. start="2025-11-08"
:param str | datetime | date end: overwrite end date (default set by __init__)             eg. end="2025-11-08"
:param limit: maximum number of results to return (YF caps at 100)
:param offset: offsets the results for pagination. YF default 0
:param force: if True, will re-query even if cache already exists
:return: DataFrame with Splits calendar
rx   r   r  r  s         r    get_splits_calendarCalendars.get_splits_calendar  s4      ~~"33E?  
 	
r#   c                `    SU R                   ;   a  U R                   S   $ U R                  5       $ )z(Earnings calendar with default settings.ru   )r   r   r)   s    r    earnings_calendarCalendars.earnings_calendar	  s.     DNN*>>-00))++r#   c                `    SU R                   ;   a  U R                   S   $ U R                  5       $ )z$IPOs calendar with default settings.rv   )r   r   r)   s    r    ipo_info_calendarCalendars.ipo_info_calendar  s.     '>>*--))++r#   c                `    SU R                   ;   a  U R                   S   $ U R                  5       $ )z/Economic events calendar with default settings.rw   )r   r  r)   s    r    economic_events_calendar"Calendars.economic_events_calendar  s/     t~~->>"2330022r#   c                `    SU R                   ;   a  U R                   S   $ U R                  5       $ )z&Splits calendar with default settings.rx   )r   r  r)   s    r    splits_calendarCalendars.splits_calendar  s.     t~~%>>(++''))r#   )r   r   r   r   r   r   r   r}   )NNN)r   $Optional[Union[str, datetime, date]]r   r  r}   zOptional[Session])r   z)Optional[Union[str, datetime, date, int]]r4   r3   )   r   F)r   r3   r   r   r4   pd.DataFrame)r   r7   r4   r  )r   r3   r4   r  )F)r   Optional[float]r4   r   )NN)r4   r   )NTNNr  r   F)r   r  r   r6   r4   r  )NNr  r   F)r4   r  )r8   r9   r:   r;   r<   r!   r   r   r   r   r   r   r   r   r   r  r  r=   r	  r  r  r  r>   r?   r#   r    rz   rz      s   	 7;48%)	535 25 #	5BC SX'/ '/)6'/	'/R
3* 27%$*%$	%$ %$N
0  '+#'D
#D
 !D
 
D
 D
L >C'
	'
 '
R >C
	
 
. >C
	
 
2 , , , , 3 3 * *r#   rz   )%
__future__r   r   typingr   r   r   r   r   r   numpyr   requestsr	   r
   r   pandasr   r   r   r   constr   utilsr   r   r   screenerr   datar   r   r   r   r   r   rz   r?   r#   r    <module>r!     s   "  3 3   2 2  . .  F F   #:
 :
z !>!:; )

 E,-)%%0
!. %
 B@!:
'0 %	
 V&$",#%	
. %
 &<
IU pz* z*r#   